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

Thuật toán : -Nhập vào: n,c, các hệ số ai(i= ) -Xử lý: Gán p=a0 Lặp i=1 -> n: p=p*c+ai -Xuất kết quả: p Chương trình: #include #include #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(); }

doc29 trang | Chia sẻ: lylyngoc | Lượt xem: 2166 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Báo cáo Thực hành phương pháp tính, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Báo cáo thực hành phương pháp tính MỤC LỤC 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ố ai(i=) -Xử lý: Gán p=a0 Lặp i=1àn: p=p*c+ai -Xuất kết quả: p Chương trình: #include #include #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=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 #include #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=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 #include #include #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 ai(i=) - hoocnertq (A, n, c) Lặp i=n à 1 Lặp j=1 à i Ai=Ai-1*c+Ai - In ra đa thức p(y+c) Chương trình : #include #include #include #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;j0?'+':' '),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 #include #include #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(chon3); 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) 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 #include #include #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;i0); 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;i0) 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)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 #include #include #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 :x3 - 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 #include #include #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 #include #include #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 #include #include #include #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;i0) { max=0; for(i=1;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 Nhập dữ liệu trực tiếp Nhập dữ liệu từ file Thuật toán: Nhập n, aij(i=, j=) Biến đổi A à A’ (ma trận tma giác trên) Lặp i=1 à n-1 + Nếu aij=0 Tìm j sao cho aij#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=-aji/aii Lặp k=I à n+1 ajk = ajk*m Tìm nghiệm Lặp i=nà1 S=0 Lặp j= i+1àn S=S+aij*xj Xuất nghiệm: xi (i=1àn) Chương trình: #include #include #include 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 Nhập dữ liệu trực tiếp Nhập dữ liệu thông qua file Thuật toán: Nhập n, aij (i=1àn, j=1àn+1) Nhập xấp xỉ nghiệm ban đầu: xi (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+aij*xj yi=(ain+1 – S)/aii if (|yi-xi| >=e) t=1 /*cho lặp*/ xi=yi }trong khi (t) Xuất nghiệm: xi hoặc yi (i=1àn) Chương trình: #include #include #include #include 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ư Nhập dữ liệu trực tiếp Nhập dữ liệu thông qua file Thuật toán: - Nhập n, a ij, xi - 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 rs = 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 #include #include #include 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