ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
BÀI TẬP
TIN HỌC ỨNG DỤNG
GVHD: Ths.GVC. Lê Văn Hợi
Đà Nẵng , tháng 10 năm 2017
Trang 0
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
CHƯƠNG 2
1.
Lập giải thuật và viết code nhân 2 ma trận:
a.
Giải thuật:
Cho i = 1 -> m;
Cho j = 1 -> p;
C[i][j] = 0;
Cho k = 1 -> n
C[i][j] = C[i][j] + A[i][k].B[i][k];
b.
Chương trình :
#include<stdio.h>
#include<conio.h>
#define MAX 100
void nhap(int a[MAX][MAX],int d,int c)
{
int i,j;
for(i=0;i
{
for(j=0;j
{
printf("nhap vao phan tu thu:%d%d",i,j);
scanf("%d",&a[i][j]);
}
}
}
void xuat(int a[MAX][MAX],int d,int c)
{
int i,j;
for(i=0;i
{
for(j=0;j
{
printf("%d\t",a[i][j]);
Trang 1
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
}
printf("\n");
printf("\n");
}
}
void tich(int a[MAX][MAX],int b[MAX][MAX],int t[MAX][MAX],int da,int ca,int cb)
{
int i,j,k;
for(i=0;i
{
for(j=0;j
{
t[i][j]=0;
for(k=0;k
{
t[i][j] += a[i][k] * b[k][j];
}
}
}
}
int main()
{
int a[MAX][MAX],b[MAX][MAX],t[MAX][MAX];
int da,db,ca,cb,dc,cc;
printf("Nhap vao so dong ma tran a:");
scanf("%d",&da);
printf("nhap vao so cot ma tran a:");
scanf("%d",&ca);
nhap(a,da,ca);
printf("A:\n");
xuat(a,da,ca);
printf("Nhap vao so dong ma tran b:");
scanf("%d",&db);
printf("Nhap vao so cot cua ma tran b:");
scanf("%d",&cb);
nhap(b,db,cb);
printf("B:\n");
Trang 2
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
xuat(b,db,cb);
tich(a,b,t,da,ca,cb);
printf("Tich cua 2 ma tran la:\n");
dc = da;
cc = cb;
xuat(t,dc,cc);
getch();
return 1;
}
Trang 3
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
2. Giải hệ phương trình:
2.1. Hệ phương trình có ma trận hệ số đầy đủ, không đối xứng:
a.
Giải thuật:
Giải thuật phương pháp khử Gauss:
Để đơn giản khi lập giải thuật ta mở rộng ma trận A[n,n] thêm
1 phần tử (n+1). Cột thứ (n+1) chính là cột tự do ( vế phải của HPT ).
�
a11 a12 L a1n a1( n 1) �
�
�
a21 a22 L a2 n a2( n 1) �
�
A �M M M M M �
�
�
an1 an 2 L ann an ( n 1) �
�
Bước 1. Khử về dạng tam giác :
Cho i = 1 -> (n-1) để khử (n-1) cột.
Tại lần khử thứ i, đưa các phần tử cột i dưới đường chéo về 0:
+ Đặt P = aij( giả thiết P �0)
+ Chia hàng i cho P:
Aij /= P; j=i->(n+1);
+ Dùng hàng i làm chuẩn để khử cột i dưới đường chéo về 0;
+ Cho k = i+1 -> n
Đặt Q= Aki
Nhân Q với hàng i rồi trừ vào hàng k: (j = i -> (n+1)) Akj = Aij. Q;
Bước 2. Lấy nghiệm:
Sau quá trình khử xuôi ở bước 1 ma trận hệ số có dạng:
�
1
�
0
A �
�
M
�
0
�
a1n a1( n 1) �
�
1 L a2 n a2( n 1) �
M M M M �
�
0 L ann an ( n 1) �
a12 L
Trang 4
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
Bắt đầu lấy nghiệm từ phương trình thứ n ngược về phương trình đầu tiên:
a
0
a
�0
+ Nếu ann = 0 thì vô số nghiệm khi n ( n1)
và vô nghiệm khi n ( n1)
.
+ Nếu ann �0 thì
xn
an ( n 1)
ann
+ Cho i = n-1 -> 1 để lấy n-1 nghiệm còn lại. Tại lần thứ i ta tính được
i 1
xi ai ( n 1) �aij xi
j n
b. Chương trình :
#include<stdio.h>
#include<conio.h>
float A[100][100],X[100];
int n;
void nhapbangtay()
{
printf("Nhap n: ");scanf("%d",&n);
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n+1;j++)
{
printf("Nhap a[%i][%i]: ",i,j);
scanf("%f",&A[i][j]);
}
}
void nhaptufile()
{
FILE *f;
int i,j;
f=fopen("Gauss.txt","r");
fscanf(f,"%d\n",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n+1;j++) fscanf(f,"%f",&A[i][j]);
fclose(f);
Trang 5
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
}
void xuatmatran()
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n+1;j++) printf("%5.2f ",A[i][j]);
printf("\n");
}
}
void swap(float &a,float &b)
{
float f;
f=a;
a=b;
b=f;
}
void doidong(int p,int q)
{
int k;
if(p<=n&&q<=n&&p!=q) for (k=1;k<=n+1;k++) swap(A[p][k],A[q][k]);
}
int Gauss(float A[][100],int n)
{
int i,j,k;
float m,s;
for (i=1;i<=n;i++)
{
if (A[i][i]==0)
{
for (k=i+1;k<=n;k++)
if(A[k][i]!=0) break;
doidong(i,k);
if (k>n) return 1;
}
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;
Trang 6
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
}
}
printf("\nHe phuong sau khi bien doi :\n");
xuatmatran();
// Tim nghien theo qua trinh nguoc
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];
}
}
main()
{
nhapbangtay();
xuatmatran();
if(Gauss(A,n)==1) printf("Du lieu khong hop le");
else
{
printf("\nNghiem he phuong trinh : ");
for(int i=1;i<=n;i++) printf("%5.2f ",X[i]);
}
getch();
}
2.2. Giải hệ phương trình ma trận dạng băng:
a.
Giải thuật:
Nguyên tắc: chỉ xử lý các phần tử thuộc phạm vi băng:
Khi chia hàng i cho P – chỉ cần cho j = i -> c1;
Xử lý riêng cho phần tử tự do: khi khử 1 cột i, chỉ cần cho k = i+1-c2( vì các phần tử
ngoài băng đã bằng 0, không cần khử).
Chạy ngang để tính a[k][j] = a[i][j] – Q.a[i][j] (j chỉ cần chạy từ i -> c1). Xử lý riêng cho
phần tử tự do. Khi lấy nghiệm: Tổng a[i][j].x[j] chỉ lấy trên phạm vi băng( j = c1->
i+1).
b.
Chương trình :
Trang 7
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
void xulymatranbang(int nb,int mb,int n)
{
int c1,c2;
for(int i = 1; i <= n; i++)//n la so hang
{
c1 = i + nb - 1; // tinh theo hang
if(c1 > n) c1 = n;//n la so cot
c2 = i + mb -1;// tinh theo cot
if(c2 > n) c2 = n;
for(int j = i;j <= c1;j++)
A[i][j] /= A[i][i];
A[i][n+1] /= A[i][i];
for(int k = i+1;k <= c2;k++)
for(int j = i;j <= c1;j++)
{
A[k][j] -= A[i][j]*A[k][i];
A[k][n+1] -= A[i][j]*A[k][i];
}
}
//tinh toan nghiem ma tran bang
float sum;
if(A[n][n]==0)
{
if(A[n][n+1] != 0) printf("\nhe phuong trinh vo nghiem");
else printf("\nhe phuong trinh vo so nghiem");
}
else {
printf("\nhe phuong trinh co nghiem");
X[n] = A[n][n+1];
printf("X[%d] = %.3f",n, X[n]);
}
for(int i = n-1;i>=1;i--)
{
sum = 0;
c1 = i + nb - 1; // tinh theo hang
if(c1 > n) c1 = n;//m la so cot
for(int j = c1; j > i; j--)
{
sum += X[j]*A[i][j];
Trang 8
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
}
X[i] = A[i][n+1] - sum;
printf("X[%d] = %0.3f",i, X[i]);
}
}
Yêu cầu 2: Lưu băng trong 1 vector:
Code như sau:
#include<stdio.h>
main()
{
int n;
int nb;
//nhap n, nb
printf("Nhap n = ");
scanf("%d",&n);
printf("Nhap nb = ");
scanf("%d",&nb);
float A[n+1][n+2];
//reset A[n][n]
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
Trang 9
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
A[i][j]=0;
}
}
//nhap bang
for(int i=1;i<=n;i++)
{
int c1=i+nb-1;
if(c1>n) c1=n;
int c2=i+1-nb;
if(c2<1)c2=1;
for(int j=c2;j<=c1;j++)
{
printf("A[%d][%d] = ",i,j);
scanf("%f",&A[i][j]);
}
}
//nhap cot tu do
printf("Cot tu do\n");
for(int i=1;i<=n;i++)
{
printf("A[%d][%d] = ",i,n+1);
scanf("%f",&A[i][n+1]);
Trang 10
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
}
printf("Ma tran bang A[n][n+1]\n");
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n+1;j++)
{
printf("%8.2f",A[i][j]);
}
printf("\n");
}
float V[n*n];
//sap xep bang A[n][n+1] vao bang A[n][band]
int dem=1;
for(int i=1;i<=n;i++)
{
int c1=i+nb-1;
if(c1>n) c1=n;
int c2=i+1-nb;
if(c2<1)c2=1;
for(int j=c2;j<=c1;j++)
{
Trang 11
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
V[dem++]=A[i][j];
}
}
for(int i=1;i<=n;i++)
{
V[dem++]=A[i][n+1];
}
//xuat vecto V[]
printf("Vecto V[]\n");
for(int i=1;i
{
printf("%8.2f",V[i]);
}
}
2.3. Giải thuật tìm ma trận nghịch đảo
a.
Thuật toán :
Lập mảng A0 (n,n+1) để lưu giá trị ma trận cần nghịch đảo, trong đó cột thứ n+1 có giá
trị bằng 0.
Cho l = 1-> n ( để thực hiện giải n lần hệ phương trình)
+ Gán A0 cho A( A, A0)
+ Xác định cột tự do của lần giải thứ L.
A(l,n+1) = 1.
+ Giải hệ phương trình với ma trận mở rộng An,n+1 sẽ tìm được vector nghiệm X(n)
+ Đưa vector nghiệm X(n) vào cột thứ l của ma trận A-1
Cho i = 1 -> n : A-1(i,l) = X(i);
Xuất ma trận A-1 cần tìm.
ĐỀ XUẤT THUẬT TOÁN TỐI ƯU:
Giảm thời gian bằng cách thay việc giải n lần n hệ phương trình bởi việc giải 1 lần n hệ
phương trình( dùng 3 mảng 2 chiều)
Trang 12
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
Hoặc có thể thay bằng cách giải 1 lần n hệ phương trình ( dùng 2 mảng và 1 vector).
b. Chương trình:
//Tim ma tran nghich dao
#include<stdio.h>
main()
{
int n;
printf("Nhap n = ");
scanf("%d",&n);
float A[n+1][n+1];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("A[%d][%d] = ",i,j);
scanf("%f",&A[i][j]);
}
}
float Ao[n+1][n+1];//Ao la ma tran nghich dao cua matran A
float x[n+1];
for(int L=1;L<=n;L++)
{
float Ax[n+1][n+2];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n+1;j++)
{
Ax[i][j]=A[i][j];
}
}
//dua cot tu do ve 0
for(int i=1;i<=n;i++)
Trang 13
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
{
Ax[i][n+1]=0;
}
//hang thu L se co gia tri bang 1
Ax[L][n+1]=1;
//tim ma tran nghich dao
for(int i=1;i
{
float P=Ax[i][i];
for(int j=i;j<=n+1;j++)
{
Ax[i][j]=1.0*Ax[i][j]/P;
}
for(int k=i+1;k<=n;k++)
{
float Q=Ax[k][i];
for(int j=i;j<=n+1;j++)
{
Ax[k][j]=Ax[k][j]-1.0*Q*Ax[i][j];
}
}
}
for(int l=1;l<=n;l++)
{
for(int m=1;m<=n+1;m++)
{
printf("A[%d][%d] = %0.2f ",L,m,Ax[l][m]);
}printf("\n");
}
//Lay nghiem
x[n]=1.0*Ax[n][n+1]/Ax[n][n];
for(int i=n-1;i>0;i--)
{
x[i]=Ax[i][n+1];
Trang 14
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
for(int j=i+1;j<=n;j++)
{
x[i]=x[i]-(Ax[i][j]*x[j]);
}
}
//dua x[n] vao cot L trong ma tran Ao
for(int i=1;i<=n;i++)
{
Ao[i][L]=x[i];
}
}
//xuat
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%5.2f",Ao[i][j]);
}
printf("\n");
}
}
Trang 15
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
Theo GAUSS- JOOCDANG
Lập ma trận A0 bằng ma trận ban đầu cần nghịch đảo. Tính truy hồi Ak từ Ak-1 theo công
thức:
Ai(,kj )
� ( k 1) Ai(,kk 1) . Ak( k, j1)
(i �k , j �k )
�Ai , j
Ak( k,k1)
�
�
Ak( k, j1)
�
(i k , j �k )
�
Ak( k, k1)
�
�
Ai(,kk 1)
�
( k 1) (i �k , j k )
�
Ak , k
�
�
1
(i j k )
�
( k 1)
Ak , k
�
Tính truy hồi đến lần thứ n thì An nhận được chính là A-1 của ma trận A ban đầu!
a. Thuật toán:
Dùng A để lưu giá trị ở bước tính thứ k-1, và dùng A1 để lưu giá trị ở bước tính thứ k.
Gán A1 cho A – để quay lên lặp lại bước tính truy hồi tiếp theo.
Xuất A1 ở bước tính thứ n – đó chính là ma trận nghịch đảo A-1 cần tìm.
(thuật toán này cần đến 2 mảng 2 chiều)
Đề xuất thuật toán tối ưu để tiết kiệm bộ nhớ:
Chỉ dùng 1 mảng 2 chiều và một mảng 1 chiều phụ trợ. Lưu giá trị của bước tính thứ k
trên 1 mảng 2 chiều duy nhất.
Trong mỗi lần tính truy hồi ở bước k cần phải:
+ Lưu giá trị của Ak,k vào biến P.
+ Lưu giá trị của Ai,k vào biến Q.
+ Lưu giá trị của hàng k Ak,j vào vector D(j=1->n)
Lý do: nếu không lưu giữ riêng các giá trị này thì chúng sẽ bị thay đổi ngay trong lần
đầu tiên của 1 bước lặp( khi j = 1-> n) và các vòng tính tiếp theo ( khi i,j thay đổi)
không còn đúng nữa.
b. Chương trình :
Trang 16
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
For(k=1;k<=n;k++)
{
P= A[k][k];
}
For(j=1;j<=n;j++)
{D[j] = A[k][j];
For(i=1;i<=n;i++)
{Q= A[i][k];
For(i=1;i<=n;i++)
{if(i!=k && j!=k) A[i][j] = A[i][j] – Q*D[j]/P;
if(i==k && j!=k) A[i][j] = D[j]/P;
if(i!=k && j==k) A[i][j] = -Q/P;
if(i==k && j==k) A[i][j] = 1/P;
}
}
}
Có thể sử dụng đệ qui:
float Aij(int k,int i,int j)//tim ma tran nghich dao theo jordand
{
if(k==0) return A[i][j];
else
{ if(i!=k && j!=k) return A[i][j] = 1.0*Aij(k-1,i,j) - 1.0*Aij(k-1,i,k)*Aij(k1,k,j)/Aij(k-1,k,k);
if(i==k && j != k) return A[i][j] = 1.0*Aij(k-1,k,j)/Aij(k-1,k,k);
if(i != k && j == k) return A[i][j] = -1.0*Aij(k-1,i,k)/Aij(k-1,k,k);
if(i==k && j==k) return A[i][j] = 1.0/Aij(k-1,k,k);
}
}
Trang 17
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
CHƯƠNG 3
1.
Thuật toán nội suy bậc nhất 1 chiều :
a. Thuật toán :
- Đọc giá trị bảng tra X(x) và Y(n)
- Cho giá trị xo
- Tìm i thõa mãn điều kiện xi-1 ≤ xo ≤ xi
- Tính yo theo công thức :
yo = yi-1 +
- Xuất kết quả .
b. Chương trình :
#include<stdio.h>
main()
{
int n;
printf("n = ");
scanf("%d",&n);
//khai bao va nhap du lieu bang noi suy
float X[n],Y[n];
for(int i=1;i<=n;i++)
{
printf("X%d = ",i);
scanf("%f",&X[i]);
printf("Y%d = ",i);
scanf("%f",&Y[i]);
}
Trang 18
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
do
{
float x,y;
printf(" Nhap x = ");
scanf("%f",&x);
if(x<X[1]||x>X[n])
printf("x = %0.2f khong nam trong pham vi noi suy!!!\n",x);
//tim y ???
for(int i=1;i<=n;i++)
{
if(x<=X[i])
{
y=Y[i]-(X[i]-x)*(Y[i]-Y[i-1])/(X[i]-X[i-1]);
//xuat y
printf("y = %0.2f\n",y);
break;
}
}
}while(1);
}
Trang 19
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
2.
Thuật toán nội suy bậc nhất 2 chiều :
a. Thuật toán :
- Nhập các bảng tra vào mảng .
- Tìm vị trí x0 và yo trong bảng tra , tức là i và j thỏa mãn :
xi-1 ≤ xo ≤ xi
yj-1 ≤ yo ≤ yj
- Thực hiện các bước tính nội suy như sau :
+ Trên cột j-1 , nội suy theo xo để tìm ra Z1
Z1 = Zi-1,j-1 +
+ Trên cột j , nội suy theo xo để tìm ra Z2
Z2 = Zi-1,j +
+ Từ Z1 và Z2 nội suy theo yo để tìm ra Zo
Z0 = Z1 +
b. Chương trình :
#include<stdio.h>
main()
{
int n;
printf("Nhap n = ");
scanf("%d",&n);
float x[n+1];
for(int i=1;i<=n;i++)
{
printf("X%d = ",i);
scanf("%f",&x[i]);
}
Trang 20
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
int m;
printf("Nhap m = ");
scanf("%d",&m);
float y[m+1];
for(int i=1;i<=m;i++)
{
printf("Y%d = ",i);
scanf("%f",&y[i]);
}
//nhap mang noi suy Z
float z[n+1][m+1];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
printf("x = %0.2f & y = %0.2f => z = ",x[i],y[j]);
scanf("%f",&z[i][j]);
}
}
do
Trang 21
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
{
float x0,y0,Z0,Z1,Z2;
printf("Nhap x = ");
scanf("%f",&x0);
printf("Nhap y = ");
scanf("%f",&y0);
int i,j;
for( i=1;i<=n;i++)
{
if(x[i]>=x0)
{
if(i=1) i=2;
break;
}
}
for( j=1;j<=m;j++)
{
if(y[j]>=y0)
{
if(j=1) j=2;
break;
}
}
Trang 22
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
Z1 = z[i-1][j-1] + (1.0 * (z[i][j-1] - z[i-1][j-1]) * (x0 - x[i-1]) / (x[i] - x[i-1]));
Z2 = z[i-1][j] + (1.0 * (z[i][j] - z[i-1][j]) * (x0 - x[i-1]) / (x[i] - x[i-1]));
Z0 = Z1 + (1.0 * (y0 - y[j-1]) * (Z2-Z1) / (y[j] - y[j-1]));
printf("x = %0.2f & y = %0.2f => z = %0.2f\n",x0,y0,Z0);
}while(true);
}
Trang 23
ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA XÂY DỰNG TL-TĐ
BÀI TẬP TIN HỌC ỨNG DỤNG
c.
Phương pháp chia đôi
a. Đề bài
Viết chương trình tìm nghiệm gần đúng 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
b. Thuật toán
Nhập bậc phương trình n, và các hệ số ai (i= 0, n )
Định nghĩa hàm Hoocner để tính giá trị hàm f(x)
Truyền vào hàm bậc đa thức n, các hệ số ai (i= 0, n )
Gán p = a0
Lặp i=1…n: p = p * c + ai
Xuất p
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) thì b = c
ngược lại a = c
trong khi (f(c) != 0 và |a-b|>epsilon)
Xuất nghiệm c.
c.
Chương trình :
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void Nhaptt(float *d, int &n);
void Nhapf(float *d, int &n);
void Xuat(float *d, int n);
Trang 24