《雅克比法求矩阵特征值特征向量》由会员分享,可在线阅读,更多相关《雅克比法求矩阵特征值特征向量(12页珍藏版)》请在金锄头文库上搜索。
1、wordC语言课程设计报告课程名称: 计算机综合课程设计学 院: 土木工程学院 设计题目: 矩阵特征值分解级 别: B学生: 学 号: 同组学生: 无学 号: 无指导教师: 2012年9月5日C语言课程设计任务书以下要求需写入设计报告书学生选题说明: 以所发课程设计要求为准,请同学们仔细阅读; 本任务书提供的设计案例仅供选题参考;也可自选,但难易程度需难度相当; 鼓励结合本专业土木工程、力学知识进展选题,编制程序解决专业实际问题。 限2人选的题目可由1-2人完成A级;限1人选的题目只能由1人单独完成B级; 设计总体要求: 采用模块化程序设计; 鼓励可视化编程; 源程序中应有足够的注释; 学生可
2、自行增加新功能模块视情况可另外加分; 必须上机调试通过; 注重算法运用,优化存储效率与运算效率; 需提交源程序(含有注释)与相关文件(数据或数据库文件);(cpp文件、txt或dat文件等) 提交设计报告书,具体要求见以下说明。设计报告格式:目录1 课程设计任务书功能简介、课程设计要求;2 系统设计包括总体结构、模块、功能等,辅以程序设计组成框图、流程图解释;3 模块设计主要模块功能、源代码、注释如函数功能、入口与出口参数说明,函数调用关系描述等;4 调试与测试:调试方法,测试结果的分析与讨论,截屏、正确性分析;5 设计总结:编程中遇到的问题与解决方法;6 心得体会与致;参考文献1.课程设计任
3、务书功能简介:a) 输入一个对称正方矩阵A,从文本文件读入;b) 对矩阵A进展特征值分解,将分解结果:即U矩阵、S矩阵输出至文本文件;c) 将最小特征值与对应的特征向量输出至文本文件;d) 验证其分解结果是否正确。提示:A=USUT,具体算法可参考相关文献。功能说明:矩阵特征值分解被广泛运用于土木工程问题的数值计算中,如可用于计算结构自振频率与自振周期、结构特征屈曲问题等。注:以三阶对称矩阵为例总体结构 2.系统设计递推求矩阵U递推求矩阵S找矩阵A中非对角元素中的最大值,并记下其位置从文本文件中读入数组A向屏幕和txt文件输入矩阵S求最小特征值与其对应特征向量,并输出到屏幕和txt文件中向屏幕
4、和txt文件输入矩阵Utezheng函数main函数3. 模块设计#include#include#includeint 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,s33,u33; /eps为元素精度,s为对角矩阵S,u为矩阵U double a9;/a为待分解矩阵Ai=tezheng(a,3,s,u,eps,1000);if(i0) /i对应函数中的
5、返回值itif(fp=fopen(juzhen.txt,w)=NULL) /打开待输入txt文件printf(无法打开文件.n);return;printf(U矩阵为:n); /下几句分别向屏幕和txt文件输入矩阵Ufprintf(fp,U矩阵为:n);for(i=0;i3;i+)for(j=0;j3;j+)printf(%10.6f,uij);fprintf(fp,%10.6f,uij);printf(n);fprintf(fp,n);printf(S对角矩阵为:n); /下几句分别向屏幕和txt文件输入矩阵Sfprintf(fp,S对角矩阵为:n);for(i=0;i3;i+)for(j=
6、0;j3;j+)printf(%10.6f,sij);fprintf(fp,%10.6f,sij); printf(n);fprintf(fp,n); p=0;for(i=0;i3;i+)/下面几句为求最小特征值与其对应特征向量,并输出到屏幕和txt文件中if(siis00)p=i;printf(最小特征值为:%10.6fn,spp);fprintf(fp,最小特征值为:%10.6fn,spp);printf(对应特征向量为:n);fprintf(fp,对应特征向量为:n);for(i=0;i3;i+)printf(%10.6fn,uip);fprintf(fp,%10.6fn,uip);in
7、t tezheng(double *a,int n,double s33,double u33,double eps,int itmax)FILE *A;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; strtok(line,k); /原型char *strtok(char *s, const char *delim);说明:strtok()用来将字符串分割成一个个片段。参数s指
8、向欲分割的字符串,参数delim如此为分割字符串,当strtok()在参数s的字符串中发现到参数delim的分割字符时如此会将该字符改为0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用如此将参数s设置成NULL。每次调用成功如此返回被分割出片段的指针。 for(i=0;in*n;i+) ai = atof(strtok(NULL,k); /atof函数功能: 把字符串转换成浮点数 fclose(A); /释放A指针for(i=0;in;i+) /以下几句初始化矩阵Uuii=1.0;for(j=0;jn;j+)if(i!=j)uij=0.0;while(ititmax)
9、it+;d=0.0;for(i=1;in;i+) /该for循环找矩阵A中非对角元素中的最大值,并记下其位置for(j=0;jd)d=tmp;p=i;q=j;if(deps) /该if条件句用数组元素精度控制循环完毕与否for(i=0;in;i+)for(j=0;jn;j+)sij=ai*n+j;return (it);sint=2*ap*n+q; /以下几句为递推公式,求S矩阵主对角元素 sin2t=2*ap*n+q/(sqrt(4*ap*n+q*ap*n+q+(aq*n+q-ap*n+p)*(aq*n+q-ap*n+p);if(aq*n+q-ap*n+p0.0)sin2t=-sin2t;c
10、os2t=sqrt(1.0-sin2t*sin2t);sint=sin2t/(sqrt(2.0*(1.0+cos2t);cost=sqrt(1.0-sint*sint);tmp=ap*n+p;t1=tmp*cost*cost;t2=aq*n+q*cost*cost;t3=ap*n+q*sin2t;ap*n+p=t1+aq*n+q-t2-t3;aq*n+q=tmp-t1+t2+t3;ap*n+q=0.0; /置该非对角元素为0.0,下次循环最大便不是它了aq*n+p=0.0; /同上for(j=0;jn;j+) /以下两for语句求S矩阵非主对角元素if(j!=p)&(j!=q)tmp=ap*n
11、+j;ap*n+j=tmp*cost-aq*n+j*sint;aq*n+j=tmp*sint+aq*n+j*cost;for(i=0;in;i+)if(i!=p)&(i!=q)ai*n+p=ap*n+i;ai*n+q=aq*n+i;for(i=0;in;i+) /该for语句递推求矩阵U fm=uip;uip=fm*cost-uiq*sint;uiq=fm*sint+uiq*cost;return (0);4. 调试与测试1.屏幕输出如下:2. 文本文件输出见文件“。3. 结果正确性分析利用数学软件Mathematica 8.0计算特征值即矩阵S主对角线元素与对应特征向量组U如下截图。Eigenvalues 为计算矩阵特征值函数,Eigenvectors 为计算矩阵特征向量函数