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=1n: 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=n1
• S=0
• Lặp j= i+1n S=S+a
ij
*x
j
- Xuất nghiệm: x
i
(i=1n)
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=1n, j=1 n+1)
- Nhập xấp xỉ nghiệm ban đầu: x
i
(i=1n)
- Lặp
t=0 /*cho thoat*/
Lặp i=1n
{ S=0
Lặp j=1n 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=1n)
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 = 1n 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 =1n
{ 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=1n)
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;
}