cout<<'\n';
}//输出改变后的数组
//输出解'''''''''''''''''''''''''''''''''''''''''''''''''''''''//
floatx[10];
for(i=n-1;i>=1;i--)
{
x[n]=a[n][n+1]/a[n][n];
floatsum3=0;
for(j=i+1;j<=n;j++)
sum3+=a[i][j]*x[j];
x[i]=(a[i][n+1]-sum3)/a[i][i];
}//回代过程
for(i=1;i<=n;i++)
{
cout<<'x'<
}//输出解向量
}
结果:
方程的解为:
x1=-0.28923,x2=0.34544,x3=-0.71281,
x4=-0.22061,x5=-0.43040,x6=0.15431,
x7=-0.057823,x8=0.20105,x9=0.29023。
分析:
我感觉是提高了查错误点的能力和编循环语句的能力,即利用很规整的迭代公式进行编程。
另外列主元三角分解法的阶梯步骤有了更深的了解!
36.逐次超松弛迭代法
(1)编制解n阶线性方程组Ax=b的SOR方法的通用程序(要求
);
(2)对于35题中所给的线性方程组,取松弛因子
,容许误差
,打印松弛因子、迭代次数、最佳松弛因子及解向量。
程序为:
#include
#include
#defineeps0.5e-5//迭代误差
voidmain(void)
{
inti,j,l;
floatw,t;
floatm[9];
floatsum;
floata[9][9]={{31,-13,0,0,0,-10,0,0,0},{-13,35,-9,0,-11,0,0,0,0},{0,-9,31,-10,0,0,0,0,0},{0,0,-10,79,-30,0,0,0,-9},{0,0,0,-30,57,-7,0,-5,0},{0,0,0,0,-7,47,-30,0,0},{0,0,0,0,0,-30,41,0,0},{0,0,0,0,-5,0,0,27,-2},
{0,0,0,-9,0,0,0,-2,29}};
floatb[9]={-15,27,-23,0,-20,12,-7,7,10};
floatmax(floatm[9]);
for(t=1;t<=99;t++)
{
l=0;
floatx0[9]={1,1,1,1,1,1,1,1,1};
floatx1[9]={1,1,1,1,1,1,1,1,1};
w=t/50;
do
{
for(i=0;i<9;i++)
{x0[i]=x1[i];}
for(i=0;i<9;i++)
{
sum=0;
for(j=0;j
{
sum=sum+a[i][j]*x1[j];
}
for(j=i+1;j<9;j++)
{sum=sum+a[i][j]*x0[j];}
x1[i]=(1-w)*x0[i]+w*(b[i]-sum)/a[i][i];}//解出九个解
for(i=0;i<9;i++)
{
m[i]=x1[i]-x0[i];}
l++;
}while(max(m)>=eps);
if(max(m)<=eps)
{cout<<"迭代次数="<for(i=0;i<9;i++)
cout<<"x1"<<"["<
cout<<"-------------------------------------"<<'\n';}
}
}
floatmax(floatm[9])//求出最大的迭代误差
{
floatk;
k=(fabs(m[0]));
for(inti=1;i<9;i++)
{
if(fabs(m[i])>k)
k=fabs(m[i]);
}
returnk;
}
结果为:
ω迭代次数ω迭代次数ω迭代次数ω迭代次数
0.021291
0.04700
0.06486
0.08373
0.10303
0.12255
0.14221
0.16194
0.18173
0.20156
0.22142
0.24130
0.26120
0.28111
0.30103
0.3296
0.3490
0.3685
0.3880
0.4075
0.4271
0.4468
0.4664
0.4861
0.5058
0.5255
0.5453
0.5651
0.5848
0.6046
0.6244
0.6442
0.6641
0.6839
0.7037
0.7236
0.7434
0.7633
0.7832
0.8030
0.8229
0.8428
0.8627
0.8826
0.9025
0.9224
0.9423
0.9622
0.9821
1.0020
1.0219
1.0418
1.0617
1.0816
1.1015
1.1215
1.1414
1.1612
1.1810
1.2011
1.2212
1.2412
1.2613
1.2813
1.3014
1.3215
1.3415
1.3616
1.3817
1.4018
1.4219
1.4419
1.4620
1.4821
1.5022
1.5224
1.5425
1.5627
1.5830
1.6031
1.6234
1.6436
1.6639
1.6844
1.7049
1.7255
1.7460
1.7671