EDA365电子论坛网
标题:
MATLAB求解方程之solve(Symbolic Math Toolbox)
[打印本页]
作者:
pulbieup
时间:
2020-12-8 09:58
标题:
MATLAB求解方程之solve(Symbolic Math Toolbox)
+ H# T& h G7 @% w
通常在不确定方程是否有符号解的时候,推荐先使用 solve 进行尝试,因为 solve 相比于数值求解来说,它不需要提供初值,并且一般情况下能够得到方程的所有解。对于一些简单的超越方程,solve 还能够自动调用数值计算系统给出一个数值解。
# Y. \" y; T4 v" P7 k# M; E
: u! w- v; k8 ]: j/ V- d2 w
solve 的常见调用形式:
" d h, S) Z+ c3 e! [( ^* |7 h
sol = solve(eq)
7 E) r( D3 l8 k
sol = solve(eq,var)
' V2 D& b+ P& m/ F
sol = solve(eq1,eq2,…,eqn)
) w& |; M4 h! f4 q+ F" w/ |
sol = solve(eq1,eq2,…,eqn,var1,var2,…,varn)
+ Q, w# p% h8 K/ @2 g7 j! q) r
eq 为符号表达式,var 为指定的要求解的变量。如果不声明要求解的变量(第一和第三种形式),则 MATLAB 自动按默认变量进行求解,默认变量可以由 symvar(eq) 确定。
) @' p( g0 g- B2 O9 @
%例:求解方程组: x+y = 1, x-11y = 5
! Y% }7 e( {3 h+ W& f
) }# ]' x: U: I+ L: s" ?
syms x y %声明符号变量
9 x) v7 j& E8 @# n5 h& q
eq1 = x+y-1;
/ S) g/ `5 @5 L- @
eq2 = x-11*y-5;
: j+ c `. e+ m6 V k
sol = solve(eq1,eq2,x,y);
1 s- f5 G* ^3 p
x = sol.x
% e8 Q9 n+ Z' k' k
y = sol.y
0 ]' f' m$ S* x* y2 K. J) V! I3 I+ M
solve 求得的解通过结构体的形式赋值给 sol,然后再通过 x = sol.x 和 y = sol.y 分别赋值给 x 和 y 。 也可以直接使用:
: t E7 ~( O% [) N
[x,y] = solve(eq1,eq2,x,y)
4 G" a. Y; y. `5 E4 }2 [) _, Y
进行求解,但需要注意,等式左边接收参数时应当按字母表进行排序,否则 MATLAB 不会自动识别你的参数顺序,比如:
4 |5 e% q$ K# B% K
[x,y] = solve(eq1,eq2,x,y)
/ i( |8 L6 _3 ?& Y" x
[y,x] = solve(eq1,eq2,x,y)
9 r8 p4 u% C2 d8 x
solve 会把答案按字母表进行排序后进行赋值,x 解赋值给第一个参数,y 解赋值给第二个参数,对于第二种形式,实际上最终结果是变量 y 存储了 x 的解而变量 x 存储了 y 的解。 上述情况另一种解决方案是用下面的方法指定输出顺序:
W( \! f! |. h" T
syms x y
4 G; ]3 p! ~' u% G! n
[y,x] = solve(x + y == 2,x - y == 1, [y, x])
0 r# J! B8 t' T" T f5 s, j1 |
由于是符号求解,有时候得到的解是一大串式子(符号求解无精度损失,所以 MATLAB 不会自动将答案转化为浮点数),这时候可以用 vpa 或者 double 函数将结果转换为单一的数,但需要注意的是 double 的结果为浮点数,vpa 的结果仍然是符号类型(即 sym 类型)。
9 ?) j+ L; F; o8 D% \4 V( d @1 D
; l5 b8 d7 Z% Y7 [4 F, D
另外,很多人习惯对于 solve 的参数采用字符型输入,这种方式有几个弊端。
- |7 n# S# f, U% ~: T
首先就是程序的调试,一旦式子输入有误(最常见的就是括号的匹配),则调试起来会非常困难,例如:
# J8 w" L( q! j7 a9 @
solve('10^(-4.74)*0.965*y/60000x/(10^(-4.74)+x)+0.1/36500+10^(-14)/x-x=0','10^(-3.2)*x+0.333/3000+8*10^((-3.2)*0.1+0.1/333*y','x','y')
$ P) D* K3 n5 Q: i
这时要去寻找式子输入错误会是一件很麻烦的事,MATLAB 也不会报告具体出错的地方。如果采用符号变量输入:
3 Y; {8 m- Q" Z* f9 J9 S) l
syms x y
: k! N3 V& ~& c* m
eq1=10^(-4.74)*0.965*y/60000x/(10^(-4.74)+x)+0.1/36500+10^(-14)/x-x;
$ z9 o! R5 W/ p: G! J8 ?' e+ P
eq2=10^(-3.2)*x+0.333/3000+8*10^((-3.2)*0.1+0.1/333*y;
, P! E& {' y% A' s- s
sol=solve(eq1,eq2,x,y)
+ k) e) C) `# c9 M% G
会给程序的调试带来许多便利。对于某些错误,MATLAB 会给出错误代码颜色的高亮, 命令行还能返回具体的错误信息。并且采用字符型输入时,变量的赋值不能传入方程:
4 _# j2 m O( F' k- ^
%例:x+y*sin(x) = 1
0 \3 a5 _# q& a1 \& `1 z
& F& y4 q% T! M; ?9 y
y = 1;
$ \3 E3 u2 H: ]8 M' E
sol = solve('x+y*sin(x)=1','x')
% h6 ?7 ~6 T' P; @
MATLAB 会返回一个空解,而 sym 型输入:
% V( x5 b7 l3 z0 D9 Y- Y$ N
syms x
0 ?5 |" f+ F, G6 ]) b
y = 1;
0 o( C' x4 {+ q8 A8 f. R0 M
eq = x+y*sin(x)-1;
* t- J& c# f% U; L
sol = solve(eq,x)
: G( w" A! |3 M3 A
能够得到 sol = 0.51097342938856910952001397114508,其中的区别就在于 char 型输入尽管在 solve 前对 y 有一个赋值,但 solve 求解时依然会将 y 当作一个未赋值的常数。
$ p1 z$ B" z& U" m1 |: \9 u. |* H' n$ n
最后,在今后的高版本 solve 将不支持 char 型参数输入,因此应该尽量放弃使用这种方法。
7 ]2 {, X- M% v9 V
6 t6 T1 H& q( O1 u4 R/ y" b* h
作者:
CCxiaom
时间:
2020-12-8 10:48
MATLAB求解方程之solve(Symbolic Math Toolbox)
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2