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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
# R, H/ V7 Z: j' L
通常在不确定方程是否有符号解的时候,推荐先使用 solve 进行尝试,因为 solve 相比于数值求解来说,它不需要提供初值,并且一般情况下能够得到方程的所有解。对于一些简单的超越方程,solve 还能够自动调用数值计算系统给出一个数值解。
% i5 n; F& _; ^0 l) n* ~
- I, b) J+ X; }! Q; ~7 e  Csolve 的常见调用形式:
& K( V* g/ V% y; k0 d) Esol = solve(eq)
9 h& \$ N9 N1 B. J8 R4 K% ]% e- [4 Rsol = solve(eq,var)
) Y! ^9 }/ s" w% g1 Z) D! L2 isol = solve(eq1,eq2,…,eqn)  n) e% C7 _6 M, E& M. ~
sol = solve(eq1,eq2,…,eqn,var1,var2,…,varn)+ @1 d' p4 ~6 u" t2 r, {
eq 为符号表达式,var 为指定的要求解的变量。如果不声明要求解的变量(第一和第三种形式),则 MATLAB 自动按默认变量进行求解,默认变量可以由 symvar(eq) 确定。! h( [0 s" I: u9 }. E2 ?
%例:求解方程组:  x+y = 1,  x-11y = 5
' i2 j6 z$ D4 o  w; o4 \# @0 a% F" ?9 E# X/ w' {, a5 e) S3 z8 Q
syms x y      %声明符号变量5 g) u4 E! J4 j" T9 w
eq1 = x+y-1;
* |, [- m' A1 h0 r# meq2 = x-11*y-5;: J! b5 U% o- {1 d6 Z+ j0 k5 Q
sol = solve(eq1,eq2,x,y);4 o& Z( X/ e* F3 R  n
x = sol.x
  C/ q& M3 L0 G  {y = sol.y* X1 V) r# |( B+ W5 I
solve 求得的解通过结构体的形式赋值给 sol,然后再通过 x = sol.x 和 y = sol.y 分别赋值给 x 和 y 。 也可以直接使用:
' p; n# ~& n0 v2 p) N7 `[x,y] = solve(eq1,eq2,x,y)
! [4 G+ ]% N7 @& O进行求解,但需要注意,等式左边接收参数时应当按字母表进行排序,否则 MATLAB 不会自动识别你的参数顺序,比如:
+ n  b, N  @6 \) W" n) {[x,y] = solve(eq1,eq2,x,y)
8 R) H- @) C( y[y,x] = solve(eq1,eq2,x,y)
$ m0 |9 j% P/ \" l. Q- m: i/ Fsolve 会把答案按字母表进行排序后进行赋值,x 解赋值给第一个参数,y 解赋值给第二个参数,对于第二种形式,实际上最终结果是变量 y 存储了 x 的解而变量 x 存储了 y 的解。 上述情况另一种解决方案是用下面的方法指定输出顺序:
! }/ d* b9 m2 t! Isyms x y
" U- a9 }9 {! c4 Y. y; L[y,x] = solve(x + y == 2,x - y == 1, [y, x])& L% x$ Z+ v  L
由于是符号求解,有时候得到的解是一大串式子(符号求解无精度损失,所以 MATLAB 不会自动将答案转化为浮点数),这时候可以用 vpa 或者 double 函数将结果转换为单一的数,但需要注意的是 double 的结果为浮点数,vpa 的结果仍然是符号类型(即 sym 类型)。
- F- y9 v+ P8 a7 N( H' A
* l& |& _$ Z" k另外,很多人习惯对于 solve 的参数采用字符型输入,这种方式有几个弊端。
: M& N' w/ H8 U# D5 w  [: g7 o8 [/ j首先就是程序的调试,一旦式子输入有误(最常见的就是括号的匹配),则调试起来会非常困难,例如:
9 ?4 \  {* p9 d: [! F, ysolve('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')
! u! T7 ~# W5 w) w1 W4 s' b这时要去寻找式子输入错误会是一件很麻烦的事,MATLAB 也不会报告具体出错的地方。如果采用符号变量输入:
. G' ^% X6 y3 P* q4 Msyms x y
+ H8 N) c- b$ J6 V$ heq1=10^(-4.74)*0.965*y/60000x/(10^(-4.74)+x)+0.1/36500+10^(-14)/x-x;
  x0 w; i8 ]- G9 H3 w: P% aeq2=10^(-3.2)*x+0.333/3000+8*10^((-3.2)*0.1+0.1/333*y;1 Z$ e. m: c8 K
sol=solve(eq1,eq2,x,y)& e4 A5 {; `( F% [' H" `
会给程序的调试带来许多便利。对于某些错误,MATLAB 会给出错误代码颜色的高亮, 命令行还能返回具体的错误信息。并且采用字符型输入时,变量的赋值不能传入方程:
# L9 A+ D: y, [1 [%例:x+y*sin(x) = 1
0 k  [+ r$ a& p0 A  o2 S6 t
. `. o# I/ n9 s8 ~y = 1;' @: A. }- d0 w  D2 k
sol = solve('x+y*sin(x)=1','x')" y' W  G$ l. `) q  z+ D
MATLAB 会返回一个空解,而 sym 型输入:" w8 Q. x; h/ V" f2 y
syms x 2 u1 D9 w; f6 f9 k
y = 1;
' H7 d! Z% X! Keq = x+y*sin(x)-1;
7 i+ A7 ^; l7 hsol = solve(eq,x)
! V2 f5 y* e& L2 m+ H' b能够得到 sol = 0.51097342938856910952001397114508,其中的区别就在于 char 型输入尽管在 solve 前对 y 有一个赋值,但 solve 求解时依然会将 y 当作一个未赋值的常数。
3 e- q  b6 y' B' G, L* t9 q最后,在今后的高版本 solve 将不支持 char 型参数输入,因此应该尽量放弃使用这种方法。 / W+ a0 B4 u7 L+ ?6 h+ J
  k7 [4 O8 h. v" L: T" @3 }1 y

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-6 21:06 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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