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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

. x2 s) _) r4 v通常在不确定方程是否有符号解的时候,推荐先使用 solve 进行尝试,因为 solve 相比于数值求解来说,它不需要提供初值,并且一般情况下能够得到方程的所有解。对于一些简单的超越方程,solve 还能够自动调用数值计算系统给出一个数值解。 # c+ ?8 {! b2 F* ~4 t* T, h
" e! }$ K: s4 w; ?5 ^2 e' Z% B8 I; S" I
solve 的常见调用形式:
" M$ _! x6 U! x7 g* [' H3 tsol = solve(eq)0 z, d, h9 }; L  G
sol = solve(eq,var)
9 h+ Q' T1 z; a1 Asol = solve(eq1,eq2,…,eqn)! ^% T1 y: |5 \9 }
sol = solve(eq1,eq2,…,eqn,var1,var2,…,varn)
% M) i+ E4 B" N% {$ C; @* zeq 为符号表达式,var 为指定的要求解的变量。如果不声明要求解的变量(第一和第三种形式),则 MATLAB 自动按默认变量进行求解,默认变量可以由 symvar(eq) 确定。
2 N$ x- f" Y. K; S%例:求解方程组:  x+y = 1,  x-11y = 5. S! N& `/ s  S$ \# J9 W6 L
6 P; I3 c0 a* H1 Y" }. `
syms x y      %声明符号变量
6 x. [4 m- R. K: D4 e7 weq1 = x+y-1;' i1 f. X! ~# U; ]# R& `
eq2 = x-11*y-5;
( ]' [7 z4 h+ Z  e/ T3 esol = solve(eq1,eq2,x,y);
, E1 c2 `0 o. t6 O7 o9 Lx = sol.x
( }0 `0 E" i% \! V. r7 k3 ry = sol.y
2 i) V( `* ^0 q6 A( X* A1 X; k$ P2 Xsolve 求得的解通过结构体的形式赋值给 sol,然后再通过 x = sol.x 和 y = sol.y 分别赋值给 x 和 y 。 也可以直接使用:
* V) l( M4 l. _( |! a2 g; E[x,y] = solve(eq1,eq2,x,y)) X% S1 _! Y( R7 V$ K
进行求解,但需要注意,等式左边接收参数时应当按字母表进行排序,否则 MATLAB 不会自动识别你的参数顺序,比如:( `- Z( J3 r0 x6 ?
[x,y] = solve(eq1,eq2,x,y)7 N+ v; Y6 A* y9 j) c- j2 \- @0 d
[y,x] = solve(eq1,eq2,x,y)
+ G9 W2 C9 [7 [! u1 P3 P/ isolve 会把答案按字母表进行排序后进行赋值,x 解赋值给第一个参数,y 解赋值给第二个参数,对于第二种形式,实际上最终结果是变量 y 存储了 x 的解而变量 x 存储了 y 的解。 上述情况另一种解决方案是用下面的方法指定输出顺序:
& c% q: n" V! @/ T8 lsyms x y
6 P* \: y9 v: N8 l3 q[y,x] = solve(x + y == 2,x - y == 1, [y, x])
$ I' P5 l8 q. e由于是符号求解,有时候得到的解是一大串式子(符号求解无精度损失,所以 MATLAB 不会自动将答案转化为浮点数),这时候可以用 vpa 或者 double 函数将结果转换为单一的数,但需要注意的是 double 的结果为浮点数,vpa 的结果仍然是符号类型(即 sym 类型)。
# r& }; g" `/ _8 G" h# }/ O9 }/ [% ^$ Q8 d. o; R- {+ i+ t
另外,很多人习惯对于 solve 的参数采用字符型输入,这种方式有几个弊端。
: l0 V+ A" }. T6 o首先就是程序的调试,一旦式子输入有误(最常见的就是括号的匹配),则调试起来会非常困难,例如:# Z) ?6 n7 ~, U; K
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')$ v6 ~+ d; N8 A
这时要去寻找式子输入错误会是一件很麻烦的事,MATLAB 也不会报告具体出错的地方。如果采用符号变量输入:
- a+ D* t; D) P4 _* c- E- usyms x y. \( w: f5 o) {( ?( \2 V
eq1=10^(-4.74)*0.965*y/60000x/(10^(-4.74)+x)+0.1/36500+10^(-14)/x-x;
8 a# a8 ^  x7 m9 \  Beq2=10^(-3.2)*x+0.333/3000+8*10^((-3.2)*0.1+0.1/333*y;
& @; `0 \, l* d' f2 X# Psol=solve(eq1,eq2,x,y)
8 l1 v6 u. K6 s& Z4 [会给程序的调试带来许多便利。对于某些错误,MATLAB 会给出错误代码颜色的高亮, 命令行还能返回具体的错误信息。并且采用字符型输入时,变量的赋值不能传入方程:1 @3 q' n4 z$ C$ f
%例:x+y*sin(x) = 1% C) A6 f" }9 W) [& p6 o
7 m  N* A3 r- E8 n: J3 G) o. l
y = 1;
0 c2 l" N8 ~: _9 a" m7 i  X. gsol = solve('x+y*sin(x)=1','x'): L* c2 y% |  C4 ~
MATLAB 会返回一个空解,而 sym 型输入:
+ {1 E4 U  J) w2 h- {  [syms x 5 C; Y, O6 B& G
y = 1;
% u' X' @8 o; }/ g) [2 Ueq = x+y*sin(x)-1;
  }2 k/ a4 @# ]$ I: s% `" Gsol = solve(eq,x)8 ?! a2 G0 [  G: B* @8 Y* ~) p
能够得到 sol = 0.51097342938856910952001397114508,其中的区别就在于 char 型输入尽管在 solve 前对 y 有一个赋值,但 solve 求解时依然会将 y 当作一个未赋值的常数。
8 M) R( j' A0 M1 ?  Q9 u3 \最后,在今后的高版本 solve 将不支持 char 型参数输入,因此应该尽量放弃使用这种方法。
6 ^% }( w! i8 o7 O, A% z4 Y5 l. f7 N* @9 a& r* n

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-20 12:46 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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