追赶法实验报告
一. 实验目的:*********** 二. 实验时间:*********** 三. 实验地点:***********
四. 实验内容:运用编程写出追赶法来解决热传导方程,常微分
方程边值问题以及船体数学放样中建立三次样条函数。
五. 实验环境:Cfree5.0环境下运行。 六. 实验需要的知识:
b 1
c 1 x 1
x 2 a 2 b 2 c 2
○ ○
○
○
f 1
f 2
=
a n-1 b n-1 c n-1 a n b n
x n-1 x n f n-1 f n
简记为Ax=f。其中当|i-j|>1时,a ij =0,且:
|b1|>|c1|>0;
|bi |>=|ai |+|ci |,i=2,3,,,,,n-1; |bn |>|an |>0
我们利用矩阵的直接分解法来推导解三对角线方程组的计算公式。由A 的特点可以将A 分为两个矩阵的乘积,即 A=LU. 其中得到:
1
1
r 2 a 2
1
A= r n a n
对于分解式得到:
b 1=a1,c 1=a1ß1, ai =ri ,b i =ri ßi-1+ai ,
c i =ai ßi .
由归纳法得到 ai =bi -a i ßi-1 , ßi =ci /(bi -a i ßi ),
求解Ax=f等价于解两个三角方程组:
Ly=f,求y;UX=y,求X 。 (1) 计算ßi 的递推公式
ß1 =c1/b1 ,
ßi =ci /(bi -a i ßi-1);i=2,3………..n-1。 (2) 解Ly=f
y 1 = f1 / b1 ,
y i = (fi – ai y i-1)/(bi - a i ßi-1),i=2,3……n ;
ß1
(3) 解Ux=y
X n =yn ,
X i =yi - ßi X i+1,i=n-1,n-2………2,1.
七. 编写追赶法的c 语言代码如下:
#include"stdio.h" int main() { double
a[99],b[100],c[99],num[100][100],x[100],y[99],r[99],f[100],x1[100],y1[100];
int n; bool pan=true; for(int i=0;i
while(pan) {
printf("*******************************追赶法f[i]=0; x1[i]=0; y1[i]=0;
公式解法**********************************");
printf("输入的矩阵是(n
退出!):");
scanf("%d",&n); if(n>0) {
for(int i=0;i
printf("输入a(x)的值为(用空格隔开):");//输入a 的值 for(int i=0;i
scanf("%lf",&a[i]); }
printf("输入b(x)的值为(用空格隔开):");//输入b 的值 for(int i=0;i
scanf("%lf",&b[i]); }
for(int j=0;j
num[i][j]=0;
printf("输入c(x)的值为(用空格隔开):");//输入c 的值 for(int i=0;i
scanf("%lf",&c[i]); }
for(int i=0;i
{ for(int j=0;j
}
else if(i-j==1) { num[i][j]=a[i-1]; }
else if(j-i==1) { num[i][j]=c[i];
}
b ,c 传入二元数组
中
{ num[i][j]=0;
}
}
}
printf("---------------------------------矩阵--------------------------------------");//输出A 的矩阵
for(int i=0;i
}
printf("丨"); printf("\n");
}
y[0]=c[0]/b[0];
for(int i=1;i
y[i]=c[i]/(b[i]-a[i-1]*y[i-1]); A 为;
x[0]=b[0]; for(int i=1;i
for(int i=0;i
for(int i=0;i
for(int i=0;i
for(int j=0;j
if(i==j) for(int j=0;j
num[i][j]=0; r[i]=a[i];
x[i]=b[i]-a[i-1]*y[i-1];
num[i][j]=x[i]; }
else if(i-j==1) { num[i][j]=r[i-1];
} else { num[i][j]=0; }
}
}
printf("---------------------------------矩--------------------------------------");//输出L 的矩阵 for(int i=0;i
}
L 为;
阵
}
printf("丨"); printf("\n");
for(int i=0;i
for(int i=0;i
for(int j=0;j
if(i==j) { }
else if(j-i==1) { }
num[i][j]=y[i]; num[i][j]=1; for(int j=0;j
num[i][j]=0;
else { num[i][j]=0;
}
}
}
printf("---------------------------------矩阵U 为--------------------------------------");//输出U 的矩阵
for(int i=0;i
}
printf("丨"); printf("\n");
}
printf("\n");
printf("输入矩阵右端的f 的值(空格隔开) :"); for(int i=0;i
{
;
} y1[0]=f[0]/b[0]; for(int i=1;i=0;i--)//求x 的值 { } printf("输出函数的x 与y 的值为:\n"); for(int i=0;i
} { } pan=false;
return 1;
}
八.cfree 运行的结果:
九. 实验心得: ***************