Tải bản đầy đủ (.doc) (32 trang)

Báo cáo thực hành Phương pháp tính (Ngành Công nghệ thông tin)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (428.36 KB, 32 trang )

Báo cáo Thực hành Phương pháp tính Nhóm 11B

GIỚI THIỆU

Phương pháp tính là mơn học trang bị cho sinh viên các kiến thức cơ bản về phương
pháp tính trong kỹ thuật. Trên nền tảng các kiến thức của giải tích, đại số và hình
học, học phần này cung cấp các phương pháp giải gần đúng hệ phương trình tuyến
tính, phương trình và hệ phương trình đại số, các phương pháp số cho phương trình
vi phân và phương trình đạo hàm riêng trong kỹ thuật. Trọng tâm của học phần này
là các phương pháp sai phân và phương pháp phần tử hữu hạn cho các phương trình
đạo hàm riêng giá trị đầu và giá trị biên. Xây dựng và đánh giá sai số cho các lược
đồ sai phân, lược đồ cho các phần tử hữu hạn.
Học phần thực hành nhằm vận dụng lí thuyết về mơn Phương pháp tính để giải quyết
các bài tồn cụ thể. Phân tích, lập trình để giải các bài tốn về sai số, tính giá trị các
hàm số, giải gần đúng phương trình đại số, phương trình siêu việt, giải hệ phương
trình đại số tuyến tính, tìm giá trị riêng, vecto riêng.

Sinh viên: Trần Quốc Hoàn Lớp 10T1 1

Báo cáo Thực hành Phương pháp tính Nhóm 11B

I. Tính giá trị hàm

1. Viết chương trình tính giá trị đa thức p(x) bậc n tổng quát theo sơ đồ Hoocner
1.1. Thuật toán

- Nhập : bậc đa thức n, giá trị cần tính c, các hệ số ai (i= 0, n )

- Xử lý: Gán p = a0

Lặp i = 1→ n : p = p * c + ai



- Xuất kết quả: p

1.2. Các hàm
-Hàm nhập (đọc dữ liệu từ file):
void nhapfile()
{

int i;
FILE *f;
f=fopen("Hoonner1.txt","r");
fscanf(f,"%d",&n);
printf("Da thuc bac %d\n",n);
printf("Cac he so cua da thuc:\n");
for(i=0;i<=n;i++)
{
fscanf(f,"%f",&A[i]);
printf("%8.3f",A[i]);
}
fscanf(f,"%f",&c);
printf("\nGia tri can tinh: %.3f\n",c);
fclose(f);
}

-Hàm tính p(x):
float Hoocner(float A[],float c,int n)
{

int i;
float p;

p=A[0];
for(i=1;i<=n;i++) p=p*c+A[i];
return p;
}

Sinh viên: Trần Quốc Hoàn Lớp 10T1 2

Báo cáo Thực hành Phương pháp tính Nhóm 11B

1.3. Chương trình
Hoonner1.cpp
1.4. Kết quả

2. Viết chương trình thực hiện các cơng việc sau:
 Khai báo (định nghĩa) hàm tính giá trị đa thức p(x) bậc n tổng quát theo sơ đồ
Hoocner
 Nhập vào đa thức p(x) bậc n và 2 giá trị thực y, z. Tính:
 S1 = p(y) + p(z)
 S2 = p(1) + p(2) + … + p(n)
 Nhập vào 2 đa thức pn(x) bậc n, pm(y) bậc m và giá trị c. Tính pn(c) + pm(c)
2.1. Thuật toán

-Nhập:

+bậc đa thức n, các giá trị thực cần tính y,z, các hệ số ai (i= 0, n )
+bậc đa thức n,m, giá trị thực cần tính c, các hệ số ai, bi (i= 0, n )
-Xử lí:
+Sử dụng hàm tính p(x) ở trên để tính giá trị hàm
+Tính S1=p(y)+p(z)
+Tính S2=p(1) + p(2) + … + p(n)


s2=0
Lặp i=1→n: s2=s2+p(i)
+Tính S3=pn(c)+pm(c)

Sinh viên: Trần Quốc Hồn Lớp 10T1 3

Báo cáo Thực hành Phương pháp tính Nhóm 11B

-Xuất: S1, S2, S3
2.2. Các hàm
-Hàm nhập (đọc dữ liệu từ file):
void nhapfile()
{

int i;
FILE *f;
f=fopen("Hoocner2.txt","r");
printf("\INPUT\n");
fscanf(f,"%d",&n);
printf("\nDa thuc P(x) bac %d\n",n);
printf("Cac he so cua da thuc:\n");
for(i=0;i<=n;i++)
{
fscanf(f,"%f",&A[i]);
printf("%8.3f",A[i]);
}
fscanf(f,"%f%f",&y,&z);
printf("\nHai gia tri y,z can tinh: %8.3f va %8.3f\
n",y,z);

fscanf(f,"%d",&n1);
printf("\nDa thuc P1(x) bac %d\n",n1);
printf("Cac he so cua da thuc:\n");
for(i=0;i<=n1;i++)
{
fscanf(f,"%f",&P1[i]);
printf("%8.3f",P1[i]);
}
fscanf(f,"%d",&n2);
printf("\nDa thuc P2(x) bac %d\n",n2);
printf("Cac he so cua da thuc:\n");

Sinh viên: Trần Quốc Hoàn Lớp 10T1 4

Báo cáo Thực hành Phương pháp tính Nhóm 11B

for(i=0;i<=n2;i++)
{
fscanf(f,"%f",&P2[i]);
printf("%8.3f",P2[i]);
}
fscanf(f,"%f",&c);
printf("\nGia tri c can tinh: %8.3f\n",c);
fclose(f);
}

-Hàm tính p(x): ở câu trên

-Hàm tính S1:
float S1()

{

float s1=0;
s1=Hoocner(A,y,n)+Hoocner(A,z,n);
return s1;
}

-Hàm tính S2:
float S2()
{

float s2=0;
int i;
for(i=1;i<=n;i++)
s2=s2+Hoocner(A,i,n);
return s2;
}

-Hàm tính S3:

Sinh viên: Trần Quốc Hoàn Lớp 10T1 5

Báo cáo Thực hành Phương pháp tính Nhóm 11B

float S3()
{

float s3=0;
s3=Hoocner(P1,c,n1)+Hoocner(P2,c,n2);
return s3;

}

2.3. Chương trình

Hoocner2.cpp

2.4. Kết quả

3. Cho đa thức p(x) bậc n, viết chương trình xác định các hệ số của đa thức
p(y+c) theo sơ đồ Hoocner tổng quát.
3.1. Thuật toán
- Nhập : n, c, ai (i = 0, n )
- Lặp k = n → 1

Lặp i = 1 → k : ai = ai-1 * c + ai

Sinh viên: Trần Quốc Hoàn Lớp 10T1 6

Báo cáo Thực hành Phương pháp tính Nhóm 11B

- Xuất : ai (i = 0, n )
3.2. Các hàm
-Hàm nhập (đọc dữ liệu từ file):
void nhapfile()
{

int i;
FILE *f;
f=fopen("Hoocnertongquat.txt","r");
fscanf(f,"%d",&n);

printf("\nDa thuc bac %d\n",n);
printf("Cac he so cua da thuc:\n");
for(i=0;i<=n;i++)
{
fscanf(f,"%f",&A[i]);
printf("%8.3f",A[i]);
}
fscanf(f,"%f",&c);
printf("\nGia tri c can tinh: %.3f\n",c);
fclose(f);
}

-Hàm tính hệ số đa thức P(y+c):
void Hoocnertongquat(float A[],float c,int n)
{

int i,k;
for(k=n;k>=1;k--)

Sinh viên: Trần Quốc Hoàn Lớp 10T1 7

Báo cáo Thực hành Phương pháp tính Nhóm 11B

for(i=1;i<=k;i++) A[i]=A[i-1]*c+A[i];
printf("He so cua da thuc P(y+%.3f) la:\n",c);
for(i=0;i<=n;i++) printf("%8.3f",A[i]);
}

3.3. Chương trình
Hoocnertongquat.cpp


3.4. Kết quả

Sinh viên: Trần Quốc Hoàn Lớp 10T1 8

Báo cáo Thực hành Phương pháp tính Nhóm 11B

II. Giải gần đúng phương trình

Để tìm nghiệm gần đúng của phương trình f(x) = 0 ta tiến hành qua 2 bước:
- Tách nghiệm: xét tính chất nghiệm của phương trình, phương trình có
nghiệm hay khơng, có bao nhiêu nghiệm, các khoảng chứa nghiệm nếu có. Đối với
bước này, ta có thể dùng phương pháp đồ thị, kết hợp với các định lý mà tốn học
hỗ trợ.
- Chính xác hoá nghiệm: thu hẹp dần khoảng chứa nghiệm để hội tụ được đến
giá trị nghiệm gần đúng với độ chính xác cho phép. Trong bước này ta có thể áp
dụng một trong các phương pháp:
+ Phương pháp chia đôi
+ Phương pháp lặp
+ Phương pháp tiếp tuyến
+ Phương pháp dây cung

1. Viết chương trình tìm nghiệm gần đúng cho phương trình có dạng tổng qt
f(x) = a0xn + a1xn-1 + … + an-1x + an = 0 bằng phương pháp chia đơi

1.1 Thuật tốn

- Khai báo f(x) là hàm tính giá trị đa thức bậc n

- Nhập khoảng nghiệm a, b sao cho f(a)<0 và f(b)>0


- Lặp
c = (a+b)/2

nếu f(c) > 0 b = c

ngược lại a = c

trong khi (f(c)>ε ) /*| a – b| >ε và f(c) != 0 */
- Xuất nghiệm: c

1.2. Các hàm

-Hàm nhập (đọc dữ liệu từ file):
void nhapfile()
{

int i;
FILE *f;
f=fopen("Chiadoi.txt","r");

Sinh viên: Trần Quốc Hoàn Lớp 10T1 9

Báo cáo Thực hành Phương pháp tính Nhóm 11B

fscanf(f,"%d",&n);
printf("Da thuc f(x) bac %d\n",n);
printf("Cac he so cua da thuc:\n");
for(i=0;i<=n;i++)
{

fscanf(f,"%f",&A[i]);
printf("%8.3f",A[i]);
}
fscanf(f,"%f%f",&a,&b);
printf("\nKhoang nghiem (a,b)=(%.3f;%.3f)",a,b);
fclose(f);
}

-Hàm tính giá trị f(x): p=p*c+A[i];
float f(float c)
{

int i;
float p;
p=A[0];
for(i=1;i<=n;i++)
return p;
}

-Hàm giải gần đúng phương trình bằng phương pháp chia đơi:
float chiadoi()
{

if(f(a)*f(b)<0)
do
{

c=(a+b)/2;
if(f(c)*f(b)>0)


b=c;
else

a=c;
}
while(f(c)>0.001);
return c;
}

1.3. Chương trình

Sinh viên: Trần Quốc Hoàn Lớp 10T1 10

Báo cáo Thực hành Phương pháp tính Nhóm 11B
Chiadoi.cpp
1.4. Kết quả

2. Viết chương trình tìm nghiệm gần đúng cho phương trình có dạng tổng qt:
f(x) = a0xn + a1xn-1 + … + an-1x + an = 0 bằng phương pháp dây cung
2.1. Thuật toán
- Khai báo hàm f(x) là hàm tính giá trị đa thức bậc n
- Nhập khoảng nghiệm a, b
- Tính x = a – (b-a)f(a) / (f(b)-f(a))
- Nếu f(x)*f(a) <0

Lặp b = x
x = a – (b-a)f(a) / (f(b)-f(a))

trong khi x - b> ε
Ngược lại


Lặp a = x
x = a – (b-a)f(a) / (f(b)-f(a))

trong khi x - a> ε
- Xuất nghiệm: x
2.2. Các hàm
-Hàm nhập (đọc dữ liệu từ file):
void nhapfile()

Sinh viên: Trần Quốc Hoàn Lớp 10T1 11

Báo cáo Thực hành Phương pháp tính Nhóm 11B

{
int i;
FILE *f;
f=fopen("Daycung.txt","r");
fscanf(f,"%d",&n);
printf("Da thuc f(x) bac %d\n",n);
printf("Cac he so cua da thuc:\n");
for(i=0;i<=n;i++)
{
fscanf(f,"%f",&A[i]);
printf("%8.3f",A[i]);
}
fscanf(f,"%f%f",&a,&b);
printf("\nKhoang nghiem (a;b)=(%.3f;%.3f)",a,b);
fclose(f);


}

-Hàm tính f(x): p=p*c+A[i];
float f(float c)
{

int i;
float p;
p=A[0];
for(i=1;i<=n;i++)
return p;
}

-Hàm giải gần đúng phương trình bằng phương pháp dây cung:
float daycung()
{

x=a-(b-a)*f(a)/(f(b)-f(a));

Sinh viên: Trần Quốc Hoàn Lớp 10T1 12

Báo cáo Thực hành Phương pháp tính Nhóm 11B

if(f(x)*f(a)<0)
do
{
b=x;
x=a-(b-a)*f(a)/(f(b)-f(a));
}
while(fabs(x-b)>0.0001);


else
do
{
a=x;
x=a-(b-a)*f(a)/(f(b)-f(a));
}
while(fabs(x-a)>0.0001);

return x;
}
2.3. Chương trình

Daycung.cpp

2.4. Kết quả

Sinh viên: Trần Quốc Hồn Lớp 10T1 13

Báo cáo Thực hành Phương pháp tính Nhóm 11B

3. Viết chương trình tìm nghiệm cho phương trình ex - 10x + 7 = 0 (có thể thay
phương trình khác) bằng phương pháp tiếp tuyến.
3.1. Thuật toán
- Khai báo hàm f(x), hàm fdh(x) tính f’(x)
- Nhập xấp xỉ nghiệm ban đầu x ϵ khoảng nghiệm a,b
- Lặp y= x

x = y – f(y)/fdh(y)
trong khi x - y>ε

- Xuất nghiệm: x (hoặc y)
3.2. Các hàm
-Hàm nhập (đọc dữ liệu từ file):
void nhapfile()
{

FILE *f;
f=fopen("Tieptuyen.txt","r");
fscanf(f,"%f",&x);
printf("Xap xi nghiem ban dau x=%.3f",x);
fclose(f);
}

-Hàm tính f(x):
float f(float x)
{

float f;
f=pow(2.718,x)-10*x+7;
return f;
}

Sinh viên: Trần Quốc Hoàn Lớp 10T1 14

Báo cáo Thực hành Phương pháp tính Nhóm 11B

-Hàm tính fdh(x):
float fdh(float x)
{


float fdh;
fdh=pow(2.718,x)-10;
return fdh;
}

-Hàm giải gần đúng nghiệm của phương trình bằng phương pháp tiếp tuyến:
float tieptuyen(float x)
{

do
{

y=x;
x=y-f(y)/fdh(y);
}
while(fabs(x-y)>0.001);
return x;
}
3.3. Chương trình

Tieptuyen.cpp

3.4. Kết quả

Sinh viên: Trần Quốc Hoàn Lớp 10T1 15

Báo cáo Thực hành Phương pháp tính Nhóm 11B

Sinh viên: Trần Quốc Hoàn Lớp 10T1 16


Báo cáo Thực hành Phương pháp tính Nhóm 11B

III. Giải hệ phương trình đại số tuyến tính

1. Viết chương trình giải hệ phương trình đại số tuyến tính bằng phương pháp
Krame

1.1. Thuật tốn
- Khai báo hàm Det tính định thức ma trận vuông cấp n bằng cách biến đổi về ma
trận tam giác trên:
+Lặp i = 1→n -1

Tìm j sao cho aji # 0 , j = i+1→n
Nếu aii = 0

Nếu j<=n thì hốn đổi dòng i và dòng j cho nhau
ngược lại thì kết thúc (phương trình vơ nghiệm)
+Lặp j = i + 1→ n
m = -aji /aii
Lặp k = i→n +1 ajk = ajk + aik * m

- Nhập n, aij (i,j=1, n ) xi = di/d }
- d = Det (A)
- Xét: + d = 0

+ d # 0 {di = Dt(Ai) ;

1.2. Các hàm

-Hàm nhập (đọc dữ liệu từ file):


void nhapfile()

{

int i,j;

FILE *f;

f=fopen("Krame.txt","r");

fscanf(f,"%d",&n);

printf("Ma tran ban dau:\n");

for(i=1;i<=n;i++)

{

for(j=1;j<=n+1;j++)

{

fscanf(f,"%f",&a[i][j]);

printf("%8.3f",a[i][j]);

Sinh viên: Trần Quốc Hoàn Lớp 10T1 17

Báo cáo Thực hành Phương pháp tính Nhóm 11B

18
}
printf("\n");
}
fclose(f);
}

-Hàm hoán đổi hai dòng trong một ma trận:
void doidong(int i1,int i2)
{

int j;
float t;
if(i1<=n&&i2<=n&&i1!=i2)
for (j=1;j<=n+1;j++)
t=a[i1][j];
a[i1][j]=a[i2][j];
a[i2][j]=t;
}

-Hàm hoán đổi hai cột trong một ma trận:
void doicot(int j1, int j2)
{

int i;
float t;
if(j1<=n+1&&j2<=n+1&&j1!=j2)
{

for(i=1;i<=n;i++)

{

t=a[i][j1];
a[i][j1]=a[i][j2];
a[i][j2]=t;
}

Sinh viên: Trần Quốc Hoàn Lớp 10T1

Báo cáo Thực hành Phương pháp tính Nhóm 11B

}
}

Hàm tính định thức của ma trận:
float det()

{
int i,j,k;

float m,d=1;
for(i=1;i<=n;i++)

for(j=1;j<=n;j++)
A[i][j]=a[i][j];

for (i=1;i{

if (A[i][i]==0)

{

for (j=i+1;j<=n;j++)
if(A[j][i]!=0) break;

doidong(i,j);
if (j>n) return 0.0;

}
for (j=i+1;j<=n;j++)

{
m=-A[j][i]/A[i][i];

[k]*m; for(k=i;k<=n+1;k++) A[j][k]=A[j][k]+A[i]

}
}

for(i=1;i<=n;i++)
d=d*A[i][i];

return d;
}

-Hàm giải gần đúng hệ phương trình bằng phương pháp Krame:
void Krame()
{

int i;

float D;
D=det();
if(D==0)
printf("He phuong trinh vo nghiem");

Sinh viên: Trần Quốc Hoàn Lớp 10T1 19

Báo cáo Thực hành Phương pháp tính Nhóm 11B

else
{

for(i=1;i<=n;i++)
{

doicot(i,n+1);
d[i]=det();
x[i]=d[i]/D;
doicot(i,n+1);//tra ve ma tran ban dau
}
//xuat nghiem
printf("\nNghiem cua he phuong trinh la:\n");
for(i=1;i<=n;i++)
printf("%8.3f",x[i]);
}
}

1.3. Chương trình

Krame.cpp


1.4. Kết quả

2. Viết chương trình giải hệ phương trình đại số tuyến tính bằng phương pháp
Gauss

2.1. Thuật toán j = i+1→n
- Nhập n, aij () (nhập trực tiếp hoặc từ file)
- Biến đổi A A’ (ma trận tam giác trên)
+Lặp i = 1→n -1

Tìm j sao cho aji # 0 ,
Nếu aii = 0

Sinh viên: Trần Quốc Hoàn Lớp 10T1 20


×