}
实验结果分析:
程序一运行结果:
程序二运行结果如下:
程序三运行结果如下:
对三个程序的运行结果进行比较,发现牛顿迭代法有明显的优越性,在得到相同结果的前提下,用牛顿迭代法编的程序循环部分运行的次数最少。
当运行一个大型的程序时,程序运行所花的时间是必须考虑的。
时间太长,严重影响程序的整体性能,所以这时候要寻找一种尽量减少时间的算法。
实验名称:
实验三线性方程组的数值解法
(一)
实验内容:
求解线性方程组
并比较计算结果精度(方程组精确解为
)
(1)顺序消去法;
(2)列主元消去法。
实验过程:
(1)顺序消元法解该方程组的代码如下:
#include"stdio.h"
main()
{
floatA[4][5]={{1.1348,3.8326,1.1651,3.4017,9.5342},{0.5301,1.7875,2.5330,1.5435,6.3941},
{3.4129,4.9317,8.7643,1.3142,18.4231},{1.2371,4.9998,10.6721,0.0147,16.9237}};
floatT[4][5];
floatX[5];
inti,j,k;
printf("按顺序消元法,将方程组转化为上三角矩阵形式如下:
\n");
for(j=0;j<3;j++)
{
for(i=1;i<4;i++)
{
T[i][j]=A[i+j][j]/A[j][j];
for(k=j;k<5;k++)
{
A[i+j][k]=A[i+j][k]-A[j][k]*T[i][j];
}
}
}
for(i=0;i<4;i++)
{
for(j=0;j<5;j++)
{
printf("%.4f\t",A[i][j]);
}
printf("\n");
}
printf("方程组的解如下:
\n");
X[4]=A[3][4]/A[3][3];
X[3]=(A[2][4]-A[2][3]*X[4])/A[2][2];
X[2]=(A[1][4]-A[1][3]*X[4]-A[1][2]*X[3])/A[1][1];
X[1]=(A[0][4]-A[0][3]*X[4]-A[0][2]*X[3]-A[0][1]*X[2])/A[0][0];
printf("x1=%.4f\t\nx2=%.4f\t\nx3=%.4f\t\nx4=%.4f\t",X[1],X[2],X[3],X[4]);
}
(2)列主元消去法解该方程的程序代码如下:
#include"stdio.h"
main()
{
floatA[4][5]={{1.1348,3.8326,1.1651,3.4017,9.5342},{0.5301,1.7875,2.5330,1.5435,6.3941},
{3.4129,4.9317,8.7643,1.3142,18.4231},{1.2371,4.9998,10.6721,0.0147,16.9237}};
floatT[4][5];
floatX[5],MAX[5],ZD[5];
inti,j,k,l,m;
printf("按列组消元法,将方程组转化为上三角矩阵形式如下:
\n");
for(j=0;j<3;j++)
{
MAX[j]=A[j][j];
for(l=1;l<4-j;l++)
{
if(A[l+j][j]>MAX[j])
{
MAX[j]=A[l+j][j];
}
}
for(l=0;l<4-j;l++)
{
if(MAX[j]==A[l+j][j])
{
for(m=j;m<5;m++)
{
ZD[m]=A[j][m];
A[j][m]=A[l+j][m];
A[l+j][m]=ZD[m];
}
}
}
for(i=1;i<4;i++)
{
T[i][j]=A[i+j][j]/A[j][j];
for(k=j;k<5;k++)
{
A[i+j][k]=A[i+j][k]-A[j][k]*T[i][j];
}
}
}
for(i=0;i<4;i++)
{
for(j=0;j<5;j++)
{
printf("%.4f\t",A[i][j]);
}
printf("\n");
}
printf("方程组的解如下:
\n");
X[4]=A[3][4]/A[3][3];
X[3]=(A[2][4]-A[2][3]*X[4])/A[2][2];
X[2]=(A[1][4]-A[1][3]*X[4]-A[1][2]*X[3])/A[1][1];
X[1]=(A[0][4]-A[0][3]*X[4]-A[0][2]*X[3]-A[0][1]*X[2])/A[0][0];
printf("x1=%.4f\t\nx2=%.4f\t\nx3=%.4f\t\nx4=%.4f\t",X[1],X[2],X[3],X[4]);
}
实验结果分析:
(1)顺序消元法程序运行结果如下所示:
(2)列组消元法程序运行结果如下所示:
在此题中,用顺序消元法解方程的时候,当把矩阵化成上三角矩阵时,第三个方程的X3的系数与其他系数相比,显得格外的大。
第二个方程的X2的系数与其他系数相比,又显得格外的小。
而当用列组消元法,这种情况得到了很大程度的解决,对结果的准确性有了一定的提高。
在程序运行的时候弹出下图所示的对话框:
但是程序能正常运行处结果。
在改实验的程序代码中,大量的运用了FOR语句,很多运算都是通过循环来解决的。
使得程序的代码行数得到了大大的降低。
实验名称:
实验四线性方程组的数值解法
(二)
实验内容:
利用杜利特尔分解方法求解线性方程组
实验过程:
程序代码如下:
#include"stdio.h"
main()
{
floatA[6][6]={{1,2,4,7,11,16},{2,3,5,8,12,17},{4,5,6,9,13,18},
{7,8,9,10,14,19},{11,12,13,14,15,20},{16,17,18,19,20,21}},L[6][6]={{1,0,0,0,0,0},{0,1,0,0,0,0},{0,0,1,0,0,0},
{0,0,0,1,0,0},{0,0,0,0,1,0},{0,0,0,0,0,1}},U[6][6]={{1,2,4,7,11,16},{0,0,0,0,0,0},{0,0,0,0,0,0},
{0,0,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,0}};
floatB[6]={{10},{11},{12},{13},{14},{15}};
floatY[6],X[6];
inti,j;
for(i=0;i<6;i++)L[i][0]=A[i][0]/L[0][0];
U[1][1]=(A[1][1]-L[1][0]*U[0][1])/L[1][1];
for(i=2;i<6;i++)
{
L[i][1]=(A[i][1]-L[i][0]*U[0][1])/U[1][1];
U[1][i]=(A[1][i]-L[1][0]*U[0][i])/L[1][1];
U[2][i]=(A[2][i]-L[2][0]*U[0][i]-L[2][1]*U[1][i])/L[2][2];
}
for(i=3;i<6;i++)
{
L[i][2]=(A[i][2]-L[i][0]*U[0][2]-L[i][1]*U[1][2])/U[2][2];
U[3][i]=(A[3][i]-L[3][0]*U[0][i]-L[3][1]*U[1][i]-L[3][2]*U[2][i])/L[3][3];
}
for(i=4;i<6;i++)
{
L[i][3]=(A[i][3]-L[i][0]*U[0][3]-L[i][1]*U[1][3]-L[i][2]*U[2][3])/U[3][3];
U[4][i]=(A[4][i]-L[4][0]*U[0][i]-L[4][1]*U[1][i]-L[4][2]*U[2][i]-L[4][3]*U[3][i])/L[4][4];
}
L[5][4]=(A[5][4]-L[5][0]*U[0][4]-L[5][1]*U[1][4]-L[5][2]*U[2][4]-L[5][3]*U[3][4])/U[4][4];
U[5][5]=(A[5][5]-L[5][0]*U[0][5]-L[5][1]*U[1][5]-L[5][2]*U[2][5]-L[5][3]*U[3][5]-L[5][4]*U[4][5])/L[5][5];
printf("矩阵A:
\n");
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
{
printf("%.0f\t",A[i][j]);
}
printf("\n");
}
printf("矩阵L:
\n");
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
{
printf("%.0f\t",L[i][j]);
}
printf("\n");
}
printf("矩阵U:
\n");
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
{
printf("%.0f\t",U[i][j]);
}
printf("\n");
}
Y[0]=B[0];
Y[1]=B[1]-L[1][0]*Y[0];
Y[2]=B[2]-L[2][0]*Y[0]-L[2][1]*Y[1];
Y[3]=B[3]-L[3][0]*Y[0]-L[3][1]*Y[1]-L[3][2]*Y[2];
Y[4]=B[4]-L[4][0]*Y[0]-L[4][1]*Y[1]-L[4][2]*Y[2]-L[4][3]*Y[3];
Y[5]=B[5]-L[5][0]*Y[0]-L[5][1]*Y[1]-L[5][2]*Y[2]-L[5][3]*Y[3]-L[5][4]*Y[4];
printf("Y的值:
\n");
printf("Y1=%.4f\nY2=%.4f\nY3=%.4f\nY4=%.4f\nY5=%.4f\nY6=%.4f\n",Y[0],Y[1],Y[2],Y[3],Y[4],Y[5]);
X[5]=Y[5]/U[5][5];
X[4]=(Y[4]-U[4][5]*X[5])/U[4][4];
X[3]=(Y[3]-U[3][5]*X[5]-U[3][4]*X[4])/U[3][3];
X[2]=(Y[2]-U[2][5]*X[5]-U[2][4]*X[4]-U[2][3]*X[3])/U[2][2];
X[1]=(Y[1]-U[1][5]*X[5]-U[1][4]*X[4]-U[1][3]*X[3]-U[1][2]*X[2])/U[1][1];
X[0]=(Y[0]-U[0][5]*X[5]-U[0][4]*X[4]-U[0][3]*X[3]-U[0][2]*X[2]-U[0][1]*X[1])/U[0][0];
printf("方程的解X的值:
\n");
printf("X1=%.4f\nX2=%.4f\nX3=%.4f\nX4=%.4f\nX5=%.4f\nX6=%.4f\n",X[0],X[1],X[2],X[3],X[4],X[5]);
}
实验结果分析:
程序运行结果如下:
实验名称:
实验五分段插值和拉格朗日插值实验
实验内容:
从函数表
x
0.0
0.1
0.195
0.3
0.401
0.5
f(x)
0.39894
0.39695
0.39142
0.38138
0.36812
0.35206
出发,用下列方法计算f(0.15),f(0.31),f(0.47)的近似值;
(1)分段线性插值
(2)分段二次插值
(3)全区间上拉格朗日插值
实验过程:
(1)分段线性插值的代码如下:
#include"stdio.h"
main()
{
floatX[6]={0.0,0.1,0.195,0.3,0.401,0.5},Y[6]={0.39894,0.39695,0.39142,0.38138,0.36812,0.35206};
inti,n,t,YorN;
floatx,y;
do{
printf("请输入x的值:
\nx=");
scanf("%f",&x);
for(i=0;i<6;i++)
{
if(x{
t=i;
break;
}
}
y=Y[i-1]*(x-X[i])/(X[i-1]-X[i])+Y[i]*(x-X[i-1])/(X[i]-X[i-1]);
printf("近似值Y为:
%f\n",y);
printf("是否继续进行插值计算?
\n请输入1or0(1代表继续,0代表不继续)。
\n");
scanf("%d",&YorN);
}
while(YorN==1);
}
(2)分段二次插值的代码如下:
#include"stdio.h"
main()
{
floatX[6]={0.0,0.1,0.195,0.3,0.401,0.5},Y[6]={0.39894,0.39695,0.39142,0.38138,0.36812,0.35206};
inti,n,t,YorN;
floatx,y;
floatXCHZ[5];
do{
printf("请输入x的值:
\nx=");
scanf("%f",&x);
for(i=0;i<6;i++)
{
if(x{
t=i;
break;
}
}
y=Y[i-2]*(x-X[i-1])*(x-X[i])/((X[i-2]-X[i-1])*(X[i-2]-X[i]))+
Y[i-1]*(x-X[i-2])*(x-X[i])/((X[i-1]-X[i-2])*(X[i-1]-X[i]))+
Y[i]*(x-X[i-2])*(x-X[i-1])/((X[i]-X[i-2])*(X[i]-X[i-1]));
printf("近似值Y为:
%f\n",y);
printf("是否继续进行插值计算?
\n请输入1or0(1代表继续,0代表不继续)。
\n");
scanf("%d",&YorN);
}
while(YorN==1);
}
(3)全区间上拉格朗日插值程序代码如下:
#include"stdio.h"
main()
{
floatX[6]={0.0,0.1,0.195,0.3,0.401,0.5},Y[6]={0.39894,0.39695,0.39142,0.38138,0.36812,0.35206};
inti,n,t,YorN;
floatx,y;
floatXCHZ[5],F0,F1[5],F2[4],F3[3],F4[2],F5[1];
F0=Y[0];
for(i=0;i<5;i++)
{
F1[i]=(Y[i+1]-Y[i])/(X[i+1]-X[i]);
}
for(i=0;i<4;i++)
{
F2[i]=(F1[i+1]-F1[i])/(X[i+2]-X[i]);
}
for(i=0;i<3;i++)
{
F3[i]=(F2[i+1]-F2[i])/(X[i+3]-X[i]);
}
for(i=0;i<2;i++)
{
F4[i]