matlab利用SVD求解线性方程组

文章目录

  • 题目:利用svd求解非齐次线性方程组
  • SVD基本原理
  • svd求解非齐次线性方程组代码

题目:利用svd求解非齐次线性方程组

matlab利用SVD求解线性方程组_第1张图片

SVD基本原理

https://blog.csdn.net/Ansel_Lee/article/details/107643789
https://blog.csdn.net/didi_ya/article/details/108895122
解非齐次线性方程组 ( A x = b ) (A x=b) (Ax=b),问题等价于 min ⁡ ∥ A x − b ∥ 2 \min \|\boldsymbol{A x}-\boldsymbol{b}\|^2 minAxb2 ,是一个非线性优化问题。

  • 对A进行SVD分解
    min ⁡ ∥ A x − b ∥ 2 = min ⁡ ∥ U D V T x − b ∥ 2 = min ⁡ ∥ D V T x − U T b ∥ 2 \begin{gathered} \quad \min \|\boldsymbol{A} \boldsymbol{x}-\boldsymbol{b}\|^2 \\ =\min \left\|\boldsymbol{U} \boldsymbol{D} \boldsymbol{V}^{\mathrm{T}} \boldsymbol{x}-\boldsymbol{b}\right\|^2 \\ =\min \left\|\boldsymbol{D} \boldsymbol{V}^{\mathrm{T}} \boldsymbol{x}-\boldsymbol{U}^{\mathrm{T}} \boldsymbol{b}\right\|^2 \end{gathered} minAxb2=min UDVTxb 2=min DVTxUTb 2
  • 重新表述方程组
    y = V T x , c = U T b \boldsymbol{y}=\boldsymbol{V}^{\mathrm{T}} \boldsymbol{x}, \boldsymbol{c}=\boldsymbol{U}^{\mathrm{T}} \boldsymbol{b} y=VTx,c=UTb, 则 min ⁡ ∥ D V T x − U T b ∥ 2 \min \left\|\boldsymbol{D} \boldsymbol{V}^{\mathrm{T}} \boldsymbol{x}-\boldsymbol{U}^{\mathrm{T}} \boldsymbol{b}\right\|^2 min DVTxUTb 2 可以表述为 D y = c \boldsymbol{D} \boldsymbol{y}=\boldsymbol{c} Dy=c
  • 方程组的解
    方程组 D y = c \boldsymbol{D} \boldsymbol{y}=\boldsymbol{c} Dy=c 的解为
    y i = c i / d i , i = 1 , 2 , . . . n \boldsymbol{y}_{\mathrm{i}}=\boldsymbol{c}_{\mathrm{i}} / \boldsymbol{d}_{\mathrm{i}},i=1,2,...n yi=ci/di,i=1,2,...n
    即:
    ( d 1 d 2 ⋱ d n 0 ) ( y 1 y 2 ⋮ y n ) = ( c 1 c 2 ⋮ c n c n + 1 ⋮ c m ) \left( \begin{matrix} d_1& & & \\ & d_2& & \\ & & \ddots& \\ & & & d_n\\ \hline & & & \\ & & 0& \\ \end{matrix} \right) \left( \begin{array}{c} y_1\\ y_2\\ \vdots\\ y_n\\ \end{array} \right) =\left( \begin{array}{c} c_1\\ c_2\\ \vdots\\ c_n\\ \hline c_{n+1}\\ \vdots\\ c_m\\ \end{array} \right) d1d20dn y1y2yn = c1c2cncn+1cm
    则非齐次线性方程组 ( A x = b ) (A x=b) (Ax=b)的解为 ( V T ) − 1 y = x \left( \boldsymbol{V}^{\mathrm{T}} \right) ^{-1}\boldsymbol{y}=\boldsymbol{x} (VT)1y=x

svd求解非齐次线性方程组代码

function x = svd_solve(A,b)
[U,D,V] = svd(A);
c = U'* b;
y=[];
for i=1:length(D)
    yy = c(i)/D(i,i);
    y=[y;yy];
end
x = inv(V')*y;
end

  • 结果
%% 第一个方程组解和条件数
A1 = [1 2 5;2 4 6;6 1 2];
b1 = [1 2 3]';
x = svd_solve(A1,b1);
cond_A1 = cond(A1);
disp('第一个方程组解为:');
disp(x);
disp('第一个方程组条件数为:');
disp(cond_A1);

%% 第二个方程组解和条件数
A2 = [1,2,5;2000,4000,6000;6,1,2];
b2 = [1,2,3]';
y = svd_solve(A2,b2);
cond_A2 = cond(A2);
disp('第二个方程组解为:');
disp(y);
disp('第一个方程组条件数为:');
disp(cond_A2);

matlab利用SVD求解线性方程组_第2张图片

你可能感兴趣的:(matlab,matlab)