雅可比迭代法与矩阵的特征值.docx
- 文档编号:7469429
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:21
- 大小:263.41KB
雅可比迭代法与矩阵的特征值.docx
《雅可比迭代法与矩阵的特征值.docx》由会员分享,可在线阅读,更多相关《雅可比迭代法与矩阵的特征值.docx(21页珍藏版)》请在冰豆网上搜索。
雅可比迭代法与矩阵的特征值
实验五
矩阵的lu分解法,雅可比迭代法
班级:
学号:
姓名:
实验五矩阵的LU分解法,雅可比迭代
一、目的与要求:
熟悉求解线性方程组的有关理论和方法;
会编制列主元消去法、LU分解法、雅可比及高斯—塞德尔迭代法德程序;
通过实际计算,进一步了解各种方法的优缺点,选择合适的数值方法。
二、实验内容:
会编制列主元消去法、LU分解法、雅可比及高斯—塞德尔迭代法德程序,进一步了解各种方法的优缺点。
三、程序与实例
列主元高斯消去法
算法:
将方程用增广矩阵[A∣b]=(
表示
1)消元过程
对k=1,2,…,n-1
①选主元,找
使得
=
②如果
,则矩阵A奇异,程序结束;否则执行③。
③如果
,则交换第k行与第
行对应元素位置,
j=k,┅,n+1
④消元,对i=k+1,┅,n计算
对j=l+1,┅,n+1计算
2)回代过程
①若
,则矩阵A奇异,程序结束;否则执行②。
②
;对i=n-1,┅,2,1,计算
程序与实例
程序设计如下:
#include
#include
usingnamespacestd;
voiddisp(double**p,introw,intcol){
for(inti=0;i for(intj=0;j cout< cout< } } voiddisp(double*q,intn){ cout<<"====================================="< for(inti=0;i cout<<"X["< cout<<"====================================="< } voidinput(double**p,introw,intcol){ for(inti=0;i cout<<"输入第"< "; for(intj=0;j cin>>p[i][j]; } } intfindMax(double**p,intstart,intend){ intmax=start; for(inti=start;i if(abs(p[i][start])>abs(p[max][start])) max=i; } returnmax; } voidswapRow(double**p,intone,intother,intcol){ doubletemp=0; for(inti=0;i temp=p[one][i]; p[one][i]=p[other][i]; p[other][i]=temp; } } booldispel(double**p,introw,intcol){ for(inti=0;i 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]= #include usingnamespacestd; double**newMatrix(introw,intcol){ double**p=newdouble*[row];..."< double**A=newMatrix(n,n);...."< cout<<"====================================="< cout<<"开始录入列阵....."< cout<<"输入列阵: "; double*b=newdouble[n];..."< double**L=newMatrix(n,n); ..."< double**A=newMatrix(n,n);...."< cout<<"====================================="< cout<<"开始录入列阵....."< cout<<"输入列阵: "; double*b=newdouble[n];..."< cout<<"====================================="< cout<<"输入迭代次数容许的最大值: "; intM=0; cin>>M; cout<<"输入容许误差: "; doublee=0; cin>>e; cout<<"====================================="< double*x1=newdouble[n];//开辟x1向量 double*x2=newdouble[n];//开辟x2向量 cout<<"输入初始向量: "; for(inti=0;i cin>>x1[i]; cout<<"====================================="< intk=0;//迭代计数器 for(;;){ iterat(A,b,x1,x2,n);//迭代一次 if(blow_error(x1,x2,n,e)){ dispVector(x2,n); cout<<"迭代次数为: "< return0; }else{ if(k>=M){ cout<<"不收敛"< return0; }else{ k++; for(inti=0;i 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[1]= X[2]= #include<> #include<> #include<> #include<> #defineN100 main() { inti; float*x; floatc[12]={,,,, ,,, ,,}; float*GauseSeidel(float*,int); x=GauseSeidel(c,3); for(i=0;i<=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)); for(i=0;i<=n-1;i++)x[i]=; do { for(i=0;i<=n-1;i++) { d=; for(j=0;j<=n-1;j++) 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;k<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次得解 ,若用雅克比迭代法则发散。 #include<> #include<> 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); printf("请输入最大允许迭代次数: "); scanf("%d",&M); printf("请按行输入各方程系数: "); for(i=0;i<=n-1;i++) { for(j=0;j<=n-1;j++) { scanf("%f",&a[i][j]); } } printf("请输入各方程值: "); for(i=0;i<=n-1;i++) { scanf("%f",&b[i]); } printf("请依次输入首次迭代x值: "); for(i=0;i<=n-1;i++) { scanf("%f",&x[i]); } do { S=; for(i=0;i<=n-1;i++) { A[i]=x[i]; } LOOP(a,b,x,n); M--; for(i=0;i<=n-1;i++) { S=S+fabs(x[i]-A[i]); } }while(M>=0&&S>=; if(M>=0) { printf("迭代次数M=%d\n",M); for(i=0;i<=n-1;i++) { printf("x[%d]=%f\n",i,x[i]); } } else { printf("该迭代发散\n"); } } voidLOOP(floata[10][10],floatb[10],floatx[10],intn) { floatS1,S2,A[10]; inti,j; for(i=0;i<=n-1;i++) { A[i]=x[i]; } for(i=0;i<=n-1;i++) { S1=; S2=; for(j=0;j<=i-1;j++) { S1=S1+a[i][j]*x[j]; } for(j=i+1;j<=n-1;j++) { S2=S2+a[i][j]*A[j]; } x[i]=(b[i]-S1-S2)/a[i][i]; } } 实验六 矩阵的特征值与特征向量的计算 班级: 学号: 姓名: 实验六矩阵的特征值与特征向量的计算 一、目的与要求: 领会求矩阵特征值及特征向量的幂法的理论及其方法; 会编制幂法的计算程序,并用来计算有关问题。 二、实验内容: 编制幂法的计算程序,并用来计算有关问题 三、算法概要 幂法是矩阵主特征值的一种迭代方法。 设A R 有n个线性无关的特征向量x ,x ,x 而相应的特征值满足 > 则对任意非零初始向量 用幂法求矩阵 的按模最大的特征值和相应的特征向量。 精确至6位有效数字。 取 。 结果为A按模取最大的特征值为;相应的特征向量为 。 #include<> #include<> voidLOOP(floata[5][5],floatu[5],int); floatMAX(floatu[5],int); voidmain(void) { floata[5][5],u[5],x[5],y,z; inti,j,n; printf("请输入方阵阶数: "); scanf("%d",&n); printf("请按行输入各矩阵元素值: "); for(i=0;i<=n-1;i++) { for(j=0;j<=n-1;j++) { scanf("%f",&a[i][j]); } } printf("请输入初次迭代向量: "); for(i=0;i<=n-1;i++) { scanf("%f",&u[i]); } y=MAX(u,n); do { z=y; LOOP(a,u,n); y=MAX(u,n); for(i=0;i<=n-1;i++) { x[i]=u[i]/y; u[i]=x[i]; } }while(fabs(z-y)>=; printf("矩阵特征值λ=%f\n",y); printf("矩阵特征向量x: \n"); for(i=0;i<=n-1;i++) { printf("%10f\n",x[i]); } } voidLOOP(floata[5][5],floatu[5],intn) { floatS,U[5]; inti,j; for(i=0;i<=n-1;i++) { U[i]=u[i]; } for(i=0;i<=n-1;i++) { S=; for(j=0;j<=n-1;j++) { S=S+a[i][j]*U[j]; } u[i]=S; } } floatMAX(floatu[5],intn) { floatmax; inti; max=u[0]; for(i=0;i<=n-1;i++) { if(u[i]>max) { max=u[i]; } } return(max); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 可比 迭代法 矩阵 特征值