幂法和反幂法的matlab实现.docx
《幂法和反幂法的matlab实现.docx》由会员分享,可在线阅读,更多相关《幂法和反幂法的matlab实现.docx(23页珍藏版)》请在冰点文库上搜索。
幂法和反幂法的matlab实现
幂法和反幂法的matlab实现
幂法求矩阵主特征值及对应特征向量
摘要
矩阵特征值的数值算法,在科学和工程技术中很多问题在数学上都归结为矩阵的特征值问题,所以说研究利用数学软件解决求特征值的问题是非常必要的。
实际问题中,有时需要的并不是所有的特征根,而是最大最小的实特征根。
称模最大的特征根为主特征值。
幂法是一种计算矩阵主特征值(矩阵按模最大的特征值)及对应特征向量的迭代方法,它最大的优点是方法简单,特别适用于大型稀疏矩阵,但有时收敛速度很慢。
用java来编写算法。
这个程序主要分成了四个大部分:
第一部分为将矩阵转化为线性方程组;第二部分为求特征向量的极大值;第三部分为求幂法函数块;第四部分为页面设计及事件处理。
其基本流程为幂法函数块通过调用将矩阵转化为线性方程组的方法,再经过一系列的验证和迭代得到结果。
关键字:
主特征值;特征向量;线性方程组;幂法函数块
Powermethodforfindingtheeigenvaluesandcorrespondingeigenvectorsofthematrix
ABSTRACT
Numericalalgorithmfortheeigenvalueofmatrix,inscienceandengineeringtechnology,alotofproblemsinmathematicsareattributedmatrixcharacteristicvalueproblem,sothatstudiesusingmathematicalsoftwaretosolvetheeigenvalueproblemisverynecessary.Inpracticalproblems,sometimesneednotalleigenvalues,butthemaximumandminimumeigenvalueofreal.Thecharacteristicvalueofthelargesteigenvalueofthemodulusmaximum.
Powermethodisacalculationofmainfeaturesofthematrixvalues(matrixaccordingtothecharacteristicsofthelargestvalue)andthecorrespondingeigenvectorofiterativemethod.Itisthebiggestadvantageissimplemethod,especiallyforlargesparsematrix,butsometimestheconvergencespeedisveryslow.
Usingjavatowritealgorithms.Thisprogramisdividedintothreeparts:
thefirstpartisthematrixistransformedintolinearequations;thesecondpartforthesakeoffeaturevectorofthemaximum;thethirdpartistheexponentiationfunctionblock.Thefourthpartisthepagedesignandeventprocessing.Thebasicprocessisapowerlawfunctionblockbycallingthematrixistransformedintolinearequationsmethod,afteraseriesofvalidationanditerationresults.
Powermethodforfindingtheeigenvaluesandcorrespondingeigenvectorsofthematrix
Keywords:
Maineigenvalue;characteristicvector;linearequations;powerfunctionblock
、
1幂法…………………..…………………………...............…….………………………….1
1.1幂法的基本理论和推导……………..…….…………….………………………………………1
1.2幂法算法的迭代向量规范化………....…………………….....…………………………………2
2概要设计………………….………………..…...…….............................3
2.1设计背景………………..…………………………………………………………..3
2.2运行流程………....................….....................………………………………………3
2.3运行环境…………..................................………….………………………..3
3程序详细设计………….......................….....…….………………..………....4
3.1矩阵转化为线性方程组……..………………………………………..4
3.2特征向量的极大值...…………………….....…...…………………….4
3.3求幂法函数块............….....…………...…......…………………………
3.4界面设计与事件处理............….....…………...…......…………………………
4运行过程及结果……………………....................................…………………….…........6
4.1运行过程.........................................................………………………………………..6
4.2运行结果………….......……………...................……………...……………………...6
4.3结果分析………..............................................………………….…………………….6
5结论……………………………………..…………………………………………...7
参考文献……………………………………….....………………………………….……..8
附录…………………………………………………………………………….……………..56
1幂法
设实矩阵
有一个完备的特征向量组,其特征值为
,相应的特征向量为
。
已知A的主特征值是实根,且满足条件
。
1.1幂法的基本理论和推导[1]
幂法的基本思想是任取一个非零的初始向量
,由矩阵
构造一向量序列
称为迭代向量。
由假设,
可表示为
(设
)(1-1)
于是
(1-2)
其中
。
由假设
,故
从而
。
这说明序列
越来越接近
的对应于
的特征向量,或者说当
充分大时
,即迭代向量
为
的特征值的近似向量。
下面再考虑主特征值
的计算,用
表示
的第
个分量,则
,故
。
也就是说两相邻的迭代向量分量的比值收敛到主特征值。
通过以上推论可以得出结论,设
有
个线性无关的特征向量(即非亏损的),主特征值
满足
,则对任何非零初始向量
,构造的向量序列
收敛到主特征向量
;
收敛到主特征值
。
(定理一)
幂法只能对非亏损矩阵求实的主特征值,且常用于实对称矩阵。
1.2幂法算法的迭代向量规范化[2][3]
应用幂法计算
的主特征值
及对应的特征向量时,如果
(或
),迭代向量
的各个不等于零的分量将随
而趋向于无穷(或趋向于零),这样在计算机实现时就可能“溢出”。
为了克服这个缺点,就需要将迭代向量加以规范化。
设有一向量
,将其规范化得到向量
,其中
表示向量
的绝对值最大的分量,即如果有
,则
,且
为所有绝对值最大的分量中的最小下标。
任取一初始向量
,构造向量序列
:
由(3.1)式有
,
(2-1)
同理,可得到
(2-2)
结论:
设
有
个线性无关的特征向量,主特征值
满足
,则对任意非零初始向量
,按下述方法构造的向量序列
,
:
则有
;(2-3)
。
(2-4)
2概要设计
2.1设计背景
用java程序来实现幂法求矩阵最大特征值及对应特征向量。
2.2运行流程
本程序分为了几大部分,通过方法间的相互调用,达到求解目的:
首先matrixx方法的作用是将矩阵A与向量X相乘,结果存储在Y中,即将方程组呈现出来,slove方法求出各未知数的最大值,程序的主体方法mifa通过dowhile循环中调用matrixx方法实现幂法函数。
同时建立页面,达到在页面中输入初向量和矩阵,程序读入这些数据并运行出结果。
2.3运行环境
MicrosoftWindowsXPProfessional
MyEclipse8.6
3程序详细设计[4][5]
首先在桌面里新建文件夹,并运行程序MyEclipse8.6;令一维矩阵u={1,1,1};双精度浮点型初值为a=1.0,b=2.0;整型变量方程组的阶数n=3;双精度浮点型方程组系数矩阵为A={{3,-4,3},{-4,6,3},{3,3,1}};
3.1矩阵转化为线性方程组
将二维矩阵A,一维矩阵x,y以及阶数n作为它的形参,通过for循环将Ax相乘得到的结果存储在Y中。
其执行程序如下:
publicvoidmatrixx(double[][]A,double[]x,double[]y,intn){
for(inti=0;iy[i]=0;
for(intj=0;jy[i]+=A[i][j]*x[j];
}
}
}
3.2特征向量的极大值
首先将形参double型一维矩阵x中的元素通过for循环取到最大值,并将最大值赋予max。
其执行程序如下:
publicdoubleslove(double[]x,intn){
doublemax=0;
for(inti=0;imax=x[i]>x[i+1]?
x[i]:
x[i+1];
}
returnmax;
}
3.3求幂法函数块
这个方法有五个形参,二维矩阵A,一维矩阵u,双精度浮点型初值a,b矩阵的阶数n。
该方法的主体部分在dowhile中,通过循环迭代matrixx方法和solve方法,解出矩阵的特征值并且比较出最大特征值。
通过for循环列出关于该矩阵的线性方程组的所有特征向量。
其执行程序如下:
publicvoidmifa(double[][]A,double[]u,doublea,doubleb,intn){
doublec=0.0;
doublec1=0.0;
intcount=0;
double[]temp={0,0,0};
do{
double[]u1=u;
matrixx(A,u1,u,n);
c=slove(u,n);
c1=c;
guifanhua(u,n);
printfcount(count,u,n);
count++;
for(inti=0;itemp[i]=Math.abs(u[i]-u1[i]);
}
}while(slove(temp,n)>a||Math.abs(c1-c)>b);
System.out.println("最大特征值为:
"+c);
System.out.println("特征向量为:
");
for(inti=0;iSystem.out.println(u[i]+"");
}
}
3.4界面设计和事件处理[6]
通过调用以下的一系列的类,达到输入矩阵与向量,点击运算得出主特征值与特征向量java.awt.EventQueue;是一个与平台无关的类,它将来自于底层同位体类和受信任的应用程序类的事件列入队列。
java.awt.event.ActionEvent;当特定于组件的动作(比如被按下)发生时,由组件(比如 Button)生成此高级别事件。
java.awt.event.ActionListener;用于接收操作事件的侦听器接口。
对处理操作事件感兴趣的类可以实现此接口,而使用该类创建的对象可使用组件的 addActionListener 方法向该组件注册。
java.util.Arrays;包含一个静态的工厂,允许数组被视为列表
javax.swing.JFrame;与其他所有JFC/Swing顶层容器一样,JFrame包含一个JRootPane作为其惟一的子容器
javax.swing.JPanel;里面有一个面板组件,就是由该类提供的,你可以new些对象,创建一个面板,则在界面中就可以有具体的显示
javax.swing.border.EmptyBorder;设置组件边框
javax.swing.JLabel;可以通过设置垂直和水平对齐方式,指定标签显示区中标签内容在何处对齐
javax.swing.JTextField;api里面得一个文本主键,要掉用它就要import实现接口
javax.swing.JButton;"push"按钮的实现
java.awt.BorderLayout;这是一个布置容器的边框布局,它可以对容器组件进行安排,并调整其大小,使其符合下列五个区域:
北、南、东、西、中。
4运行过程及结果
4.1运行过程
通过J++6.0,用for循环将Ax相乘得到的结果存储在Y中,将形参double型数组x中通过for循环取到最大值,在dowhile中调用matrixx方法,及solve方法,并打印最大特征值与特征向量。
4.2运行结果
经多次调试程序,不再报错,结果如下图:
4.3结果分析
分析结果:
由于误差的存在使得每一次迭代都将误差进一步的扩大,可能会偏离计算方向。
在计算结果可能会出现误差,这很正常,重要的是掌握这种迭代思想。
并且为了进一步研究不同的初值对结果的影响,也做了实验,发现在不同初值下求出的结果也各不相同,所以为了得到更精确的结果,在实验前一定要选取最合适的初值即初向量。
5结论
通过实验我们可以看到,幂法程序可以用来计算矩阵绝对值最大的特征值及相应的特征向量。
幂法的缺点是开始的时候并不知道矩阵是否有单一的主特征值,也不知道如何选择
以保证它关于矩阵特征向量的表达中包含一个与主特征值相关的非零特征向量。
在这次课程设计中,我学习到了许多知识,其中包括之前学过的迭代思想,在矩阵中得到充分利用,包括dowhile循环语句的使用,不同类的定义等等解决特征值和特征向量的方法还有很多,由于时间关系没有研究很多。
在论文写作过程中,我发现了自己很多缺点,经常因为粗心大意在代码中打错一个符号,检查很久才检查出来,同时对java语言编写也不够熟练,很多东西都要重新到书上去找,由于经验的匮乏,难免有许多考虑不周的地方。
在以后的时间里,我会继续学习java有关知识,改进自己的缺点,争取解决更多的问题。
参考文献
[1]李庆杨,王能超,易大义.数值分析(第4版)[M].北京:
清华大学出版社,2006.
[2]侯风波,汪永高,求n阶实方阵A的全部模最大的特征值及其相应特征向量的幂法[J],工科数学,2000,16(2A).
[3]廖鸿志,幂法求特征值的若干问题[J],云南大学学报,1988,10(4A).
[4]张德丰.MATLAB数值分析与仿真案例[M].北京:
清华大学出版社,2011.
[5]金一庆,陈越.数值方法[M].北京:
机械工业出版社,2003.
[6]JavaTM PlatformStandard Ed.
附录
页面设计与事件处理:
packagewewr;
importjava.awt.EventQueue;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.util.Arrays;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
importjavax.swing.border.EmptyBorder;
importjavax.swing.JLabel;
importjavax.swing.JTextField;
importjavax.swing.JButton;
importjava.awt.BorderLayout;
publicclassMyBoundaryextendsJFrame
{
privateJPanelcontentPane;
privateJButtonbtnNewButton;
privatedouble[]u={0,0,0};
privatedouble[][]A={{0,0,0},{0,0,0},{0,0,0}};
privateString[]u1;
privateString[]A1;
privateString[][]A2={{"","",""},{"","",""},{"","",""}};
privateJTextFieldtextField;
privateJTextFieldtextField_1;
/**
*Launchtheapplication.
*/
publicstaticvoidmain(String[]args){
EventQueue.invokeLater(newRunnable(){
publicvoidrun(){
try{
MyBoundaryframe=newMyBoundary();
frame.setVisible(true);
}catch(Exceptione){
e.printStackTrace();
}
}
});
}
/**
*Createtheframe.
*/
publicMyBoundary(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100,100,453,316);
contentPane=newJPanel();
contentPane.setBorder(newEmptyBorder(5,5,5,5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabellblNewLabel=newJLabel("\u5411\u91CF");
lblNewLabel.setBounds(35,26,86,24);
contentPane.add(lblNewLabel);
JLabellblNewLabel_1=newJLabel("\u77E9\u9635");
lblNewLabel_1.setBounds(35,73,86,24);
contentPane.add(lblNewLabel_1);
textField=newJTextField();
textField.setBounds(131,28,214,22);
contentPane.add(textField);
textField.setColumns(10);
textField_1=newJTextField();
textField_1.setBounds(131,75,219,22);
contentPane.add(textField_1);
textField_1.setColumns(10);
btnNewButton=newJButton("\u7ED3\u679C");
btnNewButton.setBounds(140,160,93,23);
btnNewButton.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
u1=textField.getText().split(",");
for(inti=0;i<3;i++){
u[i]=Integer.parseInt(u1[i]);
}
A1=textField_1.getText().split("\\s");
for(inti=0;i<3;i++){
System.out.println(Arrays.deepToString(A1));
A2[i]=A1[i].split(",");
for(intj=0;j<3;j++){
A[i][j]=Integer.parseInt(A2[i][j].trim());
}
}
newMifaSolve(u,A);
}
});
contentPane.add(btnNewButton);
}
}
主特征值与特征向量计算:
packagewewr;
publicclassMifaSolve
{
staticdoublea=1.0;
staticdoubleb=2.0;
staticintn=3;
publicMifaSolve(double[]u,double[][]A){
mifa(A,u,a