本文主要是介绍【数值分析】乘幂法,matlab实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
乘幂法
一种求实矩阵 A {A} A 的按模最大的特征值,及其对应的特征向量 x i {x_i} xi 的方法,只能求一个。特别适合于大型稀疏矩阵。
一个矩阵的特征值和特征向量可以通过矩阵不断乘以一个初始向量得到。
每次乘完之后要规范化,防止上溢或下溢。规范化可以用各种范数。
要保证矩阵最大特征值只有一个,有 n {n} n 个线性无关的特征向量。
有多个相同特征值时,求得的特征向量可以近似看成排第一个的最大特征值的特征向量。
步骤:
$$
\begin{align*}
- &求初始向量u_0模最大元素的编号 id , 初始特征值 \beta_0=u_0(id) , 求归一化后的初始向量y_0 \ \
2.& 迭代 , k=0,1, \cdots \ \
& u_{k+1}=Ay_k \ \
& \beta_{k+1}=u_{k+1}(id_k) \ \
& y_{k+1}= \frac{u_{k+1}}{||u_{k+1}||\infty}
\ \
& id{k+1}=u_{k+1}模最大元素的编号 \ \
3.& 判断是否满足 , \beta_{k+1}- \beta_k< \text{eps} , 特征值= \beta_{k+1}
\end{align*}
$$
[!example]-
A = [ 1 2 1 3 ] , u 0 = [ 0.6 0.8 ] A= \begin{bmatrix} 1 & 2 \\ 1 & 3 \end{bmatrix} \,\,,\,\, u_0= \begin{bmatrix} 0.6\\0.8 \end{bmatrix} A=[1123],u0=[0.60.8]
解:
y 0 = u 0 ∣ ∣ u 0 ∣ ∣ ∞ = [ 0.75 1.00 ] y_0= \frac{u_0}{||u_0||_\infty}= \begin{bmatrix} 0.75\\ 1.00 \end{bmatrix} y0=∣∣u0∣∣∞u0=[0.751.00]
u 1 = A y 0 = [ 2.75 3.75 ] u_1=Ay_0 = \begin{bmatrix} 2.75\\3.75 \end{bmatrix} u1=Ay0=[2.753.75]
在 y 0 {y_0} y0 中 1 {1} 1 在下面,所以近似最大特征值
β 1 = 3.75 \beta_1= 3.75 β1=3.75
特征向量
y 1 = u 1 ∣ ∣ u 1 ∣ ∣ ∞ = [ 0.7333 1.0000 ] y_1= \frac{u_1}{||u_1||_\infty}= \begin{bmatrix} 0.7333\\ 1.0000 \end{bmatrix} y1=∣∣u1∣∣∞u1=[0.73331.0000]
乘幂法matlab实现
%% 乘幂法例子
A = [12 6 -6; 6 16 2; -6 2 16];
u0 = [1.0, 0.5, -0.5]';
format long
[beta1, i] = powerMethod(A, u0, 1e-6, 10)%% 乘幂法求模最大特征值和特征向量
% 输入矩阵、初始迭代向量、精度、最大迭代次数
% 输出特征值、无穷范数归一化后的特征向量、迭代次数
function [lbd, y1, i] = powerMethod(A, u0, eps, max_iter)[u0norm, id] = max(abs(u0)); % 取无穷范数和其所在行beta0 = u0(id);y0 = u0/ u0norm;for i = 1:max_iteru1 = A*y0;beta1 = u1(id);[u1norm, id] = max(abs(u1));y1 = u1/u1norm;if abs(beta1 - beta0)<epslbd = beta1;break;endy0 = y1; % 当前变成过去beta0 = beta1;end
end
这篇关于【数值分析】乘幂法,matlab实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!