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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

7 ^$ [3 I& f7 o; Q通常在不确定方程是否有符号解的时候,推荐先使用 solve 进行尝试,因为 solve 相比于数值求解来说,它不需要提供初值,并且一般情况下能够得到方程的所有解。对于一些简单的超越方程,solve 还能够自动调用数值计算系统给出一个数值解。 , {) D" v/ ~( z3 X2 S7 D/ {5 q

6 ^. y/ b& U' t# |solve 的常见调用形式:: p; C# a6 d, O" s3 @+ c% p
sol = solve(eq)
2 K1 F3 o9 G8 lsol = solve(eq,var)' K4 `* B3 v1 ]/ L  c! w
sol = solve(eq1,eq2,…,eqn)
6 X% _/ G* \% k& h: w% u$ Ksol = solve(eq1,eq2,…,eqn,var1,var2,…,varn)0 f0 c5 c) I6 L1 E- }
eq 为符号表达式,var 为指定的要求解的变量。如果不声明要求解的变量(第一和第三种形式),则 MATLAB 自动按默认变量进行求解,默认变量可以由 symvar(eq) 确定。
5 O* e. P# I, Y3 I%例:求解方程组:  x+y = 1,  x-11y = 5, u" F* _, J& u
4 }. B. {6 _, H
syms x y      %声明符号变量) f6 C2 x( ?% ~5 R& W$ t6 w! b
eq1 = x+y-1;
* \! A- F1 q+ Geq2 = x-11*y-5;
  ]2 V% y% R+ t: J' T8 i/ J# isol = solve(eq1,eq2,x,y);* m$ Z7 s' c5 `. E1 F
x = sol.x
) x# w  k, s$ ly = sol.y
; s+ W- o! X& S9 ?: asolve 求得的解通过结构体的形式赋值给 sol,然后再通过 x = sol.x 和 y = sol.y 分别赋值给 x 和 y 。 也可以直接使用:1 Y- K3 Z6 x1 Z6 ^
[x,y] = solve(eq1,eq2,x,y)
. f2 S' }3 h7 ], H  m* N1 g进行求解,但需要注意,等式左边接收参数时应当按字母表进行排序,否则 MATLAB 不会自动识别你的参数顺序,比如:, U$ Y# J2 B3 \- d9 V
[x,y] = solve(eq1,eq2,x,y)' o/ D9 U2 J8 p6 i; K
[y,x] = solve(eq1,eq2,x,y)0 `) D1 h: v# H5 n0 F; r$ e
solve 会把答案按字母表进行排序后进行赋值,x 解赋值给第一个参数,y 解赋值给第二个参数,对于第二种形式,实际上最终结果是变量 y 存储了 x 的解而变量 x 存储了 y 的解。 上述情况另一种解决方案是用下面的方法指定输出顺序:. _/ C* n; ?  Y, a: u5 p" N5 X
syms x y
/ l* R2 _9 v2 E; z[y,x] = solve(x + y == 2,x - y == 1, [y, x])( Q1 ?8 C# ?$ f  t0 W
由于是符号求解,有时候得到的解是一大串式子(符号求解无精度损失,所以 MATLAB 不会自动将答案转化为浮点数),这时候可以用 vpa 或者 double 函数将结果转换为单一的数,但需要注意的是 double 的结果为浮点数,vpa 的结果仍然是符号类型(即 sym 类型)。
* ~1 @2 N" O0 n  ~1 Q2 I
$ B# R6 P7 Q. L, a* G" U另外,很多人习惯对于 solve 的参数采用字符型输入,这种方式有几个弊端。
7 ~. {& M3 F7 u首先就是程序的调试,一旦式子输入有误(最常见的就是括号的匹配),则调试起来会非常困难,例如:
* e. h: {0 H" hsolve('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')
4 U. S% i: l- s  V4 s6 U0 `0 I* r% y- W这时要去寻找式子输入错误会是一件很麻烦的事,MATLAB 也不会报告具体出错的地方。如果采用符号变量输入:
: f2 W) E8 ?5 ]) }# isyms x y
% {  `2 n/ U8 seq1=10^(-4.74)*0.965*y/60000x/(10^(-4.74)+x)+0.1/36500+10^(-14)/x-x;
% }. {0 o6 V1 }* a: l" ]1 jeq2=10^(-3.2)*x+0.333/3000+8*10^((-3.2)*0.1+0.1/333*y;
" o* D- e$ C* ~$ U$ t$ `- Usol=solve(eq1,eq2,x,y)- c* E& M% e) ^3 e5 G$ o( E/ s
会给程序的调试带来许多便利。对于某些错误,MATLAB 会给出错误代码颜色的高亮, 命令行还能返回具体的错误信息。并且采用字符型输入时,变量的赋值不能传入方程:2 W) y& S* o0 p
%例:x+y*sin(x) = 1
* A4 v# G6 T% `3 y: f1 L% D& Z( `0 |7 g$ H6 a0 {; S+ `- D
y = 1;% `2 {3 ]- ^7 N5 Y3 q: y
sol = solve('x+y*sin(x)=1','x')
  ~2 L- P$ c" oMATLAB 会返回一个空解,而 sym 型输入:
/ D" N6 B* ]/ o9 P) X5 Zsyms x
6 w8 Z& l; @' i( h! k( Yy = 1;& ]4 k5 C, v: H" w# C8 i$ ~
eq = x+y*sin(x)-1;( q) v$ X+ f0 l! H! H% u. W6 b: m8 [
sol = solve(eq,x)
- ~+ F- _" C* h6 }1 h; `' a; }能够得到 sol = 0.51097342938856910952001397114508,其中的区别就在于 char 型输入尽管在 solve 前对 y 有一个赋值,但 solve 求解时依然会将 y 当作一个未赋值的常数。 3 r* H3 R) o+ s* q8 s
最后,在今后的高版本 solve 将不支持 char 型参数输入,因此应该尽量放弃使用这种方法。
! {( z- I$ }5 y6 Z/ L2 S' g+ \6 p* T2 A" Q5 W6 b1 X' Y" [5 K

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-1 02:12 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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