雅可比迭代法与矩阵的特征值Word下载.docx
《雅可比迭代法与矩阵的特征值Word下载.docx》由会员分享,可在线阅读,更多相关《雅可比迭代法与矩阵的特征值Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
①若
否则执行②。
②
;
对i=n-1,┅,2,1,计算
程序与实例
程序设计如下:
#include<
iostream>
cmath>
usingnamespacestd;
voiddisp(double**p,introw,intcol){
for(inti=0;
i<
row;
i++){
for(intj=0;
j<
col;
j++)
cout<
<
p[i][j]<
'
'
;
endl;
}
}
voiddisp(double*q,intn){
"
====================================="
n;
i++)
X["
i+1<
]="
q[i]<
voidinput(double**p,introw,intcol){
输入第"
行:
cin>
>
p[i][j];
intfindMax(double**p,intstart,intend){
intmax=start;
for(inti=start;
end;
if(abs(p[i][start])>
abs(p[max][start]))
max=i;
returnmax;
voidswapRow(double**p,intone,intother,intcol){
doubletemp=0;
temp=p[one][i];
p[one][i]=p[other][i];
p[other][i]=temp;
booldispel(double**p,introw,intcol){
intflag=findMax(p,i,row);
用列主元消去法解方程
例2解方程组
计算结果如下
B=
C=
D=
E=
F=
矩阵直接三角分解法
将方程组Ax=b中的A分解为A=LU,其中L为单位下三角矩阵,U为上三角矩阵,则方程组Ax=b化为解2个方程组Ly=b,Ux=y,具体算法如下:
①对j=1,2,3,…,n计算
对i=2,3,…,n计算
②对k=1,2,3,…,n:
a.对j=k,k+1,…,n计算
b.对i=k+1,k+2,…,n计算
③
,对k=2,3,…,n计算
④
对k=n-1,n-2,…,2,1计算
注:
由于计算u的公式于计算y的公式形式上一样,故可直接对增广矩阵
[A∣b]=
施行算法②,③,此时U的第n+1列元素即为y。
例3求解方程组Ax=b
A=
b=
结果为
X[0]=
X[1]=
X[2]=
X[3]=
double**newMatrix(introw,intcol){
double**p=newdouble*[row];
..."
double**A=newMatrix(n,n);
...."
endl<
开始录入列阵....."
输入列阵:
double*b=newdouble[n];
double**L=newMatrix(n,n);
..."
输入迭代次数容许的最大值:
intM=0;
M;
输入容许误差:
doublee=0;
e;
double*x1=newdouble[n];
//开辟x1向量
double*x2=newdouble[n];
//开辟x2向量
输入初始向量:
x1[i];
intk=0;
//迭代计数器
for(;
){
iterat(A,b,x1,x2,n);
//迭代一次
if(blow_error(x1,x2,n,e)){
dispVector(x2,n);
迭代次数为:
k<
return0;
}else{
if(k>
=M){
不收敛"
k++;
x1[i]=x2[i];
//释放空间
delMatrix(A,n);
delete[]b;
delete[]x1;
delete[]x2;
高斯-塞尔德迭代法
算法:
设方程组Ax=b的系数矩阵的对角线元素,
M为迭代次数容许的最大值,ε为容许误差
①取初始向量
令k=0。
②对i=1,2,…,n计算
,则输出
结束;
否则执行④。
④如果
则不收敛,终止程序;
否则
转②。
例5用高斯-塞尔德迭代法解方程组
X[0]=
X[2]=
#defineN100
main()
{
inti;
float*x;
floatc[12]={,,,,
,,,
,,};
float*GauseSeidel(float*,int);
x=GauseSeidel(c,3);
for(i=0;
=2;
i++)printf("
x[%d]=%f\n"
i,x[i]);
getch();
float*GauseSeidel(float*a,intn)
inti,j,nu=0;
float*x,dx,d;
x=(float*)malloc(n*sizeof(float));
=n-1;
i++)x[i]=;
do
{
for(i=0;
{
d=;
for(j=0;
d+=*(a+i*(n+1)+j)*x[j];
dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));
x[i]+=dx;
}
if(nu>
=N)
printf("
foldnumber\n"
);
nu++;
while(fabs(dx)>
1e-6);
returnx;
例6用雅可比迭代法解方程组
迭代4次得解
若用高斯-塞尔德迭代法则发散。
#include<
voidmain(void)
intk,n;
doublex[3]={7,2,5};
for(k=0;
5;
k++)
doublea,b;
a=x[0];
b=x[1];
x[0]=*x[1]+2*x[2])/1;
x[1]=(2-a-x[2])/1;
x[2]=(5-2*a-2*b)/1;
for(n=0;
n<
3;
n++)
printf("
x[%d]=%\n"
n,x[n]);
用高斯-塞尔德迭代法解方程组
迭代84次得解
,若用雅克比迭代法则发散。
voidLOOP(floata[10][10],floatb[10],floatx[10],int);
voidmain(void)
floata[10][10],b[10],x[10],A[10];
doubleS;
intM,n,i,j;
printf("
请输入方阵阶数:
scanf("
%d"
&
n);
请输入最大允许迭代次数:
M);
请按行输入各方程系数:
for(i=0;
for(j=0;
scanf("
%f"
a[i][j]);
请输入各方程值:
scanf("
b[i]);
请依次输入首次迭代x值:
x[i]);
S=;
for(i=0;
A[i]=x[i];
LOOP(a,b,x,n);
M--;
S=S+fabs(x[i]-A[i]);
}while(M>
=0&
&
S>
=;
if(M>
=0)
迭代次数M=%d\n"
M);
else
该迭代发散\n"
voidLOOP(floata[10][10],floatb[10],floatx[10],intn)
floatS1,S2,A[10];
inti,j;
A[i]=x[i];
S1=;
S2=;
=i-1;
S1=S1+a[i][j]*x[j];
for(j=i+1;
S2=S2+a[i][j]*A[j];
x[i]=(b[i]-S1-S2)/a[i][i];
实验六
矩阵的特征值与特征向量的计算
实验六矩阵的特征值与特征向量的计算
领会求矩阵特征值及特征向量的幂法的理论及其方法;
会编制幂法的计算程序,并用来计算有关问题。
编制幂法的计算程序,并用来计算有关问题
三、算法概要
幂法是矩阵主特征值的一种迭代方法。
设A
R
有n个线性无关的特征向量x
,x
,x
而相应的特征值满足
则对任意非零初始向量
用幂法求矩阵
的按模最大的特征值和相应的特征向量。
精确至6位有效数字。
取
。
结果为A按模取最大的特征值为;
相应的特征向量为
voidLOOP(floata[5][5],floatu[5],int);
floatMAX(floatu[5],int);
floata[5][5],u[5],x[5],y,z;
inti,j,n;
请按行输入各矩阵元素值:
请输入初次迭代向量:
u[i]);
y=MAX(u,n);
z=y;
LOOP(a,u,n);
y=MAX(u,n);
x[i]=u[i]/y;
u[i]=x[i];
}while(fabs(z-y)>
矩阵特征值λ=%f\n"
y);
矩阵特征向量x:
\n"
%10f\n"
x[i]);
voidLOOP(floata[5][5],floatu[5],intn)
floatS,U[5];
U[i]=u[i];
S=S+a[i][j]*U[j];
u[i]=S;
floatMAX(floatu[5],intn)
floatmax;
max=u[0];
if(u[i]>
max)
max=u[i];
return(max);