• 使用matlab求解线性/非线性方程


    使用matlab求解线性方程

    Ax = B 形式   A ,B为矩阵

        (1) A为非奇异矩阵时,既有唯一解时

    共有三种方法求解:

    example
    clear all
    A = [3 -9; 2 4];
    b = [-42; 2];
    % three methods
    x = inv(A)*b       % good
    x = A            % better
    x = linsolve(A,b)  % best
    

     https://www.mathworks.com/help/matlab/ref/linsolve.html 

    syms a b c d e f 
     M = [a b;c d];
     rhs = [e;f];
     z = inv(M)*rhs
    
    >> z = inv(M)*rhs
     
    z =
     
     (d*e)/(a*d - b*c) - (b*f)/(a*d - b*c)
     (a*f)/(a*d - b*c) - (c*e)/(a*d - b*c)
     
    >> z = M^-1*rhs
     
    z =
     
     (d*e)/(a*d - b*c) - (b*f)/(a*d - b*c)
     (a*f)/(a*d - b*c) - (c*e)/(a*d - b*c)
     
    >> z = linsolve(M,rhs)
     
    z =
     
     -(b*f - d*e)/(a*d - b*c)
      (a*f - c*e)/(a*d - b*c)
    
    
    >> M = [3 -9;2 4]
    >> rhs = [-42;2];
    
    >> z = inv(M)*rhs
    
    z =
    
       -5.0000
        3.0000
    
    >> z = M^-1*rhs
    
    z =
    
       -5.0000
        3.0000
    
    >> z = linsolve(M,rhs)
    
    z =
    
        -5
         3
    

     (2)A为奇异矩阵时,且A阵和[A,C]阵秩相同,则该方程有无数个解;

    可以用 x = null(A); 先求出系统的齐次方程AX = 0的基础解系,然后再用 x0 = pinv(A)*B 求出方程的一个特解

    然后得出系统的通解:X =a(1) * x(:,1) + a(2) * X(:,2) + ..... + a(n-m) * x(:,n-m) + x0;

    A = [1 2 3 4;2 2 1 1;2 4 6 8;4 4 2 2];
    B = [1 3 2 6]';
    C = [A,B];[rank(A) rank(B)];
    syms a1 a2 ;
    Z = null(sym(A));
    
    >> x0 = sym(pinv(A))*B;
    >> X = a1*Z(:,1)+a2*Z(:,2)+x0 %求出方程的解析解
     
    X =
     
            2*a1 + 3*a2 + 125/131
     96/131 - (7*a2)/2 - (5*a1)/2
                      a1 - 10/131
                      a2 - 39/131
     
    >> A*X-B
     
    ans =
     
     0
     0
     0
     0
     
    

      

     此外,可以采用rref(C),C = [A,B];进行基本行变换,得出方程的解析解;

    >> c = [A,B];D =rref(c)
    
    D =
    
       1.000000000000000                   0  -2.000000000000000  -3.000000000000000   2.000000000000000
                       0   1.000000000000000   2.500000000000000   3.500000000000000  -0.500000000000000
                       0                   0                   0                   0                   0
                       0                   0                   0                   0                   0
    

      

        (3)若A和[A,B]矩阵的秩不同,则原方程就没有解,只能用x = pinv(A)*B求出方程的最小二乘解;

    使用matlab求非线性方程

     Equations and systems solver - MATLAB solve (mathworks.com)

       Solve system of nonlinear equations - MATLAB fsolve (mathworks.com)

     求解代数方程的符号解。

          S = solve(eqn1,eqn2,...,eqnM,var1,var2,...,varN)

    eqn 是符号表达式,可以是方程或不等式。vars是指定未知变量的符号变量表示。

     fsolve 用来解决多个变量的非线性方程组。

         X = fsolve(FUN,X0,OPTIONS)

    syms x y
    >> sol = solve([x^2+y^2-20,y - x^2,x>0,y>0],[x,y])
    sol = 
    
      包含以下字段的 struct:
    
        x: [1×1 sym]
        y: [1×1 sym]
    
    >> sol.x
     
    ans =
     
    2
     
    >> sol.y
     
    ans =
     
    4
    

      还可以使用matlab函数或者匿名函数来描述方程

    function F=myFunction(z)
      x = z(1);
      y = z(2);
    
      F(1)=x^2+y^2-20;
      F(2)=y - x^2;
    end
    

      

    clear all
    z_G = [1; 1];
    z = fsolve(@myFunction, z_G);
    disp(z)
    

     匿名函数形式-----因为匿名函数标准形式为为针对自变量x,所以要都写成x变量的形式

    >> f= @(x)[x(1).^2+x(2).^2-20;x(2) - x(1).^2];
    >> X0 =[1;1];X= fsolve(f,X0)
    X =
    
        2.0000
        4.0000
    

     还可以设置求解精度,options 

    x = fsolve(fun,x0,options)

    option =optimset;

    option .TolX = 1e-20;  option .TolFun = 1e-20; 

    x = fsolve(f,x0,option )

    本文版权归作者和博客园所有,欢迎转载,但请在文章也页面明显位置给出原文链接。如对文章有任何意见或者建议,欢迎评论。个人才疏学浅,文章如有错误,欢迎指正,也欢迎大家分享交流自己更好的方法! 此外有时由于太懒不是自己写上去的,引用了一些大佬的文章,如有忘记备注原文内容链接,实非故意。
  • 相关阅读:
    C#打开SDE数据库的几种方式
    关于DataGridView
    细说Sql Server中的视图(下)转载
    细说Sql Server中的视图(上)转载
    细说Sql Server中的视图
    Ajax实现原理,代码封装
    无限级下拉菜单(树形菜单,二级菜单)
    无限循环轮播图之JS部分(原生JS)
    无限循环轮播图之结构布局(原生JS)
    无限循环轮播图之运动框架(原生JS)
  • 原文地址:https://www.cnblogs.com/csymemory/p/14225661.html
Copyright © 2020-2023  润新知