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 :");
/*********************************************/
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];
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
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]);
}
}
#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;
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
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)
}
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()
- 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)
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>
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
- 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);}
}
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++)
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
=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);
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);
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
#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();
{
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]);
}
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;
}