数值分析上机作业参考答案交14789.docx
《数值分析上机作业参考答案交14789.docx》由会员分享,可在线阅读,更多相关《数值分析上机作业参考答案交14789.docx(17页珍藏版)》请在冰豆网上搜索。
![数值分析上机作业参考答案交14789.docx](https://file1.bdocx.com/fileroot1/2022-10/29/ed2d2c71-fe5f-49a8-bb12-04759ce88596/ed2d2c71-fe5f-49a8-bb12-04759ce885961.gif)
数值分析上机作业参考答案交14789
数值分析上机作业
学院:
专业:
学号:
姓名
第一题
一、理论依据及算法
1:
Household法
(1)令A0=A,aij
(1)=aij,已知Ar-1即Ar-1=(aij(r))
(2)Sr=((air(r))2)1/2
(3)αr=Sr2+|a(r)r+1,r|Sr
ur=[0,0,a(r)r+1,r+Sign(a(r)r+1,r)Sr,a(r)r+2,r,…,anr(r)]T
(4)yr=Ar-1ur/αr
(5)kr=urTyr/2αr
(6)qr=yr-krur
(7)Ar=Ar-1-(qrurT+urqrT)r=(1,2,……n-2)
2:
超松弛法
其基本思想是在高斯方法已求出x(m),x(m-1)的基础上,组合新的序列,从而加快收敛速度。
其算式是:
xi(m)=(1-ω)xi(m-1)+ω(bijxi(m)+xj(m-1)+gi)
其中ω是超松弛因子,当ω>1时,可以加快收敛速度。
3:
主元消去法:
对矩阵作恰当的调整,选取绝对值尽量大的元素作为主元素。
然后把矩阵化为上三角阵,再进行回代,求出方程的解。
二、程序清单:
#include"math.h"
main()
{
inti,j,r,h;
doubles,sum,m,m1,n,k,u[9],q[9],y[9],w[9][9],
A[9][9]={
{12.38412,2.115237,-1.061074,1.112336,-0.113584,0.718719,1.742382,3.067813,-2.031743},{2.115237,19.141823,-3.125432,-1.012345,2.189736,1.563849,-0.784165,1.112348,3.123124},
{-1.061074,-3.125432,15.567914,3.123848,2.031454,1.836742,-1.056781,0.336993,-1.010103},
{1.112336,-1.012345,3.123848,27.108437,4.101011,-3.741856,2.101023,-0.71828,-0.037585},
{-0.113584,2.189736,2.031454,4.101011,19.897918,0.431637,-3.111223,2.121314,1.784317},
{0.718719,1.563849,1.836742,-3.741856,0.431637,9.789365,-0.103458,-1.103456,0.238417},
{1.742382,-0.784165,-1.056781,2.101023,-3.111223,-0.103458,14.713846,3.123789,-2.213474}
{3.067813,1.112348,0.336993,-0.71828,2.121314,-1.103456,3.123789,30.719334,4.446782},
{-2.031743,3.123124,-1.010103,-0.037585,1.784317,0.238417,-2.213474,4.446782,40.0001}};
doubley1;
r=0;
while(r<7)
{/*控制循环次数*/
sum=0;
for(h=r+1;h<9;h++)/*求s和n的值*/
sum=sum+A[h][r]*A[h][r];
s=sqrt(sum);
n=s*(s+fabs(A[r+1][r]));
if(A[r+1][r]>=0)
y1=1;
else
y1=-1;
for(i=0;iu[i]=0;
for(i=r+2;i<9;i++)
u[i]=A[i][r];
u[r+1]=A[r+1][r]+y1*s;
for(j=0;j<9;j++)/*求出y向量*/
{
m=0;
for(i=0;i<9;i++)
m=m+A[i][j]*u[i];
y[j]=m/n;
}
for(i=0;i<9;i++)/*求k和q的值*/
{
m1=0;
for(j=0;j<9;j++)
m1=m1+u[j]*y[j];
k=m1/(2*n);
q[i]=y[i]-k*u[i];
}
for(i=0;i<9;i++)/*求结果*/
for(j=0;j<9;j++)
{
w[i][j]=q[i]*u[j]+u[i]*q[j];
A[i][j]=A[i][j]-w[i][j];
}
r++;
}
printf("转化后的矩阵为:
B[9][9]=:
\n");/*打印转化后的矩阵*/
for(i=0;i<=8;i++)
{
for(j=0;j<=8;j++)
printf("%4.4f",A[i][j]);
printf("\n");
}
}
用超松弛法解方程组
#include"math.h"
main()
{
inti,j,k,r,m;
doublew=1.4,g1[9],B1[9][9],b[9][9],x[9]={0},
g[9]={2.1874369,33.992318,-25.173417,0.84671695,1.784317,
-86.612343,1.1101230,4.719345,-5.6784392},
B[9][9]={{12.384120,-4.893077},{-4.893077,25.398416,6.494097},
{0,6.494097,20.611499,8.243925},{0,0,8.243925,23.422838,-13.880071},
{0,0,0,-13.880071,29.698278,4.534502},{0,0,0,0,4.534502,16.00617,4.881435},
{0,0,0,0,0,4.881435,26.013315,-4.503635},{0,0,0,0,0,0,-4.503635,21.254061,4.504498},
{0,0,0,0,0,0,0,4.504498,14.534122}},
e[9][9]={{1},{0,1},{0,0,1},{0,0,0,1},{0,0,0,0,1},{0,0,0,0,0,1},{0,0,0,0,0,0,1},
{0,0,0,0,0,0,0,1},{0,0,0,0,0,0,0,0,1}};
i=0;
j=0;
while(i<9)/*求出矩阵b和g1的值*/
{
while(j<9)
{
B1[i][j]=B[i][j]/B[i][i];
b[i][j]=e[i][j]-B1[i][j];
j++;
}
g1[i]=g[i]/B[i][i];
i++;
}
k=0;
while(k<9)/*执行本算法*/
{
x[0]=(1-w)*x[0]+w*(b[0][1]*x[1]+g1[0]);
for(r=1;r<8;r++)
x[r]=(1-w)*x[r]+w*(b[r][r-1]*x[r-1]+b[r][r+1]*x[r+1]+g1[r]);
x[8]=(1-w)*x[8]+w*(b[8][7]*x[7]+g1[8]);
k++;
}
for(m=0;m<9;m++)/*输出结果*/
printf("%f\n",x[m]);
}_
用消去法解方程组
#include"math.h"
main()
{
inti,j,k,n;
doublex[9],m[9],l[9],h[9],
b[9]={2.1874369,33.992318,-25.173417,0.84671695,1.784317,-86.612343,
1.1101230,4.719345,-5.6784392},
B[9][9]={{12.3841,-4.8931,},{-4.8931,25.3984,6.4941,},{0,6.4941,20.6116,8.2440,},
{0,0,8.2440,23.4231,-13.8802,},{0,0,0,-13.8802,29.6980,4.5344,},{0,0,0,0,4.5344,16.0061,
4.8814,},{0,0,0,0,0,4.8814,26.0133,-4.5036,},{0,0,0,0,0,0,-4.5036,21.2541,4.5045},{0,0,0,0,0,
0,0,4.5045,14.5341}};
i=0;
while(i<8)/*迭代次数*/
{
l[i]=B[i+1][i]/B[i][i];
for(j=0;j<8;j++)/*求矩阵B和b的值*/
{
h[j]=B[i][j]*l[i];
B[i+1][j]=B[i+1][j]-h[j];
}
b[i+1]=b[i+1]-b[i]*l[i];
i++;
}
k=7;
while(k>0)/*求出x的值*/
{
x[8]=b[8]/B[8][8];
m[k]=b[k]-B[k][k+1]*x[k+1];
x[k]=m[k]/B[k][k];
m[0]=b[0]-B[0][1]*x[1];
x[0]=m[0]/B[0][0];
k--;
}
for(n=0;n<9;n++)
printf("%f\n",x[n]);
}
三、运行结果:
第一题
(1)结果为:
B[9][9]=
12.3841–4.89310.00000.00000.00000.00000.00000.00000.0000
-4.893125.39846.49410.00000.00000.00000.00000.00000.0000
0.00006.494120.61168.24400.00000.00000.00000.00000.0000
0.00000.00008.244023.4231-13.88020.00000.00000.00000.0000
0.00000.00000.0000-13.880229.69804.53440.00000.0000.0000
0.00000.00000.00000.00004.534416.00614.88140.00000.0000
0.00000.00000.00000.00000.00004.881426.0133-4.50360.0000
0.00000.00000.00000.00000.00000.0000-4.503621.25414.5045
0.00000.00000.00000.00000.00000.00000.00004.504514.5341
第一题
(2)结果为:
x[0]=1.073409x[1]=2.272579x[2]=-2.856599x[3]=2.292510x[4]=2.112159x[5]=-6.422562x[6]=1.357798x[7]=0.634258x[8]=-0.587041
第一题(3)结果为:
x[0]=1.075802x[1]=2.275736x[2]=–2.855472x[3]=2.293009x[4]=2.112517x[5]=–6.42