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

  • Số trang: 29 |
  • Loại file: DOC |
  • Lượt xem: 392 |
  • Lượt tải: 0
thuvientrithuc1102

Đã đăng 15341 tài liệu

Mô tả:

ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN BÀI BÁO CÁO: Thực hành PHƯƠNG PHÁP TÍNH Giáo Viên hướng dẫn: Nguyễn Văn Nguyên Sinh Viên Thực Hiện: Lớp: Nhóm: Phạm Duy Dy 11T4 91 Bài số 1: 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. Thuật toán: - Nhập : bậc đa thức n, giá trị cần tính c, các hệ số ai () - Xử lý: Gán p = a0 Lặp i = 1 n : p = p * c + ai - Xuất kết quả: p CODE #include #include void nhap(float a[100], int n) {int i; printf("\n"); for(i=1;i<=n+1;i++) { printf(" Nhap he so cua X^%d : ",n-i+1); scanf("%f",&a[i]); } } float tinh(float a[100], int n, float c) { int i; float p; p=a[1]; for(i=2;i<=n+1;i++) p=p*c+a[i]; return p; } main() { int i, n; float c,a[100]; printf("Nhap bac cua da thuc: "); scanf("%d",&n); nhap(a,n); printf("\nNhap gia tri can tinh: "); scanf("%f",&c); printf("Ket qua: %0.3f ",tinh(a,n,c)); getch(); } Kết quả chương trình: 2. Viết chương trình thực hiện: a. 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 b. 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) CODE #include #include void nhap(float a[100], int n) { int i; printf("\n"); for(i=1;i<=n+1;i++) { printf(" Nhap he so cua X^%d : ",n-i+1); scanf("%f",&a[i]); } } float tinh(float a[100], int n, float c) { int i; float p; p=a[1]; for(i=2;i<=n+1;i++) p=p*c+a[i]; return p; } main() { int i, n; float c,a[100],y,z,s1,s2; printf("Nhap bac cua da thuc: "); scanf("%d",&n); nhap(a,n); for(i=1;i<=n;i++) s2= s2 + tinh(a,n,i); printf("\nKet qua S2=f(1)+f(2)+...+f(n) la: %0.3f ",s2); printf("\n\nNhap gia tri y: "); scanf("%f",&y); printf("Nhap gia tri z: "); scanf("%f",&z); printf("\nKet qua S1=f(y)-f(z) la: %0.3f ",tinh(a,n,c)); getch(); } Kết quả chương trình: 3. 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) CODE #include #include void nhap(float a[100], int n) { int i; printf("\n"); for(i=1;i<=n+1;i++) { printf(" Nhap he so cua X^%d : ",n-i+1); scanf("%f",&a[i]); } } float tinh(float a[100], int n, float c) { int i; float p; p=a[1]; for(i=2;i<=n+1;i++) p=p*c+a[i]; return p; } main() { int i,n1,n2; float c,a[100],b[100]; printf("Nhap bac cua da thuc Pn(x): "); scanf("%d",&n1); nhap(a,n1); printf("\nNhap bac cua da thuc Pm(y): "); scanf("%d",&n2); nhap(b,n2); printf("\nNhap gia tri can tinh: "); scanf("%f",&c); printf("Ket qua Pn(%.3f)-Pm(%.3f): %.3f ",c,c,tinh(a,n1,c)-tinh(b,n2,c)); getch(); } Kết quả chương trình: 4. 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, ai (i = ) - Lặp k = n → 1 Lặp i = 1 → k : ai = ai-1 * c + ai - Xuất : ai (i = ) CODE #include #include void nhap(float a[100], int n) { int i; printf("\n"); for(i=1;i<=n+1;i++) { printf(" Nhap he so cua X^%d : ",n-i+1); scanf("%f",&a[i]); } } float tinh(float a[100], int n, float c) { int i,k; for(k=n+1;k>=1;k--) for(i=2;i<=n+1;i++) a[i]=a[i-1]*c+a[i]; printf("\n"); for(i=1;i<=n+1;i++) printf(" He so X^%d cua da thuc f(x+%.3f): %.3f \n",n-i+1,c,a[i]); } main() { int n; float c,a[100]; printf("Nhap bac cua da thuc: "); scanf("%d",&n); nhap(a,n); printf("\nNhap gia tri c: "); scanf("%f",&c); tinh(a,n,c); getch(); } Kết quả chương trình: 5. Viết chương trình tìm nghiệm gần đúng cho phương trình có dạng tổng quát: f(x) = a0xn + a1xn-1 + … + an-1x + an = 0 bằng phương pháp chia đôi Thuật toá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 CODE #include #include void nhap(float h[100], int n) { int i; printf("\n"); for(i=1;i<=n+1;i++) { printf(" Nhap he so cua X^%d : ",n-i+1); scanf("%f",&h[i]); } } float f(float h[100], int n, float ab) { int i; float p; p=h[1]; for(i=2;i<=n+1;i++) p=p*ab+h[i]; return p; } main() { int i, n; float h[100],a,b,c; printf("Nhap bac cua da thuc: "); scanf("%d",&n); nhap(h,n); printf("\nNhap khoang nghiem (a,b) cua da thuc voi Fa*Fb < 0 "); printf("\n"); do { printf("Nhap khoang nghiem (a,b) cua da thuc: "); scanf("%f%f",&a,&b); } while( f(h,n,a)*f(h,n,b) >= 0 ); do { c=(a+b)/2; if ( f(h,n,c)>0 ) b=c; else a=c; } while( ( -0.001 <= f(h,n,c)) && (f(h,n,c) >= 0.001) ); printf("\nNghiem gan dung cua da thuc la: %.3f",c); getch(); } Kết quả chương trình: -------------------------------------------------------------------- Bài số 2: 1. Viết chương trình tìm nghiệm gần đúng cho phương trình có dạng tổng quát: f(x) = a0xn + a1xn-1 + … + an-1x + an = 0 bằng phương pháp dây cung 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 CODE #include #include #include #define eps 0.0001 float heso[50], a, b, c; int n; double p(float x) { double k=heso[0]; int i; for (i=1;i<=n;i++) k=k*x+heso[i]; return k; } void nhap() { printf("Nhap bac cua phuong trinh: "); scanf("%d", &n); printf("\nNhap cac he so: "); for (int i=0;i<=n;i++) scanf("%f", &heso[i]); do { printf("\nNhap khoang nghiem: "); scanf("%f%f", &a, &b); if (p(a)*p(b)>0) printf("\n%.3f x %.3f > 0 --> nhap sai khoang nghiem. \n", p(a), p(b)); } while(p(a)*p(b)>0); } main() { nhap(); c=a-(b-a)/(p(b)-p(a)); if (p(a)*p(c)<0) do { b=c; c=a-(b-a)/(p(b)-p(a)); } while (c-b>=eps); else do { a=c; c=a-(b-a)/(p(b)-p(a)); } while (c-a>=eps); printf("\nNghiem cua pt la x= %.3f", c); getch(); } Kết quả chương trình: 2. Viết chương trình tìm nghiệm cho phương trình e^x - 10x + 7 = 0 bằng phương pháp tiếp tuyến. 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) CODE #include #include #include float fx(float x) { float p; p = exp(x) - 10*x + 7; return p; } float fxdh(float x) { float p; p = exp(x) - 10; return p; } main() { float x,y; printf("Phuong trinh: e^x - 10x + 7 = 0"); printf("\n\nNhap xap xi nghiem ban dau x thuoc (0;1): "); scanf("%f",&x); do { y=x; x=y-fx(y)/fxdh(y); } while( (x-y)>10e-3 || (x-y)<-10e-3 ); printf("\nNghiem gan dung cua phuong trinh: %.3f",x); getch(); } Kết quả chương trình: 3. Viết chương trình giải hệ đại số tuyến tính bằng phương pháp Gauss Thuật toá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 , j = i+1n  Nếu aii = 0 Nếu j<=n thì hoán đổi dòng i và dòng j cho nhau ngược lại thì kết thúc (vì dữ liệu ko hợp lệ)  Lặp j = i + 1 n m = -aji /aii Lặp k = i n +1 ajk = ajk + aik * m - Tìm nghiệm ( i =n 1) Lặp i = n 1 s=0 lặp j = i + 1 n xi = (ain+1 - s)/aii - Xuất vectơ nghiệm: xi (i=1n) s = s + aij * xj CODE: # include # include # include # define eps 1e-3 # define max 100 void hoandoi(float *a, float *b) { float t; t = *a; *a = *b; *b = t; } void doidong(float a[][max], int n, int p, int q) { int k; if (p<=n && q<=n && p!=q) for (k=1; k<=n+1; k++) hoandoi(&a[p][k], &a[q][k]); } /* Ham xuat mang a(n,n+1)*/ void xuatmt(float a[][max], int n) { int i,j; for (i=1; i<=n; i++) { printf("\n"); for (j=1; j<=n+1; j++) printf(" %.2f ", a[i][j]); } } int main() { float a[max][max]; float s,m,x[max]; int n, i, j, k; FILE *f; char tt; f=fopen("Gauss_Siedel.txt","r"); /* mo file de doc so lieu */ fscanf(f,"%d",&n); for (i=1; i<=n; i++) for (j=1; j<=n+1; j++) if (!feof(f)) fscanf(f, "%f", &a[i][j]); else { printf("\n So lieu ko hop le"); getch(); return 0; } fclose(f); printf("\nCac he so cua he phuong trinh: \n"); xuatmt(a,n); /* bien doi A ve ma tran tam giac tren */ for(i=1; in) return 0; } for(j=i+1;j<=n;j++) { m = -a[j][i]/a[i][i]; for (k=i;k<=n+1;k++) a[j][k]+=a[i][k]*m; } } printf("\n\nHe phtrinh sau khi bien doi: \n"); xuatmt(a, n); for(i=n; i>=1; i--) { s=a[i][n+1]; for (k=i+1; k<=n; k++) s-=a[i][k]*x[k]; if (a[i][i]!=0) x[i] = s/a[i][i]; } printf("\n\nNghiem he phtrinh: "); for(i=1; i<=n; i++) printf("%.2f ", x[i]); getch(); } Kết quả chương trình: 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 Thuật toán: - Nhập n, aij (i=1 n, j=1 n+1) (nhập trực tiếp hoặc từ file) - Nhập xấp xỉ nghiệm ban đầu: xi (i =1n) - Lặp t = 0 /* cho thoat */ lap i = 1 n { s=0 lap j = 1 n do if (j i) s = s + aij * xj yi = (ain + 1 - s ) / aii if ( | yi – xi | > = ) t =1 /* cho lap */ xi = yi } trong khi (t) - Xuất vectơ nghiệm: xi hoặc yi (i =1n) CODE #include #include #include #define max 100 #define eps 1e-3 void xuatmt(int a[][max], int n) { for(int i=1;i<=n;i++) { printf("\n"); for( int j=1;j<=n+1;j++) printf("%5d",a[i][j]); } } void nhap(float *a,int n) { int i; for(i=1;i<=n;i++) scanf("%f",a+i); } void xuat(float a[], int n) { int i; for(i=1;i<=n;i++) printf("%8.3f",a[i]); } int main() { float x[max], y[max]; int a[max][max]; int n, i, j, t, dem; FILE *f; char tt; f=fopen("Gauss_Siedel.txt","r"); fscanf(f,"%d",&n); for(i=1;i<=n;i++) for(j=1;j<=n+1;j++) { if(!feof(f)) fscanf(f,"%d",&a[i][j]); else { printf("Co loi"); getch(); return 0; } } fclose(f); printf("\nCac he so cua phuong trinh la: \n"); xuatmt(a,n); while(1) { printf("\n\nNhap nghiem xap xi ban dau: \n"); nhap(x,n); dem=0;
- Xem thêm -