找回密码
 注册
关于网站域名变更的通知
查看: 614|回复: 1
打印 上一主题 下一主题

MATLAB求解方程之solve(Symbolic Math Toolbox)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-12-8 09:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

: }! k- U6 ]9 m通常在不确定方程是否有符号解的时候,推荐先使用 solve 进行尝试,因为 solve 相比于数值求解来说,它不需要提供初值,并且一般情况下能够得到方程的所有解。对于一些简单的超越方程,solve 还能够自动调用数值计算系统给出一个数值解。
' Z" V* Q) h. F9 j, m
9 a8 E" z2 d& N) P& Nsolve 的常见调用形式:7 l0 j( P. V4 T) I+ j+ {- t) S
sol = solve(eq)
" q+ F) A* N( o8 F6 N5 Q8 Tsol = solve(eq,var)0 n' p" n+ {3 ~9 ^' u) L
sol = solve(eq1,eq2,…,eqn)
/ I3 E9 L' y5 A0 T8 F( c; \sol = solve(eq1,eq2,…,eqn,var1,var2,…,varn)
4 q7 q. d- P. B/ e. u* |1 Oeq 为符号表达式,var 为指定的要求解的变量。如果不声明要求解的变量(第一和第三种形式),则 MATLAB 自动按默认变量进行求解,默认变量可以由 symvar(eq) 确定。
) ?" z3 i( w! m# @/ T%例:求解方程组:  x+y = 1,  x-11y = 5; b1 ?9 D$ K8 R" K
  j- D$ E7 B; y& x+ v3 c
syms x y      %声明符号变量6 k( D! }6 @% E
eq1 = x+y-1;* h* u* B. a5 d' j6 `; b
eq2 = x-11*y-5;
9 T* ~4 S$ z; k% Bsol = solve(eq1,eq2,x,y);
# [6 l' h+ l# n4 v8 C" Ux = sol.x$ j" r, B4 f  U
y = sol.y
9 A6 o! a8 h! Rsolve 求得的解通过结构体的形式赋值给 sol,然后再通过 x = sol.x 和 y = sol.y 分别赋值给 x 和 y 。 也可以直接使用:
9 V: U. x" I1 n( f[x,y] = solve(eq1,eq2,x,y)' }$ c9 ?* d: x0 I6 o$ o! i8 N
进行求解,但需要注意,等式左边接收参数时应当按字母表进行排序,否则 MATLAB 不会自动识别你的参数顺序,比如:
: c- A- p& f% A. E) f9 _[x,y] = solve(eq1,eq2,x,y)- Y% G: C5 g( h5 p$ @5 U3 d* ^
[y,x] = solve(eq1,eq2,x,y)# K. H5 D7 R: V8 v
solve 会把答案按字母表进行排序后进行赋值,x 解赋值给第一个参数,y 解赋值给第二个参数,对于第二种形式,实际上最终结果是变量 y 存储了 x 的解而变量 x 存储了 y 的解。 上述情况另一种解决方案是用下面的方法指定输出顺序:
& y$ j' ~% Y& K6 b* {syms x y, [; i# O/ |( H
[y,x] = solve(x + y == 2,x - y == 1, [y, x])( S- Z0 F2 M% D
由于是符号求解,有时候得到的解是一大串式子(符号求解无精度损失,所以 MATLAB 不会自动将答案转化为浮点数),这时候可以用 vpa 或者 double 函数将结果转换为单一的数,但需要注意的是 double 的结果为浮点数,vpa 的结果仍然是符号类型(即 sym 类型)。( K$ f7 x( g% R% I

; f6 R" [1 A0 l另外,很多人习惯对于 solve 的参数采用字符型输入,这种方式有几个弊端。
+ D$ r0 v8 H) Y& K首先就是程序的调试,一旦式子输入有误(最常见的就是括号的匹配),则调试起来会非常困难,例如:
& T) N5 R3 M( c7 ~7 P6 asolve('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')8 b# f$ W1 i7 k$ n& G$ q7 Q
这时要去寻找式子输入错误会是一件很麻烦的事,MATLAB 也不会报告具体出错的地方。如果采用符号变量输入:9 k+ m$ {- r& I$ g  [2 N
syms x y( I3 |7 d4 q* [- v+ A1 x" }
eq1=10^(-4.74)*0.965*y/60000x/(10^(-4.74)+x)+0.1/36500+10^(-14)/x-x;
. x/ E; d! Q8 r2 K- Beq2=10^(-3.2)*x+0.333/3000+8*10^((-3.2)*0.1+0.1/333*y;
- B, H% k  `6 Hsol=solve(eq1,eq2,x,y)
, C  n( X/ B6 P8 c会给程序的调试带来许多便利。对于某些错误,MATLAB 会给出错误代码颜色的高亮, 命令行还能返回具体的错误信息。并且采用字符型输入时,变量的赋值不能传入方程:
/ e( `: Q$ K0 L/ d8 ~/ T%例:x+y*sin(x) = 1+ ]% I; ?0 b! @

* F# O" z. Q+ r" |- ]+ wy = 1;
$ b' o+ A& ?! V3 l( |" b- fsol = solve('x+y*sin(x)=1','x')  [8 C6 T% x3 e% \
MATLAB 会返回一个空解,而 sym 型输入:
; E( T9 R7 U* a5 Jsyms x " |5 D7 a' S8 D
y = 1;$ A, l7 Z/ S) w+ D4 m
eq = x+y*sin(x)-1;2 ?% ^) W/ y, y- e2 m' o" ~. O  _
sol = solve(eq,x)
; }: C* I. F& P) @: E8 e! H  s/ d能够得到 sol = 0.51097342938856910952001397114508,其中的区别就在于 char 型输入尽管在 solve 前对 y 有一个赋值,但 solve 求解时依然会将 y 当作一个未赋值的常数。 " _/ |) ^2 x# [5 w4 P/ V) s* Y
最后,在今后的高版本 solve 将不支持 char 型参数输入,因此应该尽量放弃使用这种方法。
/ \  b1 J6 x; ~8 t. q
! K. K1 s) i( ^- M, {: O; J

该用户从未签到

2#
发表于 2020-12-8 10:48 | 只看该作者
MATLAB求解方程之solve(Symbolic Math Toolbox)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 04:39 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表