MATLAB线性方程组求解

有唯一解线性方程组求法

对于一般的,有唯一解的线性方程组,我们可以转换成矩阵的形式:
A x = b Ax=b Ax=b 则可以用矩阵运算求解x,即x=A\b

有无穷解的线性方程组求法

齐次线性方程组的通解

求解齐次线性方程组基础解系的函数是null
Z=null(A)表示返回矩阵A的基础解系组成的矩阵。Z还满足ZTZ=I
Z=null(A,‘r’)得出的Z不满足ZTZ=I,但得出的矩阵元素多为整数,顾一般都带参数r。

非齐次线性方程组通解

非齐次线性方程组在求出基础解析后还要求一个特解。对于矩阵形式的非齐次线性方程组 A x = b Ax=b Ax=b 特解 x 0 x_0 x0的求法为x0=pinv(A)*b;其中函数pinv的意思是伪逆矩阵。

例如求解线性方程组:

f ( x ) = { x 1 + 2 x 2 + 2 x 3 = 1 x 2 − 2 x 3 − 2 x 4 = 2 x 1 + 3 x 2 − 2 x 4 = 3 f(x)=\left\{ \begin{aligned} x_1+2x_2+2x_3=1\\ x_2-2x_3-2x_4=2\\ x_1+3x_2-2x_4=3\\ \end{aligned} \right. f(x)=x1+2x2+2x3=1x22x32x4=2x1+3x22x4=3
在这里插入图片描述
由输出结果可知方程的解为
x = k 1 [ − 6 2 1 0 ] + k 2 [ − 4 2 0 1 ] + [ 13 / 77 46 / 77 − 1 / 11 − 40 / 77 ] ( k 1 , k 2 ∈ R ) x=k_1 \begin{bmatrix} -6\\2\\1\\0\\ \end{bmatrix} +k_2 \begin{bmatrix} -4\\2\\0\\1\\ \end{bmatrix} +\begin{bmatrix} 13/77\\46/77\\-1/11\\-40/77\\ \end{bmatrix} \quad (k_1,k_2 ∈R) x=k16210+k24201+13/7746/771/1140/77(k1,k2R)

利用Gauss消元法求解线性方程组

在线性代数中,我们主要的方法就是Gauss消元法。MATLAB中将矩阵化为行阶梯型的函数是: R = r r e f ( A ) R=rref(A) R=rref(A)
我们可以用线性代数知识,编写一个函数,给入矩阵A和b,给出方程的解,函数自动判断是有唯一解还是无穷解。
在这里插入图片描述

先搭建出函数的框架
function varargout = ZJX_solvebygauss(varargin)
%ZJX_solvebygauss 用高斯消元法解线性方程组
%   A是系数矩阵,b是常熟矩阵。varargin={A,b};如果b为0,则不输入b
%   varargout=[S flag],S给出结果
%   flag为0无解;1唯一解;2齐次通解;3非齐次通解
A=cell2mat(varargin(1));
Alie=length(A);Asum=numel(A);Ahang=Asum/Alie;
if(nargin==2)
    b=cell2mat(varargin(2));
else
    b(Ahang,1)=0;
end
B=A; B(:,Alie+1)=b; 


varargout(1)={S};
if(nargout==2)
    varargout(2)={flag};
end
end

现在完成了基本框架的构建,其中varargout等含义参见函数部分的内容。现在我们已经得到了矩阵A、b,A的行数Ahang,A的列数Alie,增广矩阵B。现在在中间的空格位置进行运算。

程序设计
Ar=rank(A); Br=rank(B);
B=rref(B);
if (Ar<Br)
    flag=0; S=0;
elseif (Ar==Br && Ar==Alie)
    flag=1; S=B(:,Alie+1);
else
    %将能构成单位矩阵的列号存储在行向量I中,即存储了极大线性无关向量的编号
    %将剩余列号存入行向量C中
    for i=1:Ar
        for j=1:Alie
            if(B(i,j)==1)
                I(i)=j;
                break
            end
        end
    end
    C=setdiff(1:Alie,I);
    %由线性代数知识可得基础解系
    ILim=length(I); CLim=length(C);
    S(Alie,CLim)=0;%初始化S,S行数为A列数,S列数为C的维度
    for i=1:CLim
        S(C(i),i)=-1;
        for j=1:ILim
            S(I(j),i)=B(j,C(i));
        end
    end
    if(nargin==1)
        flag=2;
    else
        flag=3;
        S(Alie,CLim+1)=0;
        for i=1:Ar
            S(I(i),CLim+1)=B(i,Alie+1);
        end
    end
end
测试

同样求之前的方程组通解
{ x 1 + 2 x 2 + 2 x 3 = 1 x 2 − 2 x 3 − 2 x 4 = 2 x 1 + 3 x 2 − 2 x 4 = 3 \left\{ \begin{aligned} x_1+2x_2+2x_3=1\\ x_2-2x_3-2x_4=2\\ x_1+3x_2-2x_4=3\\ \end{aligned} \right. x1+2x2+2x3=1x22x32x4=2x1+3x22x4=3
在这里插入图片描述
如图,带方程b则S最后一列是特解,不带b则没有特解。日后我们可以直接调用这个函数方便求解。而且比较结果我们发现,这样求出来的特解形式要简单一些。

  • 38
    点赞
  • 172
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MATLAB提供了多种方法来求解线性方程组。其中主要包括直接法和迭代法两种方法。 直接法是将线性方程组求解问题转化为三角方程组的求解问题。在MATLAB中,可以使用高斯消去法、列主元消去法和矩阵的三角分解法等直接解法。其中,高斯消去法是一个经典的直接法,列主元消去法是目前计算机上求解线性方程组的标准算法。可以使用左除运算符"\ "来求解线性方程组,它使用列主元消去法。例如,给定线性方程组Ax=b,可以使用左除运算符求解,即x=A\b。这种方法使用起来很方便。 迭代法是通过迭代逼近来求解线性方程组。在MATLAB中,可以使用Jacobi迭代法、Gauss-Seidel迭代法、SOR迭代法等迭代方法来求解线性方程组。这些方法通过迭代计算来逐步逼近线性方程组的解。 总之,MATLAB提供了多种直接法和迭代法来求解线性方程组,可以根据具体情况选择合适的方法进行求解。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [matlab线性方程组求解](https://blog.csdn.net/DXFGJ/article/details/108143942)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [基于MATLAB求解线性方程组(附完整代码和例题)](https://blog.csdn.net/forest_LL/article/details/124209950)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值