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