雅克比法求矩阵特征值特征向量

合集下载

《实验8:Jacobi法求实对称矩阵的特征值及特征向量》

《实验8:Jacobi法求实对称矩阵的特征值及特征向量》

实验名称实验8实验地点6A-XXX 实验类型设计实验学时 2 实验日期20 /X/X ★撰写注意:版面格式已设置好(不得更改),填入内容即可。

一、实验目的
1.Jacobi法求实对称矩阵的特征值及特征向量
二、实验内容
1.实验任务
1.Jacobi法求实对称矩阵的特征值及特征向量
2.程序设计
1)数据输入(输入哪些数据、个数、类型、来源、输入方式)
double a[N][N], int n
2)数据存储(输入数据在内存中的存储)
函数
void Jacobi(double a[N][N], int n)
3)数据处理(说明处理步骤。

若不是非常简单,需要绘制流程图)
1.输入要处理的数据进入变量中
2.进行函数处理
3.输出函数处理结果
4)数据输出(贴图:程序运行结果截图。

图幅大小适当,不能太大)
三、实验环境
1.操作系统:WINDOWS 7及以上
2.开发工具:VS 2015
3.实验设备:PC。

雅可比迭代法与矩阵的特征值

雅可比迭代法与矩阵的特征值

实验五矩阵的lu分解法,雅可比迭代法班级:学号::实验五 矩阵的LU 分解法,雅可比迭代一、目的与要求:➢ 熟悉求解线性方程组的有关理论和方法;➢ 会编制列主元消去法、LU 分解法、雅可比及高斯—塞德尔迭代法德程序;➢ 通过实际计算,进一步了解各种方法的优缺点,选择合适的数值方法。

二、实验内容:➢ 会编制列主元消去法、LU 分解法、雅可比及高斯—塞德尔迭代法德程序,进一步了解各种方法的优缺点。

三、程序与实例➢ 列主元高斯消去法算法:将方程用增广矩阵[A ∣b ]=(ij a )1n (n )+⨯表示1) 消元过程对k=1,2,…,n-1①选主元,找{}n ,,1k ,k i k +∈使得k ,i k a =ik a ni k max ≤≤ ②如果0a k ,i k =,则矩阵A 奇异,程序结束;否则执行③。

③如果k i k ≠,则交换第k 行与第k i 行对应元素位置,j i k j k a a ↔ j=k,┅,n+1④消元,对i=k+1, ┅,n 计算kk ik ik a a l /=对j=l+1, ┅,n+1计算kj ik ij ij a l a a -=2) 回代过程①若0=nn a ,则矩阵A 奇异,程序结束;否则执行②。

②nn n n n a a x /1,+=;对i=n-1, ┅,2,1,计算ii ni j j ij n i i a x a a x /11,⎪⎪⎭⎫ ⎝⎛-=∑+=+程序与实例程序设计如下:#include <iostream>#include <cmath>using namespace std;void disp(double** p,int row,int col){for(int i=0;i<row;i++){for(int j=0;j<col;j++)cout<<p[i][j]<<' ';cout<<endl;}}void disp(double* q,int n){cout<<"====================================="<<endl; for(int i=0;i<n;i++)cout<<"X["<<i+1<<"]="<<q[i]<<endl;cout<<"====================================="<<endl; }void input(double** p,int row,int col){for(int i=0;i<row;i++){cout<<"输入第"<<i+1<<"行:";for(int j=0;j<col;j++)cin>>p[i][j];}}int findMax(double** p,int start,int end){int max=start;for(int i=start;i<end;i++){if(abs(p[i][start])>abs(p[max][start]))max=i;}return max;}void swapRow(double** p,int one,int other,int col){double temp=0;for(int i=0;i<col;i++){temp=p[one][i];p[one][i]=p[other][i];p[other][i]=temp;}}bool dispel(double** p,int row,int col){for(int i=0;i<row;i++){int flag=findMax(p,i,row); //找列主元行号if(p[flag][i]==0) return false;swapRow(p,i,flag,col); //交换行for(int j=i+1;j<row;j++){double elem=p[j][i]/p[i][i]; //消元因子 p[j][i]=0;for(int k=i+1;k<col;k++){p[j][k]-=(elem*p[i][k]);}}}return true;}double sumRow(double** p,double* q,int row,int col){ double sum=0;for(int i=0;i<col-1;i++){if(i==row)continue;sum+=(q[i]*p[row][i]);}return sum;}void back(double** p,int row,int col,double* q){for(int i=row-1;i>=0;i--){q[i]=(p[i][col-1]-sumRow(p,q,i,col))/p[i][i]; }}int main(){cout<<"Input n:";int n; //方阵的大小cin>>n;double **p=new double* [n];for(int i=0;i<n;i++){p[i]=new double [n+1];}input(p,n,n+1);if(!dispel(p,n,n+1)){cout<<"奇异"<<endl;return 0;}double* q=new double[n];for(int i=0;i<n;i++)q[i]=0;back(p,n,n+1,q);disp(q,n);delete[] q;for(int i=0;i<n;i++)delete[] p[i];delete[] p;}1. 用列主元消去法解方程⎪⎩⎪⎨⎧=++-=++-=++035.3643x .5072x .1835x .2137.2623x .43712x 347x .1 1.1833.555x 2.304x 0.101x 321321321例2 解方程组⎪⎪⎪⎩⎪⎪⎪⎨⎧=++++=++++=++++=++++=++++-12.041.0F 1.02E 3.47D 1.04C 3.54B -6.301.0F2.01E 2.51D 4.04C 5.05B -8.531.0F 1.21E2.92D 1.46C3.53B -20.071.0F 1.10E4.48D 1.21C 4.93B -32.041.0F 1.55E5.66D 2.40C 8.77B 计算结果如下B=-1.461954C= 1.458125D=-6.004824E=-2.209018F= 14.719421➢矩阵直接三角分解法算法:将方程组A x=b 中的A分解为A=LU,其中L为单位下三角矩阵,U为上三角矩阵,则方程组A x=b化为解2个方程组Ly=b,Ux=y,具体算法如下:①对j=1,2,3,…,n计算jjau11=对i=2,3,…,n计算1111/aalii=②对k=1,2,3,…,n:a. 对j=k,k+1,…,n计算∑-=-=11kqqjkqkjkjulaub. 对i=k+1,k+2,…,n计算kkkqqkiqikikuulal/)(11∑-=-=③11by=,对k=2,3,…,n计算∑-=-=11kqqkqkkylby④nnnnuyx/=,对k=n-1,n-2,…,2,1计算kknkqqkqkkuxuyx/)(1∑+=-=注:由于计算u 的公式于计算y 的公式形式上一样,故可直接对增广矩阵[A ∣b ]=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡+++1,211,2222211,111211n n nn n n n n n n a a a a a a a a a a a a 施行算法②,③,此时U 的第n+1列元素即为y 。

雅克比过关法求特征值和特征向量

雅克比过关法求特征值和特征向量

1.//////////////////////////////////////////////////////////////////////2.// 求实对称矩阵特征值与特征向量的雅可比法3.//4.// 参数:5.// 1. double dblEigenValue[] - 一维数组,长度为矩阵的阶数,返回时存放特征值6.// 2. CMatrix& mtxEigenVector - 返回时存放特征向量矩阵,其中第i列为与7.// 数组dblEigenValue中第j个特征值对应的特征向量8.// 3. int nMaxIt - 迭代次数,默认值为609.// 4. double eps - 计算精度,默认值为0.00000110.//11.// 返回值:BOOL型,求解是否成功12.//////////////////////////////////////////////////////////////////////13.BOOL CMatrix::JacobiEigenv(double dblEigenValue[], CMatrix& mtxEigenVector, int nMaxIt /*= 60*/, double eps /*= 0.000001*/)14.{15.int i,j,p,q,u,w,t,s,l;16.double fm,cn,sn,omega,x,y,d;17.18.if (! mtxEigenVector.Init(m_nNumColumns, m_nNumColumns))19.return FALSE;20.21.l=1;22.for (i=0; i<=m_nNumColumns-1; i++)23.{24.mtxEigenVector.m_pData[i*m_nNumColumns+i]=1.0;25.for (j=0; j<=m_nNumColumns-1; j++)26.if (i!=j)27.mtxEigenVector.m_pData[i*m_nNumColumns+j]=0.0;//单位矩阵28.}29.30.while (TRUE)31.{32.fm=0.0;33.for (i=1; i<=m_nNumColumns-1; i++)34.{35.for (j=0; j<=i-1; j++)36.{37.d=fabs(m_pData[i*m_nNumColumns+j]);38.if ((i!=j)&&(d>fm))39.{40.fm=d;41.p=i;42.q=j;}//取绝对值最大的非对角线元素,并记住位置43.}44.}45.46.if (fm<eps)47.{48.for (i=0; i<m_nNumColumns; ++i)49.dblEigenValue = GetElement(i,i);50.return TRUE;51.}52.53.if (l>nMaxIt)54.return FALSE;55.56.l=l+1;57.u=p*m_nNumColumns+q;58.w=p*m_nNumColumns+p;59.t=q*m_nNumColumns+p;60.s=q*m_nNumColumns+q;61.x=-m_pData;62.y=(m_pData[s]-m_pData[w])/2.0;63.omega=x/sqrt(x*x+y*y);64.65.if (y<0.0)66.omega=-omega;67.68.sn=1.0+sqrt(1.0-omega*omega);69.sn=omega/sqrt(2.0*sn);//sin=sqrt(1.0-sn*sn);//cos71.fm=m_pData[w];72.m_pData[w]=fm*cn*cn+m_pData[s]*sn*sn+m_pData*omega;73.m_pData[s]=fm*sn*sn+m_pData[s]*cn*cn-m_pData*omega;74.m_pData=0.0;75.m_pData[t]=0.0;76.for (j=0; j<=m_nNumColumns-1; j++)77.{78.if ((j!=p)&&(j!=q))79.{80.u=p*m_nNumColumns+j; w=q*m_nNumColumns+j;81.fm=m_pData;82.m_pData=fm*cn+m_pData[w]*sn;83.m_pData[w]=-fm*sn+m_pData[w]*cn;84.}85.}86.for (i=0; i<=m_nNumColumns-1; i++)87.{88.if ((i!=p)&&(i!=q))89.{90.u=i*m_nNumColumns+p;91.w=i*m_nNumColumns+q;92.fm=m_pData;93.m_pData=fm*cn+m_pData[w]*sn;94.m_pData[w]=-fm*sn+m_pData[w]*cn;95.}96.}97.98.for (i=0; i<=m_nNumColumns-1; i++)99.{100.u=i*m_nNumColumns+p;101.w=i*m_nNumColumns+q;102.fm=mtxEigenVector.m_pData;103.mtxEigenVector.m_pData=fm*cn+mtxEigenVector.m_pData[w]*sn; 104.mtxEigenVector.m_pData[w]=-fm*sn+mtxEigenVector.m_pData[w]*cn; 105.}106.107.}108.109.for (i=0; i<m_nNumColumns; ++i)110.dblEigenValue = GetElement(i,i);111.112.return TRUE;113.}。

雅克比法求矩阵特征值特征向量

雅克比法求矩阵特征值特征向量

C语言课程设计报告课程名称:计算机综合课程设计学院:土木工程学院设计题目:矩阵特征值分解级别:B学生姓名:学号:同组学生:无学号:无指导教师:2012年9月5日C语言课程设计任务书(以下要求需写入设计报告书)学生选题说明:以所发课程设计要求为准,请同学们仔细阅读;本任务书提供的设计案例仅供选题参考;也可自选,但难易程度需难度相当;鼓励结合本专业(土木工程、力学)知识进行选题,编制程序解决专业实际问题。

限2人选的题目可由1-2人完成(A级);限1人选的题目只能由1人单独完成(B级);设计总体要求:采用模块化程序设计;鼓励可视化编程;源程序中应有足够的注释;学生可自行增加新功能模块(视情况可另外加分);必须上机调试通过;注重算法运用,优化存储效率与运算效率;需提交源程序(含有注释)及相关文件(数据或数据库文件);(cpp文件、txt或dat文件等) 提交设计报告书,具体要求见以下说明。

设计报告格式:目录1.课程设计任务书(功能简介、课程设计要求);2.系统设计(包括总体结构、模块、功能等,辅以程序设计组成框图、流程图解释);3.模块设计(主要模块功能、源代码、注释(如函数功能、入口及出口参数说明,函数调用关系描述等);4.调试及测试:(调试方法,测试结果的分析与讨论,截屏、正确性分析);5.设计总结:(编程中遇到的问题及解决方法);6.心得体会及致谢;参考文献1.课程设计任务书功能简介:a)输入一个对称正方矩阵A,从文本文件读入;b)对矩阵A进行特征值分解,将分解结果:即U矩阵、S矩阵输出至文本文件;c)将最小特征值及对应的特征向量输出至文本文件;d)验证其分解结果是否正确。

提示:A=USUT,具体算法可参考相关文献。

功能说明:矩阵特征值分解被广泛运用于土木工程问题的数值计算中,如可用于计算结构自振频率与自振周期、结构特征屈曲问题等。

注:以三阶对称矩阵为例2.系统设计总体结构main函数tezheng函数从文本文找矩阵A递推求矩递推求矩向屏幕和向屏幕和求最小特阵S件中读入阵U中非对角txt文件输txt文件输征值及其数组A入矩阵U入矩阵S元素中的对应特征最大值,向量,并并记下其输出到屏位置幕和txt文件中3.模块设计#include<stdio.h>#include<stdlib.h>#include<math.h>intmain(){FILE*fp;inttezheng(double*a,intn,double*s,double*u,doubleeps,intitmax);//函数调用声明inti,j,p,itmax=1000;//itmax为最大循环次数doubleeps=1e-7,s[3][3],u[3][3];//eps为元素精度,s为对角矩阵S,u为矩阵U doublea[9];//a为待分解矩阵Ai=tezheng(a,3,s,u,eps,1000);WORD格式if(i>0)//i对应函数中的返回值it{if((fp=fopen("juzhen.txt","w"))==NULL)//打开待输入txt文件{printf("无法打开文件.\n");return;}printf("U矩阵为:\n");//下几句分别向屏幕和txt文件输入矩阵Ufprintf(fp,"U矩阵为:\n");for(i=0;i<3;i++){for(j=0;j<3;j++){printf("%10.6f",u[i][j]);fprintf(fp,"%10.6f",u[i][j]);}printf("\n");fprintf(fp,"\n");}printf("S对角矩阵为:\n");//下几句分别向屏幕和txt文件输入矩阵Sfprintf(fp,"S对角矩阵为:\n");for(i=0;i<3;i++){for(j=0;j<3;j++){printf("%10.6f",s[i][j]);fprintf(fp,"%10.6f",s[i][j]);}printf("\n");fprintf(fp,"\n");}p=0;for(i=0;i<3;i++)//下面几句为求最小特征值及其对应特征向量,并输出到屏幕和txt文件中if(s[i][i]<s[0][0])p=i;printf("最小特征值为:%10.6f\n",s[p][p]);fprintf(fp,"最小特征值为:%10.6f\n",s[p][p]);printf("对应特征向量为:\n");fprintf(fp,"对应特征向量为:\n");for(i=0;i<3;i++){printf("%10.6f\n",u[i][p]);fprintf(fp,"%10.6f\n",u[i][p]);}}}inttezheng(double*a,intn,doubles[3][3],doubleu[3][3],doubleeps,intitmax){FILE*A;charline[1000];//存放从文件juzhenA.txt读入的数据char*k="";inti,j,p,q,it;doublesint,cost,sin2t,cos2t,d,tmp,t1,t2,t3,fm;it=0;if((A=fopen("juzhenA.txt","r"))==NULL){printf("无法打开文件\n");return;}fgets(line,1000,A);//从文件指针A指向的文件,即juzhenA.txt中读入字符数据到数组line中strtok(line,k);//原型char*strtok(char*s,constchar*delim);说明:strtok()用来将字符串分割成一个个片段。

雅可比矩阵求特征方程

雅可比矩阵求特征方程

雅可比矩阵求特征方程雅可比矩阵是一种将多元函数的偏导数矩阵以及变量向量形式组合起来的矩阵。

在数学中,雅可比矩阵的特征方程是对于该矩阵进行特征值分解之后得到的特征向量满足的特殊方程。

本文将详细介绍雅可比矩阵的概念、特征值与特征向量的计算方法,以及特征方程的推导过程。

为了更好地理解雅可比矩阵,我们首先给出它的定义。

设有多元函数f(x1, x2, ..., xn),其中x1, x2, ..., xn为n个变量。

那么该函数关于这n个变量的雅可比矩阵J可以表示为:J = ( ∂f1/∂x1, ∂f1/∂x2, ..., ∂f1/∂xn;∂f2/∂x1, ∂f2/∂x2, ..., ∂f2/∂xn;...∂fn/∂x1, ∂fn/∂x2, ..., ∂fn/∂xn )其中,∂fj/∂xi表示f对变量xi的偏导数。

这个矩阵的维度为n×n,每个元素都是一个偏导数。

现在我们考虑如何求解雅可比矩阵的特征方程。

设J是一个n阶方阵,特征值为λ,特征向量为v,那么有以下的特征方程:Jv=λv对于特征向量v的每一个分量vi,我们可以写作:Jv = (j1, j2, ..., jn)=λv= (λv1, λv2, ..., λvn)根据矩阵与向量的乘法规则,有:ðf1/∂x1 * v1 + ðf1/∂x2 * v2 + ... + ðf1/∂xn * vn = λv1ðf2/∂x1 * v1 + ðf2/∂x2 * v2 + ... + ðf2/∂xn * vn = λv2 ...ðfn/∂x1 * v1 + ðfn/∂x2 * v2 + ... + ðfn/∂xn * vn = λvn 将上述方程用矩阵的形式表示,可以写为:Jv=λv⇒ ( ∂f1/∂x1, ∂f1/∂x2, ..., ∂f1/∂xn;∂f2/∂x1, ∂f2/∂x2, ..., ∂f2/∂xn;...∂fn/∂x1, ∂fn/∂x2, ..., ∂fn/∂xn )* (v1, v2, ..., vn)= (λv1, λv2, ..., λvn)那么可以得到以下的方程组:∂f1/∂x1 * v1 + ∂f1/∂x2 * v2 + ... + ∂f1/∂xn * vn = λv1∂f2/∂x1 * v1 + ∂f2/∂x2 * v2 + ... + ∂f2/∂xn * vn = λv2 ...∂fn/∂x1 * v1 + ∂fn/∂x2 * v2 + ... + ∂fn/∂xn * vn = λvn以上方程可化简为:(∂f1/∂x1 - λ)v1 + ∂f1/∂x2 * v2 + ... + ∂f1/∂xn * vn = 0∂f2/∂x1 * v1 + (∂f2/∂x2 - λ)v2 + ... + ∂f2/∂xn * vn = 0...∂fn/∂x1 * v1 + ∂fn/∂x2 * v2 + ... + (∂fn/∂xn - λ)vn = 0注意到方程左侧的形式与行列式的形式相似,我们可以进一步将方程化简为:(∂f1/∂x1 - λ)v1 + ∂f1/∂x2 * v2 + ... + ∂f1/∂xn * vn = 0∂f2/∂x1 * v1 + (∂f2/∂x2 - λ)v2 + ... + ∂f2/∂xn * vn = 0...∂fn/∂x1 * v1 + ∂fn/∂x2 * v2 + ... + (∂fn/∂xn - λ)vn = 0写成矩阵的形式:(∂f1/∂x1 - λ, ∂f1/∂x2, ..., ∂f1/∂xn;∂f2/∂x1, (∂f2/∂x2 - λ), ..., ∂f2/∂xn;...∂fn/∂x1, ∂fn/∂x2, ..., (∂fn/∂xn - λ) )* (v1, v2, ..., vn)=(0,0, 0这是一个关于λ和v的齐次线性方程组,若存在非零解v,则其中必然存在一个非零特征值λ。

雅可比算法求矩阵的特征值和特征向量

雅可比算法求矩阵的特征值和特征向量

雅可⽐算法求矩阵的特征值和特征向量⽬的求⼀个实对称矩阵的所有特征值和特征向量。

前置知识对于⼀个实对称矩阵A ,必存在对⾓阵D 和正交阵U 满⾜D =U T AUD 的对⾓线元素为A 的特征值,U 的列向量为A 的特征向量。

定义n 阶旋转矩阵G (p ,q ,θ)=1⋯0 ⋱ 1 cos θ−sin θ 10 ⋱ 0即在单位矩阵的基础上,修改a pp =a qq =cos θ,a qp =−a pq =sin θ对于n 阶向量α,α⋅G (p ,q ,θ)的⼏何意义是把α在与第p 维坐标轴和第q 维坐标轴平⾏的平⾯内旋转⾓度θ,并且旋转后的模长保持不变。

算法原理⼤概思路使通过旋转变换使⾮对⾓线上的元素不断变⼩,最后得到与原矩阵相似的对⾓矩阵。

每次找到矩阵A 绝对值最⼤的的⾮对⾓线元素,设为a pq ,令U =G (p ,q ,θ),将A 变换为U T AU变换后的值为通过令b p ,q =0解得θ=12arctan 2a pq a qq−a pp 特别地当a qq =a pp 时θ=π4注意到旋转操作并不会改变每个⾏向量或列向量的模长,即矩阵A 的F-范数||A ||F =∑i ∑j a 2ij 是不变的,并且通过计算可以得出$$b_{ip}2+b_{iq}2=a_{ip}2+a_{iq}2$$从⽽可以得知⾮对⾓线元素的平⽅和变⼩,对⾓线上元素的平⽅和增⼤,故⾮主对⾓线上元素的平⽅和收敛。

算法流程(1)令矩阵T =E ,即初始化单位矩阵(2)找到A 中绝对值最⼤的⾮对⾓选元素a pq(3)找到对应的⾓度θ,构造矩阵U =G (p ,q ,θ)(4)令A =U T AU ,T =TU(5)不停地重复(2)到(4),直到a pq <ϵ或迭代次数超过某个限定值,则A 的对⾓线元素近似等于A 的特征值,T 的列向量为A 的特征向量代码#include<bits/stdc++.h>using namespace std;const int N=1005;const double eps=1e-5;const int lim=100;int n,id[N];[√double key[N],mat[N][N],EigVal[N],EigVec[N][N],tmpEigVec[N][N];bool cmpEigVal(int x,int y){return key[x]>key[y];}void Find_Eigen(int n,double (*a)[N],double *EigVal,double (*EigVec)[N]){for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)EigVec[i][j]=0;for (int i=1;i<=n;i++) EigVec[i][i]=1.0;int count=0;while (1){//统计迭代次数count++;//找绝对值最⼤的元素double mx_val=0;int row_id,col_id;for (int i=1;i<n;i++)for (int j=i+1;j<=n;j++)if (fabs(a[i][j])>mx_val) mx_val=fabs(a[i][j]),row_id=i,col_id=j;if (mx_val<eps||count>lim) break;//进⾏旋转变换int p=row_id,q=col_id;double Apq=a[p][q],App=a[p][p],Aqq=a[q][q];double theta=0.5*atan2(-2.0*Apq,Aqq-App);double sint=sin(theta),cost=cos(theta);double sin2t=sin(2.0*theta),cos2t=cos(2.0*theta);a[p][p]=App*cost*cost+Aqq*sint*sint+2.0*Apq*cost*sint;a[q][q]=App*sint*sint+Aqq*cost*cost-2.0*Apq*cost*sint;a[p][q]=a[q][p]=0.5*(Aqq-App)*sin2t+Apq*cos2t;for (int i=1;i<=n;i++)if (i!=p&&i!=q){double u=a[p][i],v=a[q][i];a[p][i]=u*cost+v*sint;a[q][i]=v*cost-u*sint;u=a[i][p],v=a[i][q];a[i][p]=u*cost+v*sint;a[i][q]=v*cost-u*sint;}//计算特征向量for (int i=1;i<=n;i++){double u=EigVec[i][p],v=EigVec[i][q];EigVec[i][p]=u*cost+v*sint;EigVec[i][q]=v*cost-u*sint;}}//对特征值排序for (int i=1;i<=n;i++) id[i]=i,key[i]=a[i][i];std::sort(id+1,id+n+1,cmpEigVal);for (int i=1;i<=n;i++){EigVal[i]=a[id[i]][id[i]];for (int j=1;j<=n;j++)tmpEigVec[j][i]=EigVec[j][id[i]];}for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)EigVec[i][j]=tmpEigVec[i][j];//特征向量为列向量}int main(){scanf("%d",&n);for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)scanf("%lf",&mat[i][j]);Find_Eigen(n,mat,EigVal,EigVec);printf("EigenValues = ");for (int i=1;i<=n;i++) printf("%lf ",EigVal[i]);printf("\nEigenVector =\n");for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)printf("%lf%c",EigVec[i][j],j==n?'\n':' ');return 0;}Processing math: 100%。

雅克比法解特征值

雅克比法解特征值

A1 仍然是实对称阵,且 A1与 A 的特征值相同。

把式(3.12)的右端乘开,并与左端比较,得到A1 的元素计算公式:
A
(1)
a a (p11) a (1) q1 a (1) n1
(1) 11
a a a a
(1) 1p

4
sgn(a pq ).
2 tan 1 2 1 tan c

4
, 故 tan 1,
故可取 tan
sgn(c ) c c2 1
t

t sin t cos 1 t 2 则 1 1 cos 1 tan 2 1 t 2

i2 ( B) B .
2 i 1
F
n

对于 n 维列向量 x, Upq x 相当于把坐标轴Oxp和 Oxq于所在平面内旋转角度 。 记矩阵 A = [aij]n×n ,对A作一次正交相似变换, 得到矩阵A1。



A1= UpqT A Upq = [aij(1)]n×n
(3.12)
故可选择角θ,使
c12 c21 (a22 a11 ) sin cos a12 (cos sin ) 0
2 2
c12 c21 (a22 a11 ) sin cos a12 (cos2 sin 2 ) 0
即 tan 2 2a12 , a11 a22
1 2 a aij n(n 1) i j
2 pq
从而
a
i j
(1) 2 ij
2 2 1 aij n(n 1) i j

八、矩阵特征值的jacobi方法

八、矩阵特征值的jacobi方法

1、用jacobi方法计算对称矩阵A的特征值和对应的特征向量。

function [k,Bk,V,D,Wc]=jacobite(A,jd,max1[n,n]=size(A;P0=eye(n;Vk=eye(n;Bk=A;k=1;state=1;while ((k<=max1&(state==1aij=abs(Bk-diag(diag(Bk;[m1 i]=max(abs(aij;[m2 j]=max(m1;i=i(j;Aij=(Bk-diag(diag(Bk;mk=m2*sign(Aij(i,j;Wc=m2;Dk=diag(diag(Bk;Pk=P0;c=(Bk(j,j-Bk(i,i/(2*Bk(i,j;t=sign(c/(abs(c+sqrt(1+c^2;pii=1/(sqrt(1+t^2;pij=t/(sqrt(1+t^2;Pk(i,i=pii;Pk(i,j=pij;Pk(j,j=pii;Pk(j,i=-pij;B1=Pk'*Bk;B2=B1*Pk;Vk=Vk*Pk;Bk=B2;state=0;if (Wc>jdstate=1;endk,k=k+1;Pk,Vk,Bk=B2,Wc,endif (k>max1disp('迭代次数k已经达到最大迭代次数ma1,迭代次数k,对称矩阵Bk,以特征向量为列向量的矩阵V,特征值为对角元的对角矩阵D如下:'elsedisp('迭代次数k,对称矩阵Bk,以特征向量为列向量的矩阵V,特征值为对角元的对角矩阵D如下:'endk=k-1;Bk=B2;V=Vk;D=diag(diag(Bk;Wc;[V1,D1]=eig(A,'nobalance'>> A=[12 -56 3 -1;-56 7 2 0;3 2 5 1;-1 0 1 12];>> [k,Bk,V,D,Wc]=jacobite(A,0.0001,100k =1Pk =0.7227 0.6912 0 0-0.6912 0.7227 0 00 0 1.0000 00 0 0 1.0000 Vk =0.7227 0.6912 0 0-0.6912 0.7227 0 00 0 1.0000 00 0 0 1.0000 Bk =65.5558 0 0.7858 -0.7227-0.0000 -46.5558 3.5189 -0.69120.7858 3.5189 5.0000 1.0000-0.7227 -0.6912 1.0000 12.0000 Wc = 56k =2Pk =1.0000 0 0 00 0.9977 0.0678 00 -0.0678 0.9977 00 0 0 1.0000 Vk =0.7227 0.6896 0.0468 0-0.6912 0.7210 0.0490 00 -0.0678 0.9977 00 0 0 1.0000 Bk =65.5558 -0.0533 0.7840 -0.7227-0.0533 -46.7948 0 -0.75740.7840 0.0000 5.2391 0.9509-0.7227 -0.7574 0.9509 12.0000 Wc = 3.5189k =3Pk =1.0000 0 0 00 1.0000 0 00 0 0.9906 0.13670 0 -0.1367 0.9906 Vk =0.7227 0.6896 0.0464 0.0064-0.6912 0.7210 0.0485 0.00670 -0.0678 0.9883 0.13640 0 -0.1367 0.9906Bk =65.5558 -0.0533 0.8754 -0.6088-0.0533 -46.7948 0.1035 -0.75020.8754 0.1035 5.1079 -0.0000-0.6088 -0.7502 -0.0000 12.1312 Wc = 0.9509k =4Pk =0.9999 0 -0.0145 00 1.0000 0 00.0145 0 0.9999 00 0 0 1.0000 Vk =0.7233 0.6896 0.0359 0.0064-0.6904 0.7210 0.0585 0.00670.0143 -0.0678 0.9882 0.1364-0.0020 0 -0.1367 0.9906 Bk =65.5685 -0.0518 -0.0000 -0.6087-0.0518 -46.7948 0.1043 -0.7502-0.0000 0.1043 5.0952 0.0088-0.6087 -0.7502 0.0088 12.1312 Wc = 0.8754k =5Pk =1.0000 0 0 00 0.9999 0 -0.01270 0 1.0000 00 0.0127 0 0.9999 Vk =0.7233 0.6896 0.0359 -0.0024-0.6904 0.7211 0.0585 -0.00250.0143 -0.0660 0.9882 0.1372-0.0020 0.0126 -0.1367 0.9905 Bk = 65.5685 -0.0595 -0.0000 -0.6080-0.0595 -46.8044 0.1044 0.0000-0.0000 0.1044 5.0952 0.0075-0.6080 0.0000 0.0075 12.1407 Wc = 0.7502k =6Pk =0.9999 0 0 0.01140 1.0000 0 00 0 1.0000 0-0.0114 0 0 0.9999 Vk =0.7233 0.6896 0.0359 0.0059-0.6903 0.7211 0.0585 -0.01030.0127 -0.0660 0.9882 0.1374-0.0132 0.0126 -0.1367 0.9905 Bk = 65.5754 -0.0595 -0.0001 -0.0000-0.0595 -46.8044 0.1044 -0.0007-0.0001 0.1044 5.0952 0.0075-0.0000 -0.0007 0.0075 12.1338 Wc =0.6080k =7Pk =1.0000 0 0 00 1.0000 0.0020 00 -0.0020 1.0000 00 0 0 1.0000 Vk =0.7233 0.6895 0.0373 0.0059-0.6903 0.7209 0.0600 -0.01030.0127 -0.0680 0.9881 0.1374-0.0132 0.0129 -0.1366 0.9905 Bk = 65.5754 -0.0595 -0.0002 -0.0000-0.0595 -46.8046 -0.0000 -0.0007-0.0002 -0.0000 5.0954 0.0075-0.0000 -0.0007 0.0075 12.1338 Wc = 0.1044k =8Pk =1.0000 0.0005 0 0-0.0005 1.0000 0 00 0 1.0000 00 0 0 1.0000 Vk =0.7229 0.6899 0.0373 0.0059-0.6907 0.7206 0.0600 -0.01030.0128 -0.0680 0.9881 0.1374-0.0133 0.0129 -0.1366 0.9905 Bk = 65.5754 0.0000 -0.0002 0.0000-0.0000 -46.8046 -0.0000 -0.0007-0.0002 -0.0000 5.0954 0.00750.0000 -0.0007 0.0075 12.1338 Wc = 0.0595k =9Pk =1.0000 0 0 00 1.0000 0 00 0 1.0000 0.00110 0 -0.0011 1.0000 Vk =0.7229 0.6899 0.0373 0.0059-0.6907 0.7206 0.0600 -0.01030.0128 -0.0680 0.9880 0.1384-0.0133 0.0129 -0.1377 0.9903 Bk = 65.5754 0.0000 -0.0002 0.0000-0.0000 -46.8046 0.0000 -0.0007-0.0002 0.0000 5.0954 0.00000.0000 -0.0007 -0.0000 12.1338 Wc = 0.0075k =10Pk =1.0000 0 0 00 1.0000 0 -0.00000 0 1.0000 00 0.0000 0 1.0000 Vk =0.7229 0.6899 0.0373 0.0059-0.6907 0.7206 0.0600 -0.01030.0128 -0.0680 0.9880 0.1384-0.0133 0.0129 Bk = 65.5754 0.0000 0.0000 -46.8046 -0.0002 0.0000 0.0000 -0.0000 Wc = 6.9206e-004 k= 11 Pk = 1.0000 0 0 1.0000 -0.0000 0 0 0 Vk = 0.72290.6899 -0.6907 0.7206 0.0128 -0.0680 -0.0133 0.0129 Bk = 65.5754 -0.0000 -0.0000 -46.8046 -0.0000 0.0000 0.0000 -0.0000 Wc = 2.0482e-004 k= 12 Pk = 1.0000 0 0 1.0000 0 -0.0000 0 0 Vk = 0.7229 0.6899 -0.6907 0.7206 0.0128 -0.0680 -0.0133 0.0129 Bk = 65.5754 -0.0000 -0.0000 -46.8046 -0.0000 0.0000 0.0000 -0.0000 -0.1377 -0.00020.0000 5.0954 -0.0000 0.9903 0.0000 0.0000 -0.0000 12.1338 0.0000 0 1.0000 0 0.0373 0.0600 0.9880 -0.1377 0.0000 0.0000 5.0954 -0.0000 0 0 0 1.0000 0.0059 -0.0103 0.1384 0.9903 0.0000 0.0000 -0.0000 12.1338 0 0.0000 1.0000 0 0.0373 0.0600 0.9880 -0.1377 0.0000 -0.0000 5.0954 -0.0000 0 0 0 1.0000 0.0059 -0.0103 0.1384 0.9903 0.0000 0.0000 -0.0000 12.1338Wc = 6.2740e-007 迭代次数 k,对称矩阵 Bk,以特征向量为列向量的矩阵 V,特征值为对角元的对角矩阵 D 如下: V1 = 0.6899 -0.0373 0.0059 -0.7229 0.7206 -0.0600 -0.0103 0.6907 -0.0680 -0.9880 0.1384 -0.0128 0.0129 0.1377 0.9903 0.0133 D1 = -46.8046 0 0 0 0 5.0954 0 0 0 0 12.1338 0 0 0 0 65.5754 k= 12 Bk = 65.5754 -0.0000 0.0000 0.0000 -0.0000 -46.8046 -0.0000 0.0000 -0.0000 0.0000 5.0954 -0.0000 0.0000 -0.0000 -0.0000 12.1338 V= 0.7229 0.6899 0.0373 0.0059 -0.6907 0.7206 0.0600 -0.0103 0.0128 -0.0680 0.9880 0.1384 -0.0133 0.0129 -0.1377 0.9903 D= 65.5754 0 0 0 0 -46.8046 0 0 0 0 5.0954 0 0 0 0 12.1338 Wc = 6.2740e-007。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言课程设计报告课程名称:计算机综合课程设计学院:土木工程学院设计题目:矩阵特征值分解级别: B学生姓名:学号:同组学生:无学号:无指导教师:2012年 9 月 5 日C语言课程设计任务书(以下要求需写入设计报告书)学生选题说明:➢以所发课程设计要求为准,请同学们仔细阅读;➢本任务书提供的设计案例仅供选题参考;也可自选,但难易程度需难度相当;➢鼓励结合本专业(土木工程、力学)知识进行选题,编制程序解决专业实际问题。

➢限2人选的题目可由1-2人完成(A级);限1人选的题目只能由1人单独完成(B级);设计总体要求:➢采用模块化程序设计;➢鼓励可视化编程;➢源程序中应有足够的注释;➢学生可自行增加新功能模块(视情况可另外加分);➢必须上机调试通过;➢注重算法运用,优化存储效率与运算效率;➢需提交源程序(含有注释)及相关文件(数据或数据库文件);(cpp文件、txt或dat文件等) ➢提交设计报告书,具体要求见以下说明。

设计报告格式:目录1.课程设计任务书(功能简介、课程设计要求);2.系统设计(包括总体结构、模块、功能等,辅以程序设计组成框图、流程图解释);3.模块设计(主要模块功能、源代码、注释(如函数功能、入口及出口参数说明,函数调用关系描述等);4.调试及测试:(调试方法,测试结果的分析与讨论,截屏、正确性分析);5.设计总结:(编程中遇到的问题及解决方法);6.心得体会及致谢;参考文献1.课程设计任务书功能简介:a)输入一个对称正方矩阵A,从文本文件读入;b)对矩阵A进行特征值分解,将分解结果:即U矩阵、S矩阵输出至文本文件;c)将最小特征值及对应的特征向量输出至文本文件;d)验证其分解结果是否正确。

提示:A=USU T,具体算法可参考相关文献。

功能说明:矩阵特征值分解被广泛运用于土木工程问题的数值计算中,如可用于计算结构自振频率与自振周期、结构特征屈曲问题等。

注:以三阶对称矩阵为例2.系统设计3.模块设计#include<stdio.h>#include<stdlib.h>#include<math.h>int main(){FILE *fp;int tezheng(double *a,int n,double *s,double *u,double eps,int itmax); //函数调用声明int i,j,p,itmax=1000; //itmax为最大循环次数double eps=1e-7,s[3][3],u[3][3]; //eps为元素精度,s为对角矩阵S,u为矩阵U double a[9];//a为待分解矩阵Ai=tezheng(a,3,s,u,eps,1000);if(i>0) //i对应函数中的返回值it{if((fp=fopen("juzhen.txt","w"))==NULL) //打开待输入txt文件{printf("无法打开文件.\n");return;}printf("U矩阵为:\n"); //下几句分别向屏幕和txt文件输入矩阵Ufprintf(fp,"U矩阵为:\n");for(i=0;i<3;i++){for(j=0;j<3;j++){printf("%10.6f",u[i][j]);fprintf(fp,"%10.6f",u[i][j]);}printf("\n");fprintf(fp,"\n");}printf("S对角矩阵为:\n"); //下几句分别向屏幕和txt文件输入矩阵Sfprintf(fp,"S对角矩阵为:\n");for(i=0;i<3;i++){for(j=0;j<3;j++){printf("%10.6f",s[i][j]);fprintf(fp,"%10.6f",s[i][j]);}printf("\n");fprintf(fp,"\n");}p=0;for(i=0;i<3;i++)//下面几句为求最小特征值及其对应特征向量,并输出到屏幕和txt文件中if(s[i][i]<s[0][0])p=i;printf("最小特征值为:%10.6f\n",s[p][p]);fprintf(fp,"最小特征值为:%10.6f\n",s[p][p]);printf("对应特征向量为:\n");fprintf(fp,"对应特征向量为:\n");for(i=0;i<3;i++){printf("%10.6f\n",u[i][p]);fprintf(fp,"%10.6f\n",u[i][p]);}}}int tezheng(double *a,int n,double s[3][3],double u[3][3],double eps,int itmax){FILE *A;char line[1000]; //存放从文件juzhen A.txt读入的数据char *k=" ";int i,j,p,q,it;double sint,cost,sin2t,cos2t,d,tmp,t1,t2,t3,fm;it=0;if((A=fopen("juzhen A.txt","r"))==NULL){printf("无法打开文件\n");return;}fgets(line,1000,A); //从文件指针A指向的文件,即juzhen A.txt中读入字符数据到数组line中strtok(line,k); //原型char *strtok(char *s, const char *delim);说明:strtok()用来将字符串分割成一个个片段。

参数s指向欲分割的字符串,参数delim则为分割字符串,当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为\0 字符。

在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。

每次调用成功则返回被分割出片段的指针。

for(i=0;i<n*n;i++)a[i] = atof(strtok(NULL,k)); //atof函数功能: 把字符串转换成浮点数fclose(A); //释放A指针for(i=0;i<n;i++) //以下几句初始化矩阵U{u[i][i]=1.0;for(j=0;j<n;j++)if(i!=j)u[i][j]=0.0;}while(it<itmax){it++;d=0.0;for(i=1;i<n;i++) //该for循环找矩阵A中非对角元素中的最大值,并记下其位置for(j=0;j<i;j++){tmp=fabs(a[i*n+j]);if(tmp>d){d=tmp;p=i;q=j;}}if(d<eps) //该if条件句用数组元素精度控制循环结束与否{for(i=0;i<n;i++)for(j=0;j<n;j++)s[i][j]=a[i*n+j];return (it);}sint=2*a[p*n+q]; //以下几句为递推公式,求S矩阵主对角元素sin2t=2*a[p*n+q]/(sqrt(4*a[p*n+q]*a[p*n+q]+(a[q*n+q]-a[p*n+p])*(a[q*n+q]-a[p*n+p])));if(a[q*n+q]-a[p*n+p]<0.0)sin2t=-sin2t;cos2t=sqrt(1.0-sin2t*sin2t);sint=sin2t/(sqrt(2.0*(1.0+cos2t)));cost=sqrt(1.0-sint*sint);tmp=a[p*n+p];t1=tmp*cost*cost;t2=a[q*n+q]*cost*cost;t3=a[p*n+q]*sin2t;a[p*n+p]=t1+a[q*n+q]-t2-t3;a[q*n+q]=tmp-t1+t2+t3;a[p*n+q]=0.0; //置该非对角元素为0.0,下次循环最大便不是它了a[q*n+p]=0.0; //同上for(j=0;j<n;j++) //以下两for语句求S矩阵非主对角元素if((j!=p)&&(j!=q)){tmp=a[p*n+j];a[p*n+j]=tmp*cost-a[q*n+j]*sint;a[q*n+j]=tmp*sint+a[q*n+j]*cost;}for(i=0;i<n;i++)if((i!=p)&&(i!=q)){a[i*n+p]=a[p*n+i];a[i*n+q]=a[q*n+i];}for(i=0;i<n;i++) //该for语句递推求矩阵U{fm=u[i][p];u[i][p]=fm*cost-u[i][q]*sint;u[i][q]=fm*sint+u[i][q]*cost;}}return (0);}4.调试及测试1.02.03.0矩阵A= 2.0 2.0 5.03.0 5.0 1.01.屏幕输出如下:2.文本文件输出见文件“juzhen.txt”。

3.结果正确性分析利用数学软件Mathematica 8.0计算特征值(即矩阵S主对角线元素)及对应特征向量组U如下截图。

(Eigenvalues[ ]为计算矩阵特征值函数,Eigenvectors[ ]为计算矩阵特征向量函数)5.设计总结拿到这个题目,我首先想到用解方程组的方法来求解矩阵U和S,但是后来发现:假如这是一个三阶矩阵,那么通过A=USU T可以得到含9个方程的方程组,而矩阵U和S中共12个未知数,故通过这种方法建模被否定了。

后查阅资料,理解了这是一个矩阵特征分解的问题,故转化为两部分求解:特征值和特征向量。

可以通过雅克比变换来求解。

从txt文本文件中读入数据又是一大障碍,本以为存在文本文件中的浮点数据只需通过浮点格式字符串就能将其读出,结果运行后屏幕显示一团乱。

后查阅资料得知,文本文件中的数据都是字符数据。

故先是将其中的字符数据读出,然后用字符与浮点之间的转换函数还原浮点数据。

最后碰到的一个问题是主函数与被调用函数之间的衔接问题,就是一个指针所指的实参和形参,要么都是一维数组,要么都是二维数组,否则就会出错。

相关文档
最新文档