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

Báo cáo thực hành phương pháp tính ppt

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 (157.61 KB, 29 trang )

Báo cáo thực hành
phương pháp tính
MỤC LỤC
Báo cáo thực hành phương pháp nh 1
MỤC LỤC 2
CHƯƠNG III: TÍNH GIÁ TRỊ HÀM
Bài 3: Khai báo ( định nghĩa) hàm trong C để tính giá trị đa thức bậc n tổng quát theo sơ
đồ Hoocner.
Thuật toán :
-Nhập vào: n,c, các hệ số a
i
(i= )
-Xử lý: Gán p=a
0
Lặp i=1n: p=p*c+a
i
-Xuất kết quả: p
Chương trình:
#include<stdio.h>
#include<conio.h>
#define MAX 20
/*********************************************/
float hoocner(float A[],int x,int c);
/*********************************************/
void main()
{
float A[MAX],c;
int n;
do
{
printf("\Nhap vao bac hamso :");


scanf("%d",&n);
}
while(n<=0||n>=MAX);
for(int i=0;i<=n;i++)
{
printf("\nNhap vao heso A[%d]= ",i); scanf("%f",&A[i]);
}
printf("\nNhap vao giatri bien x=");
scanf("%f",&c);
printf("\nGiatri ham tai x=%7.3f la %7.3f",c,hoocner(A,n,c));
getch();
}
/*********************************************/
float hoocner(float A[],int n, int c)
{
int i;
float s=0;
for(i=0;i<=n;i++)
s=s*c+A[i];
return s;
}
/*********************************************/
Bài 4: Viết chương trình ( có sử dụng hàm ở câu 3) nhập vào 2 giá trị a,b.
Tính p(a) +p(b)
Thuật toán:
Sử dụng hàm đã viết ở câu 3 để làm nhưng ở đây ta gọi hàm 2 lần.
Chương trình:
#include<stdio.h>
#include<conio.h>
#define MAX 20

/*********************************************/
float hoocner(float A[],int x,int c);
/*********************************************/
void main()
{
float A[MAX],a,b;
int n;
do
{
printf("\Nhap vao bac ham so :");
scanf("%d",&n);
}
while(n<=0||n>=MAX);
for(int i=0;i<=n;i++)
{
printf("\nNhap vao heso A[%d]= ",i); scanf("%f",&A[i]);
}
printf("\nNhap vao giatri bien a=");
scanf("%f",&a);
printf("\nNhap vao giatri bien b=");
scanf("%f",&b);
printf("\nGiatri ham p(%f)+p(%f) la :%7.3f",a,b,hoocner(A,n,a)+hoocner(A,n,b));
getch();
}
float hoocner(float A[],int n, int c)
{
int i;
float s=0;
for(i=0;i<=n;i++)
s=s*c+A[i];

return s;
}
/*********************************************/
Bài 5:Viết chương trình nhập vào 2 đa thức pn (x) bậc n , pm (x) bậc m và một giá trị c.
Tính pn (x) + pm (x)
Thuật toán:
- Nhập bậc của hai đa thức n,m
- Nhập hệ số của hai đa thức bậc n, m
- Nhập c
- In ra hoocner( A, n, c) + hoocner( B,m,c ) // với hàm hoocner được sử dụng ở câu 3
Chương trình :
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define MAX 20
/*************************************************/
float hoocner(float A[],int n,int m,float c);
void nhap(float A[],int n);
/*************************************************/
void main()
{
float A[MAX],B[MAX],x,a,b;
int n,m,chon;
printf("\n Nhap bac n cua pt1 :");
scanf("%d",&n);
nhap(A,n);
printf("\n Nhap bac m cua pt1 :");
scanf("%d",&m);
nhap(B,m);
printf("\n Nhap 1 giatri c=");

scanf("%f",&x);
printf("\n Giatri Pn©+Pm© =%5.2f",
hoocner(A,n,n,x)+hoocner(B,m,m,x));
getch();
}
/*************************************************/
float hoocner(float A[],int n,int m, float c)
{ //Tra ve giatri
int i;
float s=0;
for(i=n-m;i<=n;i++)
s=s*c+A[i];
return s;
}
/*************************************************/
void nhap(float A[],int n)
{
int i;
for(i=0;i<=n;i++)
{
printf("\n Heso A[%d]=",i);
scanf("%f",&A[i]);
}
}
/*************************************************/
Bài 6: 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.
Thuật toán :
- Nhập n, c, hệ số của đa thức a
i

(i= )
- hoocnertq (A, n, c)
Lặp i=n  1
Lặp j=1  i
A
i
=A
i-1
*c+A
i
- In ra đa thức p(y+c)
Chương trình :
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define MAX 20
/*************************************************/
void hoocnertq(float A[],int n,float c);
void inra(float A[],int n);
void nhap(float A[],int n);
/*************************************************/
void main()
{
float A[MAX], x,a,b;
int n,m,chon;
printf("\n Nhap vao bac cua dathuc n=");
scanf("%d",&n);
nhap(A,n);
printf("\n Nhap vao giatri c=");
scanf("%f",&x);

hoocnertq(A,n,x);
printf("\n Phuongtrinh P(x+%5.2f)=",x);
inra(A,n);
getch();
}
/*************************************************/
void hoocnertq(float A[],int n,float c)
{
int i,j;
for(i=n;i>=1;i )
for(j=1;j<=i;j++)
A[j]=A[j-1]*c+A[j];
}
/*************************************************/
void inra(float A[],int n)
{ //In ra ptrinh
int i;
for(i=0;i<=n;i++)
printf(" %c%5.2f*x^%d",(A[i]>0?'+':' '),A[i],n-i);
}
/*************************************************/
void nhap(float A[],int n)
{
int i;
for(i=0;i<=n;i++)
{
printf("\n He so A[%d]=",i);
scanf("%f",&A[i]);
}
}

/*************************************************/
Bài 7:Khai báo hàm trong C để tính giá trị các hàm ex, sinx, cosx theo khai triển
Macloranh .
Thuật toán:
Khai báo hàm : ex
- s = 0; a = 1; i = 1;
- Lặp
s+=a;
a *= x/i;
i++;
trong khi ( > eps)
- Xuất s;
Khai báo hàm : sin(x)
- n=3; s=0; a=x;
- Lặp
s+=a;
a*=(-(x*x)/(n*(n-1)));
n+=2;
trong khi |a|>eps
Khai báo hàm : cos(x)
- n=2; s=a=1;
- Lặp
a*=(-(x*x)/(n*(n-1)));
s+=a;
n+=2;
trong khi |a|>eps
Chương trình :
#include<stdio.h>
#include<conio.h>
#include<math.h>

#define MAX 20
#define eps 1e-3
/*************************************************/
float sinx(float x);
float cosx(float x);
float expx(float x);
/*************************************************/
void main()
{
float x;
int chon;
printf("\n Muon' tinh :");
printf("\n 1. Sin(x)");
printf("\n 2. Cos(x)");
printf("\n 3. e^x");
do
{
printf("\n Ban chon 1-3 :");
scanf("%d",&chon);
}
while(chon<1||chon>3);
printf("\n Nhap giatri x=");
scanf("%f",&x);
switch(chon)
{
case 1:
printf("\n Sin(%5.2f)=%5.2f",x,sinx(x)); break;
case 2:
printf("\n Cos(%5.2f)=%5.2f",x,cosx(x));
break;

case 3:
printf("\n e^%5.2f=%5.2f",x,expx(x));
break;
}
getch();
}
/*************************************************/
float sinx(float x)
{
float s,a;
int n=3; s=0;
a=x;
do{
s+=a;
a*=(-(x*x)/(n*(n-1)));
n+=2;
}while(fabs(a)>eps);
return(s);
}
/*************************************************/
float cosx(float x)
{
float s,a;
int n=2;
s=a=1;
do{
a*=(-(x*x)/(n*(n-1)));
s+=a;
n+=2;
}while(fabs(a)>eps);

return(s);
}
/*************************************************/
float expx(float x)
{
float s,a;
int n=2;
s=1;
a=x;
do{
s+=a;
a*=x/n;
n++;
}while(fabs(a)>eps);
return(s);
}
/*************************************************/
CHƯƠNG VI: GIẢI GẦN ĐÚNG PHƯƠNG
TRÌNH
Bài 7: Viết chương trình tìm nghiệm cho các dạng tổng quát :
f(x)= a0xn + a1x n-1+ + an-1 x + an = 0
a.Áp dụng phương pháp chia đôi
b.Áp dụng phương pháp dây cung
Thuật toán:
* Phương pháp chia đôi: float chiadoi(float A[],int n,float a,float b) với a, b là khoảng nghiệm.
- Lặp:
c= (a+b)/2
nếu f(b).f(a) > 0 thì a = c
không thì b = c
trong khi |a-b| >eps

* Phương pháp dây cung: float daycung(float A[],int n,float a,float b) với a, b là khoảng nghiệm.
- Lặp:
x=a-(b-a)*f(A,n,a)/(f(A,n,b)-f(A,n,a));
nếu f(x) = = 0 trả về x
ngược lại
nếu f(x).f(a)<0
lặp
b = x
tmp = f(a)
x = a - (b -a).tmp/(f(b) - tmp)
trong khi (|x-a| > eps)
ngược lại
lặp
a = x
x = a-(b-a).f(a)/(f(b)-f(a))
trong khi |x-a|>eps
Chương trình:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define MAX 20
#define eps 1e-3
/**************************************************/
float chiadoi(float A[],int n,float a,float b);
float daycung(float A[],int n,float a,float b);
float f(float A[],int n,float x);
/**************************************************/
void main()
{
float a,b,A[MAX];

int i,n;
printf("Chuongtrinh tim nghiem cua pt a(0)*x^n+a(1)*x^(n-1)+ +a(n-1)*x+a(n)=0\n");
printf("Nhap vao bac pt :");
scanf("%d",&n);
for(i=0;i<=n;i++)
{
printf("\nHeso A[%d]=",i);
scanf("%f",&A[i]);
}
Do
{
printf("Nhap vao khoang nghiem [a,b] voi'f(a)*f(b)<0:");
scanf("%f %f",&a,&b);
}
while(f(A,n,a)*f(A,n,b)>0);
printf("\n Phuong phap chia doi : nghiem= %7.3f",chiadoi(A,n,a,b));
printf("\n Phuongphap daycung : nghiem= %7.3f",daycung(A,n,a,b));
getch();
}
/**************************************************/
float f(float A[],int n,float x)
{ /*Ham` tinh' giatri dathuc*/
float s=0;
int i;
for(i=0;i<=n;i++)
s=s*x+A[i];
return s;
}
/**************************************************/
float chiadoi(float A[],int n,float a,float b)

{ /*Ham` tim` nghiem gan` dung'*/
float c;
do
{
c=(a+b)/2;
if(f(A,n,a)*f(A,n,b)>0)
a=c;
else b=c;
}
while(fabs(a-b)>eps);
return c;
}
/**************************************************/
float daycung(float A[],int n,float a,float b)
{
float x,tmp;
x=a-(b-a)*f(A,n,a)/(f(A,n,b)-f(A,n,a));
if(f(A,n,x)==0)
return x;
else
{
if(f(A,n,x)*f(A,n,a)<0)
{
do
{
b=x;
tmp=f(A,n,a);
x=a-(b-a)*tmp/(f(A,n,b)-tmp);
}
while(fabs(x-a)>eps);

}
else
{
do
{
a=x;
x=a-(b-a)*f(A,n,a)/(f(A,n,b)-f(A,n,a));
}
while(fabs(x-a)>eps);
}
}
return x;
}
Bài 8:Viết chương trình tìm nghiệm cho phương trình : ex -10x +7=0 bằng phương pháp
tiếp tuyến
Thuật toán:
Lặp
y = x;
x = y - f(y)/f’(y)
trong khi |y - x| > epsilon
Chương trình:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define eps 1e-3
/*******************************************/
float f(float x);
float fdh(float x);
/*******************************************/
void main()

{
int n;
float x,y;
printf("\n Nhap vao giatri x=");
scanf("%f",&x);
do
{
y=x;
x=y-f(y)/fdh(y);
}
while(fabs(y-x)>eps);
printf("\n Giatri nghiem la : %10.3f",y);
getch();
}
/*******************************************/
float f(float x)
{
return (exp(x)-10*x+7);
}
/*******************************************/
float fdh(float x)
{
return (exp(x)-10);
}
/*******************************************/
Bài 9: Viết chương trình tìm nghiêm cho phương trình :x
3
- x -1= 0 bằng phương pháp lặp.
Thuật toán:
- Khai báo hàm g(x)

- Nhập nghiệm gần đúng x
- Lặp
y = x
x = g(x)
trong khi | y-x| > eps
- Xuất x
Chương trình:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define eps 1e-3
float f(float x);
float lap(float x0);
/******************************************/
void main()
{
float a;
printf("\n Chuongtrinh tim nghiem pt theo pp lap");
printf("\n Nhap 1 giatri : ");
scanf("%f",&a);
printf("\n Nghiem gan dung' la: %7.3f",lap(a));
getch();
}
/******************************************/
float f(float x)
{
return(exp((1.0/3)*log(x+1)));
}
/******************************************/
float lap(float x0)

{
float tmp;
do
{
tmp=x0;
x0=f(x0);
}
while(fabs(x0-tmp)>eps);
return(tmp);
}
/******************************************/
Bài 10: Viết chương trình xác định giá trị x1, x2 theo định lý 3
Thuật toán:
- Nhập hệ số của đa thức
- Tìm m1 sao cho m1 = max{|ai|} với i=
- Tìm m2 sao cho m2 = max{|ai|} với i=
- Tìm x1=
- Tìm x2=
- Xuất x1, x2
Chương trình:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define MAX 20
void main()
{
int i,n;
float A[MAX],max;
printf("\n Nhap bac cua pt :");
scanf("%d",&n);

for(i=0;i<=n;i++)
{
printf("\n A[%d]=",i);
scanf("%f",&A[i]);
}
max=A[0];
for(i=1;i<n;i++) //Tinh x1
if(max<A[i])
max=A[i];
printf("\n x1= %7.3f",fabs(A[n])/(max+fabs(A[n])));
max=A[1];
for(i=2;i<=n;i++) //Tinh x2
if(max<A[i])
max=A[i];
printf("\n x2= %7.3f",1+max/fabs(A[0]));
getch();
}
Bài 11: Viết chương trình tìm cận trên của nghiệm dương phương trình đại số theo định lý
4.
Thuật toán:
- Nhập hàm f(x)
- Nếu a[0]>0
+ Tìm giá trị lớn nhất a = max{|ai|} với i= sao cho ai<0
+ Tìm vị trí số hạng đầu tiên đưa vào i
+ N=1+
- Xuất N
Chương trình:
#include<stdio.h>
#include<conio.h>
#include<math.h>

#include<stdlib.h>
#define MAX 20
void main()
{
int i,n;
float A[MAX],max;
printf("\n Nhap vao bac cua pt :");
scanf("%d",&n);
for(i=0;i<=n;i++)
{
printf("\n A[%d]=",i);
scanf("%f",&A[i]);
}
if(A[0]>0)
{
max=0;
for(i=1;i<=n;i++)
if(A[i]<0&&max<fabs(A[i]))
max=fabs(A[i]);
if(max==0)
{
printf("\n Ko co' heso am !");
getch();
exit(1);
}
i=1;
while(A[i]>=0)
i++;
printf("\n Can tren nghiem duong cua pt : %7.3f",1+exp((1.0/i)*log(max/A[0])));
}

else
printf("\n A[0] khong >0 !");
getch();
}
CHƯƠNG V: GIẢI HỆ PHƯƠNG TRÌNH
ĐẠI SỐ TUYẾN TÍNH
Bài 3: Viết chương trình giải hệ phương trình đại số tuyến tinh bằng phương pháp Gauss
a) Nhập dữ liệu trực tiếp
b) Nhập dữ liệu từ file
Thuật toán:
- Nhập n, a
ij
(i=
1,n
, j=
1, 1n +
)
- Biến đổi A  A’ (ma trận tma giác trên)
Lặp i=1  n-1
+ Nếu a
ij
=0
•Tìm j sao cho a
ij
#0 (j=i+1  n)
•Nếu j<=n thì hoán vị đổi dòng i và dòng j cho nhau. Ngược lại kết thúc vì dữ liệu
không hợp lệ
+ Lặp j=i+1  n
•m=-a
ji

/a
ii
•Lặp k=I  n+1 a
jk
= a
jk
*m
- Tìm nghiệm

1
1
/
n
i in ij j ii
j i
x a a x a
+
= +
 
= −
 ÷
 


Lặp i=n1
• S=0
• Lặp j= i+1n S=S+a
ij
*x
j

- Xuất nghiệm: x
i
(i=1n)
Chương trình:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
const int NMAX=10;
const double Err=0.001;
// Khai bao cac bien toan cac
float A[NMAX][NMAX],X[NMAX];
int n;
void nhap();
void input_from_file();
void cheohoa(float A[NMAX][NMAX],int n);
void xuat();
void Gauss();
/* Chuong trinh chinh */
void main()
{int tt;char key;
while(1)
{
printf("\n He Phuong trinh ");
printf("\n Moi ban nhap n.Theo ma tran de bai ban nhap n=:");
scanf("%d",&n);
printf("\n 1.Nhap du lieu truc tiep ");
printf("\n 2.Nhap du lieu tu file ");
do
{printf("\n Ban chon:");
scanf("%d",&tt);}

while(tt!=1&&tt!=2);
switch(tt)
{
case 1: nhap();
Gauss();
break;
case 2: input_from_file();
Gauss();
break;
}
printf("\n ");
printf("\n Xuat nghiem ra man hinh de xem :");
xuat();
fflush(stdin);
printf("\n Ban co muon tiep tuc khong (c/k)?\n");
scanf("%c",&key);
if(key!='c') break;
}
}
/* Cac ham con */
// Dinh nghia ham nhap du lieu tu file
void input_from_file()
{
int i=1,j=1;
FILE *fp;
fp=fopen("INPUT.txt","rt");
if(fp==NULL)
{
printf("\n Can't open this file.Please try again.");
exit(1);

}
else
{
while(!feof(fp))
{
fscanf(fp,"%f",&A[i][j]);
if(j==n+1)
{
i++;
j=1;
}
else
j++;
}
}
fclose(fp);
}
//ham nhap du lieu truc tiep
void nhap()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++)
{printf("\nNhap vao a[%d][%d]=",i,j);
scanf("%f",&A[i][j]);
}
}
//ham xuat ket qua ra man hinh
void xuat()
{
for(int i=1;i<=n;i++)

printf("\nX[%d]=%f",i,X[i]);
}
//ham gauss
void Gauss()
{
int i,k;
float S;
// Step 1: Cheo hoa ma tran nay
cheohoa(A,n);
// Step 2: Tim nghiem theo quy trinh nguoc
// Start
// Step 2.1 : Tim Nghiem
for(i=n;i>=1;i )
{
S=A[i][n+1];
for(k=i+1;k<=n;k++)
S -=X[k]*A[i][k];
X[i]=S/A[i][i];
}
// Stop
}
// Chuyen mot tra tran ve dang duong cheo
void cheohoa(float A[NMAX][NMAX],int n)
{
int i,j,k;
float temp,heso;
for(i=1;i<n;i++)
{
// Step 1: Kiem tra A[i][i] co bang 0 khong?
// Start

if(A[i][i]==0) // Neu bang 0 that
{
// Tim nguoi thay the
for(j=i+1;j<=n;j++)
{
if(A[j][i]!=0) // Neu tim thay nguoi thay the
// Thuc hien hoan chuyen hai hang cho nhau
for(k=1;k<=n+1;k++)
{
temp=A[i][k];
A[i][k]=A[j][k];
A[j][k]=temp;
}
break; // Dung tim
}
}
// Stop
// Step 2: Chuyen A va ma tran tam giac
// Start
for(j=i+1;j<=n;j++)
{
heso= -A[j][i]/A[i][i];
for(k=1;k<=n+1;k++)
A[j][k] += A[i][k]*heso;
}
// Stop
}
}
Bài 4: viết chương trình giải hệ đại số tuyến tính bằng phương pháp lặp Gauss Siedel
a) Nhập dữ liệu trực tiếp

b) Nhập dữ liệu thông qua file
Thuật toán:
- Nhập n, a
ij
(i=1n, j=1 n+1)
- Nhập xấp xỉ nghiệm ban đầu: x
i
(i=1n)
- Lặp
t=0 /*cho thoat*/
Lặp i=1n
{ S=0
Lặp j=1n do
if(j#i) S=S+a
ij
*x
j
y
i
=(a
in+1
– S)/a
ii
if (|y
i
-x
i
| >=ε) t=1 /*cho lặp*/
x
i

=y
i
}trong khi (t)
-Xuất nghiệm: x
i
hoặc y
i
(i=1n)
Chương trình:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
const int NMAX=10;
const double Err=0.001;
// Khai bao cac bien toan cuc
float A[NMAX][NMAX],X[NMAX];
int n;
void nhap();
void input_from_file();
void xuat();
int Gauss_S();
/* Chuong trinh chinh */
void main()
{int tt;char key;int dem;
while(1)
{
printf("\n He Phuong trinh ");
printf("\n Moi ban nhap n.Theo ma tran de bai ban nhap n=:");
scanf("%d",&n);

printf("\n 1.Nhap du lieu truc tiep ");
printf("\n 2.Nhap du lieu tu file ");
do
{printf("\n Ban chon:");
scanf("%d",&tt);}
while(tt!=1&&tt!=2);
switch(tt)
{
case 1: nhap();
dem=Gauss_S();
break;
case 2: input_from_file();
dem=Gauss_S();
break;
}
printf("\n ");
if(dem<30)
{printf("\n Xuat nghiem ra man hinh de xem :");
xuat();}
else printf("\nHe phuong trinh ko the giai bang phuong phap nay");
fflush(stdin);
printf("\n Ban co muon tiep tuc khong (c/k)?\n");
scanf("%c",&key);
if(key!='c') break;
}
}
/* Cac ham con */
// Dinh nghia ham nhap du lieu tu file
void input_from_file()
{

int i=1,j=1;
FILE *fp;
fp=fopen("INPUT.txt","rt");
if(fp==NULL)
{
printf("\n Can't open this file.Please try again.");
exit(1);
}
else
{
while(!feof(fp))
{
fscanf(fp,"%f",&A[i][j]);
if(j==n+1)
{
i++;
j=1;
}
else
j++;
}
}
fclose(fp);
}
//ham nhap du lieu truc tiep
void nhap()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++)
{printf("\nNhap vao a[%d][%d]=",i,j);

scanf("%f",&A[i][j]);
}
}
//ham xuat ket qua ra man hinh
void xuat()
{
for(int i=1;i<=n;i++)
printf("\nX[%d]=%f",i,X[i]);
getch();
}
//ham gauss_s
int Gauss_S()
{ float Y[NMAX],temp,S;
int i,j,k,t=1,dem=0;
do
{ dem++;
for(i=1;i<=n;i++)
{
// Step 1: Kiem tra A[i][i] co bang 0 khong?
// Start
if(A[i][i]==0) // Neu bang 0 that
{
// Tim nguoi thay the
for(j=i+1;j<=n;j++)
{
if(A[j][i]!=0) // Neu tim thay nguoi thay the
// Thuc hien hoan chuyen hai hang cho nhau
for(k=1;k<=n+1;k++)
{
temp=A[i][k];

A[i][k]=A[j][k];
A[j][k]=temp;
}
break; // Dung tim
}
}
// Stop
// Step 2: Tinh toan
// Start
S=0;
for(j=1;j<=n;j++)
if(j!=i)
S +=A[i][j]*X[j];
Y[i]=(A[i][n+1]-S)/A[i][i];
if((fabs(X[i]-Y[i])>=0.001)&&dem<30)
t=1;
else t=0;
X[i]=Y[i];
// Stop
}
}while(t);
return dem;
}
Bài 5: Giải phương trình đại số tuyến tính bằng phương pháp giảm dư
a) Nhập dữ liệu trực tiếp
b) Nhập dữ liệu thông qua file
Thuật toán:
- Nhập n, a
ij
, x

i
- Biến đổi hệ phương trình (1) về dạng (2)
for (i=1, i<= n, i++)
{ t = a[i,i]
for (j=1, j<=n+1; j ++) a[i,j] = a [i,j]/t
}
- Tính r[i] ban đầu (i = 1.n)
for i = 1n do
{ r[i] =a [i, n+1]
for j = 1 . n do r[i] = r [i] - a[i,j] * x [j]
}
- Lap
t = 0 /* cho thoat*/
/* Tìm r
s
= max {|r[i]|} (i = 1.n) & tính l.i xs*/
max = |r[1]|; k =1
for i = 2 . n do
if (max < |r[i]| ) { max = |r[i]; k= i }
x [k] = x [k] + r[k]
/* Tính lại R[i] kiểm tra khả năng lặp tiếp theo */
d = r[k]
for i =1n
{ r[i] = r[i] - a[i, k] * d
if (|r[i]| > . ) thi t =1 /* cho lap*/
}
Trong khi (t)
- Xuất nghiệm: x[i] (i=1n)
Chương trình:
#include<stdio.h>

#include<conio.h>
#include<stdlib.h>
#include<math.h>
const int NMAX=10;
const double Err=0.001;
// Khai bao cac bien toan cac
float A[NMAX][NMAX],X[NMAX];
int n;
void nhap();
void input_from_file();
void cheohoa(float A[NMAX][NMAX],int n);
void xuat();
int giamdu();
/* Chuong trinh chinh */
void main()
{int tt;char key;int dem;
while(1)
{
printf("\n He Phuong trinh ");
printf("\n Moi ban nhap n.Theo ma tran de bai ban nhap n=:");
scanf("%d",&n);
printf("\n 1.Nhap du lieu truc tiep ");
printf("\n 2.Nhap du lieu tu file ");
do
{printf("\n Ban chon:");
scanf("%d",&tt);}
while(tt!=1&&tt!=2);
switch(tt)
{
case 1: nhap();

dem=giamdu();
break;
case 2: input_from_file();
dem=giamdu();
break;
}
printf("\n ");
if(dem<30)
{printf("\n Xuat nghiem ra man hinh de xem :");
xuat();}
else printf("\nHe phuong trinh ko giai duoc bang phuong phap nay");
fflush(stdin);
printf("\n Ban co muon tiep tuc khong (c/k)?\n");
scanf("%c",&key);
if(key!='c') break;
}
}
/* Cac ham con */
// Dinh nghia ham nhap du lieu tu file
void input_from_file()
{
int i=1,j=1;
FILE *fp;
fp=fopen("INPUT.txt","rt");
if(fp==NULL)
{
printf("\n Can't open this file.Please try again.");
exit(1);
}
else

{
while(!feof(fp))
{
fscanf(fp,"%f",&A[i][j]);
if(j==n+1)
{
i++;
j=1;
}
else
j++;
}
}
fclose(fp);
}
//ham nhap du lieu truc tiep
void nhap()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++)
{printf("\nNhap vao a[%d][%d]=",i,j);
scanf("%f",&A[i][j]);
}
}
//ham xuat ket qua ra man hinh
void xuat()
{
for(int i=1;i<=n;i++)
printf("\nX[%d]=%f",i,X[i]);
}

//ham giamdu
int giamdu()
{int i,j,k,dem=0;
float temp,t,r[NMAX],max,d;
// Step 1: Kiem tra A[i][i] co bang 0 khong?
// Start
for(i=1;i<=n;i++)
if(A[i][i]==0) // Neu bang 0 that
{
// Tim nguoi thay the
for(j=i+1;j<=n;j++)
{
if(A[j][i]!=0) // Neu tim thay nguoi thay the
// Thuc hien hoan chuyen hai hang cho nhau
for(k=1;k<=n+1;k++)
{
temp=A[i][k];
A[i][k]=A[j][k];
A[j][k]=temp;
}
break; // Dung tim
}
}
// Step 2:bien doi hpt 1 ve dang 2
for(i=1;i<=n;i++)
{
t=A[i][i];
for(j=1;j<=n+1;j++) A[i][j]=A[i][j]/t;
}
// Step 3:tinh r[i] ban dau(i=1->n)

for(i=1;i<=n;i++)
{
r[i]=A[i][n+1];
for(j=1;j<=n;j++) r[i]=r[i]-A[i][j]*X[j];
}
do
{ dem++;
if(t=0) break;
/*tim r[s]=max{r[i]}(i=1->n) va ting lai x[s]*/
max=fabs(r[1]);
k=1;
for(i=2;i<=n;i++)
if(max<fabs(r[i]))
{
max=fabs(r[i]);
k=i;
}
X[k]=X[k]+r[k];
/*tinh lai R[i] kiem tra kha nang lap tiep theo */
d=r[k];
for(i=1;i<=n;i++)
{
r[i]=r[i]-A[i][k]*d;
if((fabs(r[i])>=0.001)&&dem<30) t=1;
}
}while(t);
return dem;
}

×