Tải bản đầy đủ (.docx) (48 trang)

BÀI TẬP TIN HỌC ỨNG DỤNG

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (212.17 KB, 48 trang )

ĐẠ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 ( n1)
và vô nghiệm khi n ( n1)
.

+ 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, j1)
(i �k , j �k )

�Ai , j 
Ak( k,k1)


Ak( k, j1)

(i  k , j �k )

Ak( k, k1)

�
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


×