return0;
}
voidchange(float(*a)[N+1],float(*b)[N+1])
{
intins,i;
for(i=0;i{
ins=*(*a+i);
*(*a+i)=*(*b+i);
*(*b+i)=ins;
}
}
计算结果如下:
主对角元素最大的矩阵整理后如下:
1351495314.78
1513534
因子表如下:
0.0074074111.0741314.78
15-0.032142934
前代后的矩阵如下(因子表不变,增广项发生了变化):
0.0074074111.07412.33171
15-0.03214290.0313584
得到的解如下:
7.27497
0.0313584
Pressanykeytocontinue
即有a=7.27497;b=0.0313584
则拟合方程为y=7.27497exp0.0313584*x;
4.设
,
,
分析下列迭代法的收敛性,并求
的近似解及相应的迭代次数。
(1)JACOBI迭代;
(2)GAUSS-SEIDEL迭代;
(3)SOR迭代(
)。
(1)
雅克比迭代法的程序如下:
#include
usingnamespacestd;
intmain()
{
floata[6][6]=
{
{4,-1,0,-1,0,0},
{-1,4,-1,0,-1,0},
{0,-1,4,-1,0,-1},
{-1,0,-1,4,-1,0},
{0,-1,0,-1,4,-1},
{0,0,-1,0,-1,4}
};
floatb[6]={0,5,-2,5,-2,6};
floatx[6]={0};//设x解列向量的初值为0
floatsum;
inti,j,k;
for(k=1;k<=10;k++)//计算10次
{
for(i=0;i<=5;i++)//每循环一次计算每一个x
{
sum=0;
for(j=0;j<=5;j++)//计算sum
{
sum+=a[i][j]*x[j];
}
x[i]=x[i]+(1/a[i][i])*(b[i]-sum);
}
}
for(i=0;i<=5;i++)
cout<<"x["<
return0;
}
迭代10次得到的解为:
x[0]=0.998445
x[1]=1.99831
x[2]=0.998577
x[3]=1.9987
x[4]=0.998928
x[5]=1.99938
Pressanykeytocontinue
(2)
Gauss—Seidel迭代法程序:
#include
usingnamespacestd;
intmain()
{
floata[6][6]=
{
{4,-1,0,-1,0,0},
{-1,4,-1,0,-1,0},
{0,-1,4,-1,0,-1},
{-1,0,-1,4,-1,0},
{0,-1,0,-1,4,-1},
{0,0,-1,0,-1,4}
};
floatb[6]={0,5,-2,5,-2,6};
floatx[6]={0};//设x解列向量的初值为0
floatsuma,sumb;
inti,j,k;
for(k=1;k<=10;k++)//计算10次
{
for(i=0;i<=5;i++)//每循环一次计算每一个x
{
suma=0;
for(j=0;j<=i-1;j++)//计算sum
{
suma+=a[i][j]*x[j];
}
sumb=0;
for(j=i;j<=5;j++)
{
sumb+=a[i][j]*x[j];
}
x[i]=x[i]+(1/a[i][i])*(b[i]-suma-sumb);
}
}
//输出结果
for(i=0;i<=5;i++)
cout<<"x["<
return0;
}
程序结果为:
x[0]=0.998445
x[1]=1.99831
x[2]=0.998577
x[3]=1.9987
x[4]=0.998928
x[5]=1.99938
Pressanykeytocontinue
(3)SOR程序将1/a[i][i]前乘上分别乘上加速系数,依题目要求为1.334,1.95,0.95
则求得的解分别为:
w=1.334时:
x[0]=1.00029
x[1]=1.99989
x[2]=1.00015
x[3]=2.00012
x[4]=0.999862
x[5]=2.00009
Pressanykeytocontinue
w=1.95时:
x[0]=2.04027
x[1]=2.40694
x[2]=1.32038
x[3]=1.24714
x[4]=0.429775
x[5]=2.42788
Pressanykeytocontinue
w=0.95时:
x[0]=0.996546
x[1]=1.99615
x[2]=0.996684
x[3]=1.99693
x[4]=0.99741
x[5]=1.99845
Pressanykeytocontinue
5.用逆幂迭代法求
最接近于11的特征值和特征向量,准确到
。
可以对矩阵A进行LU分解(doolittle分解)
LU分解的程序如下:
#include
usingnamespacestd;
#defineN3
intmain()
{
floata[N][N]=
{
{6,3,1},
{3,2,1},
{1,1,1},
};
floatl[N][N]={0},u[N][N]={0},sum=0;
inti,j,k,r;
for(i=0;i{
l[i][i]=1;
}
for(k=0;k{
for(j=k;j{
sum=0;
for(r=0;r{
sum+=l[k][r]*u[r][j];
}
u[k][j]=a[k][j]-sum;
}
for(i=k+1;i{
sum=0;
for(r=0;r{
sum+=l[i][r]*u[r][k];
}
l[i][k]=(a[i][k]-sum)/u[k][k];
}
}
//输出l,u矩阵结果
cout<<"L矩阵的结果如下:
"<for(i=0;ifor(j=0;j{
cout<if(j==N-1)
cout<}
cout<<"U矩阵的结果如下:
"<for(i=0;ifor(j=0;j{
cout<
if(j==N-1)
cout<}
return0;
}
输出结果如下:
L矩阵的结果如下:
100
0.510
0.16666711
U矩阵的结果如下:
631
00.50.5
000.333333
Pressanykeytocontinue
然后进行规范化计算,用一下程序计算Y,u的解:
我用直接求解法,不断迭代,程序如下:
#include
#include
usingnamespacestd;
#defineN3
voidchange(double(*)[N+1],double(*)[N+1]);
intmain()
{
doublearray[N][N+1]=
{
{6,3,1,1},
{3,2,1,1},
{1,1,1,1}
};
doublemk;
double(*p)[N+1]=&array[0];
inti,j,k,m,n;
double*ptr[N];
for(n=1;n<=10;n++)
{
//使对角元素最大
for(k=0;k{
for(i=0;i{
if(abs(*(*(p+k)+k))change(p+k,p+k+i);
}
}
//开始计算
for(j=0;j{
ptr[j]=array[j];
}
*ptr[0]=1/(*ptr[0]);
for(i=1;i*(ptr[0]+i)=*ptr[0]**(ptr[0]+i);
for(j=1;j{
for(k=0;k<=j-1;k++)
{
for(i=1;i{
*(ptr[j]+i+k)=*(ptr[j]+i+k)-*(ptr[j]+k)**(ptr[k]+i+k);
}
}
*(ptr[j]+j)=1/(*(ptr[j]+j));
for(m=1;m{
*(ptr[j]+j+m)=*(ptr[j]+j+m)**(ptr[j]+j);
}
}
//前代过程如下,矩阵变态形式不变,但是增广项发生了变化
for(j=0;j{
for(i=0;i{
*(ptr[j]+N)=*(ptr[j]+N)-*(ptr[j]+i)**(ptr[i]+N);
}
*(ptr[j]+N)=*(ptr[j]+j)**(ptr[j]+N);
}
//前代过程结束后,进行回代过程,可以方便的求出方程的最终解
for(j=N-1;j>=0;j--)
{
for(i=0;i{
*(ptr[j]+N)=*