使用matlab求解线性/非线性方程
使用matlab求解线性方程
Ax = B 形式 A ,B为矩阵
(1) A为非奇异矩阵时,既有唯一解时
共有三种方法求解:
1 2 3 4 5 6 7 8 | example clear all A = [3 -9; 2 4]; b = [-42; 2]; % three methods x = inv (A)*b % good x = A\b % better x = linsolve (A,b) % best |
https://www.mathworks.com/help/matlab/ref/linsolve.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | 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;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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];进行基本行变换,得出方程的解析解;
1 2 3 4 5 6 7 8 | >> 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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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函数或者匿名函数来描述方程
1 2 3 4 5 6 7 | function F=myFunction(z) x = z(1); y = z(2); F(1)=x^2+y^2-20; F(2)=y - x^2; end |
1 2 3 4 | clear all z_G = [1; 1]; z = fsolve(@myFunction, z_G); disp (z) |
匿名函数形式-----因为匿名函数标准形式为为针对自变量x,所以要都写成x变量的形式
1 2 3 4 5 6 | >> 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
option =optimset;
option .TolX = 1e-20; option .TolFun = 1e-20;
x = fsolve(f,x0,option )
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)