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

MATLAB符号计算

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 cat12620 于 2018-11-7 16:33 编辑
! s3 u/ o# @; |8 [  m) i" q9 g5 M! w5 F5 K: T  q' w
符号计算则是可以对未赋值的符号对象(可以是常数、变量、表达式)进行运算和处理。MATLAB具有符号数学工具箱(Symbolic Math Toolbox),将符号运算结合到MATLAB的数值运算环境。符号数学工具箱是建立在Maple软件基础上的。
4 E' ~% \( h7 C& Y; v/ O3.1 符号表达式的建立7 i$ l- j3 q0 U8 c6 K
Symbolic Math Toolbox2.1版规定在进行符号计算时,首先要定义基本的符号对象然后才能进行符号运算。. ]! |7 [# k% [
3.1.1创建符号常量8 a8 y1 W- L: l3 z8 u$ _' I. K
符号常量是不含变量的符号表达式,用sym命令来创建符号常量。
% D" g$ o) D: {6 `8 ^2 m语法:
/ v! H7 A" J: b: F       sym(‘常量’)              %创建符号常量) t) J# x8 w* B8 u5 N. E7 p
例如,创建符号常量,这种方式是绝对准确的符号数值表示:) ^9 D. N6 w6 P
>> a=sym('sin(2)')! g4 h( i! I, Y* W/ G2 s
a =
. W, J( Q6 Q( ^: p$ Y0 c0 A) Xsin(2)
# |! D5 @& A7 o/ N& osym命令也可以把数值转换成某种格式的符号常量。. }5 \% |3 Q& B1 f
语法:+ A/ i% g$ ]& ]" g% [8 |2 y! K# f9 `
       sym(常量,参数)          %把常量按某种格式转换为符号常量1 X0 L4 @; h% M  u6 k7 ?
说明:参数可以选择为’d’、’f’、’e’或’r’ 四种格式,也可省略,其作用如表3.1所示。/ I6 B- [2 C# V# R, }& j  N  P, U9 s
3.1 参数设置
参数
' P6 c0 f; c* ^' ~9 d
作用1 y& n8 B: B0 v) x) F
d" R/ ~- U9 k* j7 E( ~, A
返回最接近的十进制数值(默认位数为32位)' ?2 j6 {% L. ~9 d2 v, c& k
f
+ |. _7 K; S& p: E) H
返回该符号值最接近的浮点表示
( M2 E0 _- a+ N! ]
r
7 C& O/ d) Q, Q: m
返回该符号值最接近的有理数型(为系统默认方式),可表示为p/q、p*q、10^q、pi/q、2^q和sqrt(p)形式之一
: h& ^. e/ q8 B7 e
e
/ C4 z( E6 R0 b0 s
返回最接近的带有机器浮点误差的有理值
' V2 T9 f# B+ l" @2 _8 o2 w
例如,创建符号常量,这种方式是绝对准确的符号数值表示:
" O! U% \8 q" p( j8 E. U, a0 G a=sym('sin(2)') 5 O, B3 ?1 f6 L
% D+ |5 l1 U# j4 z/ |
a =
; D4 G1 E) X- g  @, U9 L9 ^sin(2)  
. a7 o  _. s6 |& \6 c
游客,如果您要查看本帖隐藏内容请回复

& p+ S6 Z* S2 E* p eig(A)                 %计算特征值 * p- c9 m" A+ g4 J1 t
. u7 p$ w# S8 h1 x
ans =. y, G& M* z# }& |
[ 1/2*a11+1/2*a22+1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]9 R( p8 e& h7 V$ y* i- w5 A
[ 1/2*a11+1/2*a22-1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]  
6 `  {, y# Q% N. O' | . Q9 L+ F0 K1 m! t; h
3.5】符号表达式f=2x2+3x+4与g=5x+6的代数运算。6 {1 |' F7 u& P. k: Y+ ]" @! P
f=sym('2*x^2+3*x+4') . M" z" |. n3 ^, L9 t7 X0 O. @# w* ~
, L8 K9 m  ^2 c3 \. n8 S7 Q
f =
- E8 D6 L$ i* p8 P3 Q8 K9 v2*x^2+3*x+4  
. R/ J* q! s' p g=sym('5*x+6') # ^9 g+ x% A" O  x* q
, j$ A: q/ f% u' G, A2 L' J
g =5 [5 R; B5 ]" T1 Q. }2 {+ [
5*x+6  ) N/ ^; O/ D# m* O3 |; A
f+g                %符号表达式相加 " r3 x3 B+ ?# B, A/ j9 q

% B+ g/ ]6 d- Fans =( Z2 w. ~! q9 O3 h: ]6 a* M0 @
2*x^2+8*x+10  0 n+ Y9 [4 P+ w+ j- O
f*g                %符号表达式相乘
2 V" d( o3 m3 r& c
3 d7 s" I  V  jans =
2 T$ l& e2 ~! ]+ J" F. b(2*x^2+3*x+4)*(5*x+6)  2 n3 B# w# L- C9 {- N6 U
3.2.2符号数值任意精度控制和运算
% d+ B8 W9 A& I$ U1. Symbolic Math Toolbox中的算术运算方式9 z/ w# t/ C) C5 w# p! U
在Symbolic Math Toolbox中有三种不同的算术运算:
, k- p9 K$ O* I- Y8 v9 s5 @§      数值型:MATLAB的浮点运算。
. s  F0 o. N# ^0 N/ I§      有理数型:Maple的精确符号运算。
- u. h! D6 G6 i  T6 M§      VPA型:Maple的任意精度运算。, ?+ h  J- ^) B% `' S" _7 }
3 O' d" z, P( A; R' N7 g! p' [
2. 任意精度控制% M6 [9 m! w  p) K2 i5 g/ f( _
任意精度的VPA型运算可以使用digits和vpa命令来实现。3 n& u: A+ Y, B4 k& C3 B$ ^
语法:
) d/ C; m$ A9 o       digits(n)                    %设定默认的精度
0 e* Z' w3 D& x/ ]说明:n为所期望的有效位数。digits函数可以改变默认的有效位数来改变精度,随后的每个进行Maple函数的计算都以新精度为准。当有效位数增加时,计算时间和占用的内存也增加。命令“digits”用来显示默认的有效位数,默认为32位。
4 Z  j' m5 u) V6 v) T6 V+ V8 N语法:3 F8 A" s6 Y" D7 V( h
       S=vpa(s,n)                %将s表示为n位有效位数的符号对象3 \5 S+ ^7 e: ~2 l
说明:s可以是数值对象或符号对象,但计算的结果S一定是符号对象;当参数n省略时则以给定的digits指定精度。vpa命令只对指定的符号对象s按新精度进行计算,并以同样的精度显示计算结果,但并不改变全局的digits参数。
9 F$ f7 V. N5 X/ X3.6】对表达式file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image006.gif进行任意精度控制的比较。
- m. i' N; L. ]2 g* g3 j% C2 j5 c a=sym('2*sqrt(5)+pi')   q+ i8 F- t2 F

8 c; l, g) c- a9 e( y: b9 Ja =1 N: y3 ~" i, X" W$ Y. ~' ^7 u' n4 o
2*sqrt(5)+pi  
# ]; o: k8 B/ t& U9 ?, l3 X9 O" X; u/ R. u digits      %显示默认的有效位数
9 _* B- [" o# ]/ {
$ T6 k& |: a8 o1 i; s" r % [  l5 @" B+ _+ z% L1 E/ q
Digits = 32
5 N. F# J% L6 e   
$ E3 Y5 U0 |: T& u5 ] vpa(a)      %用默认的位数计算并显示
$ L; h2 \* N9 q% i. H- n7 `
- a9 [4 t) f8 t& i8 ]9 V4 dans =
7 Z( F( n6 N8 n7.6137286085893726312809907207421  ! L# P" @% P, P, v2 K% ]) p. o
vpa(a,20)       %按指定的精度计算并显示
, u- ~. \6 H% B9 W5 T( B; w
0 j7 c& Y; S4 S: |, }ans =5 J# y( X' [, p5 O5 k0 k0 @3 Q
7.6137286085893726313  7 L* v; }/ H# k% C4 B2 P
digits(15)      %改变默认的有效位数. H! [* o/ g+ T3 B. [
vpa(a)      %按digits指定的精度计算并显示 1 g5 B9 N/ T" p4 u$ m

9 Q) w# a- d9 c; \2 b* C$ M# bans =* }% \- C; S& Z. T' u& n" c  k9 N
7.61372860858937  
1 s& ~" f# {/ ~3 j8 }; O4 _' T
7 Q& z2 z% G: C# c  v# G3. Symbolic Math Toolbox中的三种运算方式的比较$ m$ z( v( A2 w) @; n6 M9 _* g
3.6】用三种运算方式表达式比较2/3的结果。
; o* l& }7 @$ ^+ R2 {9 }a1 =2/3      %数值型
& S0 d7 a* u( ~" A + _7 l" H" Z; V  S* I6 D- J8 W
a1 =
* D0 q5 K# o3 D3 @* W: |    0.6667  
5 B* E/ I" \1 \* k: j% Va2 = sym(2/3)    %有理数型
/ z4 P7 k. J0 J6 X) L
+ z3 |/ G. ~& a+ P4 g1 pa2 =
+ d/ M8 \' f" W2 ~0 q0 o2/3  - r( H- O9 {3 K' i  l( W9 d
a3 =vpa('2/3',32) %VPA % G$ `; c6 R8 F
- G, X  Y  ]- H4 D9 k
a3 =+ B) a( ~- u$ ^; ^3 R6 W1 M
.66666666666666666666666666666667  
* e# G) [! o5 W0 A! i/ c程序分析:
5 C/ i& f! r! `& R§      三种运算方式中数值型运算的速度最快。5 |# i+ Z) d7 ^9 Q. b5 J' z7 b
§      有理数型符号运算的计算时间和占用内存是最大的,产生的结果是非常准确的。
( E% Z- x$ Z- @§      VPA型的任意精度符号运算比较灵活,可以设置任意有效精度,当保留的有效位数增加时,每次运算的时间和使用的内存也会增加。
+ _/ b/ }& m9 J§      数值型变量a1结果显示的有效位数并不是存储的有效位数,在第一章中介绍显示的有效位数由“format”命令控制。如下面修改“format”命令就改变了显示的有效位数:
0 n# L* @; P% z0 m0 @; C; T format long
: ?# x$ Q4 l' b9 {2 o8 f) a5 | a1
1 m1 \4 Q$ @% Z* |! `+ i4 n8 n3 O , R! `5 D0 g1 O$ R$ t6 G7 P: p& ~
a1 =/ c8 V% E$ c$ z9 e0 \/ B4 G) S5 [) Z
   0.66666666666667  
4 P. g" G7 k% ?" c4 T+ C; L3.2.3符号对象与数值对象的转换5 w+ i/ W* `- ]0 z, a; q5 N! j' z3 @
1. 将数值对象转换为符号对象
# d; Y+ f  ~6 a# F& psym命令可以把数值型对象转换成有理数型符号对象,vpa命令可以将数值型对象转换为任意精度的VPA型符号对象。
. @2 y4 T2 e) p+ x, p! L6 ~2 q5 N
5 @9 o7 t* O9 f2. 将符号对象转换为数值对象
: V: t5 {7 }; _8 Y! u; b使用double、 numeric函数可以将有理数型和VPA型符号对象转换成数值对象。
* ?. ?/ K- k) O* }/ e8 [% P! t语法:; t( w7 l; g/ \6 S. ~
       N=double(S)              %将符号变量S转换为数值变量N
8 H6 x2 _. B  n2 V2 B; B9 p       N=numeric(S)           %将符号变量S转换为数值变量N
2 o" K/ j- ^" t, y; o3.7】将符号变量file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image008.gif与数值变量进行转换。
" {% b! ~$ w) h8 o+ ~  f% L: M8 q clear7 J2 S; V2 f8 d/ B+ B& s
a1=sym('2*sqrt(5)+pi')
8 v, B; H5 F" J" U6 [
" d3 f4 p/ X. S7 w  X8 T) ua1 =0 g3 q2 {9 o; ^; R- e: l. C
2*sqrt(5)+pi  * D& `& k, a5 e: q1 x. y0 H- I3 b

: ]2 ~/ C5 Y1 o+ T  c b1=double(a1)             %转换为数值变量
5 T; e8 ]" G9 T: s1 w- ` ; l: O0 B/ V1 H  ^" q, ~9 ?  F' e7 V
b1 =
3 x; N: K6 F, K. q, s    7.6137  2 t, p7 f1 p) E1 M7 M) `) y
2 S) ]0 _9 P+ r! o7 ]7 e
a2=vpa(sym('2*sqrt(5)+pi'),32)
8 L/ E0 F5 l3 Y4 g& L! i' ?/ K- Q
9 G3 T) ^+ |% sa2 =
2 M2 Z" l! k+ p! J! K7.6137286085893726312809907207421  
) T' r% r" y& E7 \' I3 ]% e
% V, h, e9 o2 ~, E- z" U b2=numeric(a2)         %转换为数值变量
' E4 c7 P# Q3 {; ^8 ? - {9 @9 v0 A) A8 P, `0 T/ u
b2 =& X% K5 A8 X, t! X4 `
    7.6137  8 ?: c0 S' @& ~+ n
3.7】由符号变量得出数值结果。
1 Q: t6 J% _( ~* ? b3=eval(a1) 2 [+ S5 O% Y& [* J9 Q( s* P

& S, k9 K0 K* V  v5 ?3 Zb3 =% @3 b2 Q* _0 r2 Z
    7.6137  
) A9 K0 T: I& \' J3 @用“whos”命令查看变量的类型,可以看到b1、b2、b3都转换为双精度型:
$ w# w+ B8 S% A% w- ` whos 7 K1 f, I% Z* M7 Y. i+ I
' X$ f3 C5 p+ H# L" e
      Size                   Bytes Class
" I8 K6 P- r9 Y8 p
% e7 b, ?4 g* s" O# W. I0 @        1x1                      148 sym object- N: U9 s* G$ D( ~& T0 z
        1x1                      190 sym object
$ g& h1 }+ O  c4 |, j' f: s        1x1                        8 double array9 t  h1 g% g, `; |- m$ F
        1x1                        8 double array3 O/ B" v* E$ I* G/ m
        1x1                        8 double array
3 u, f6 j* U1 N( a# `1 c0 T
. a- u1 H7 r3 a; KGrand total is 50 elements using 362 bytes  
0 f# }7 B7 r  ]0 w% k0 O2 A( B- v3.3符号表达式的操作和转换
4 D! K* _. G8 Y: q3.3.1符号表达式中自由变量的确定7 h0 n7 t: ?1 R* s
1. 自由变量的确定原则5 `( r' b9 {* w
,MATLAB将基于以下原则选择一个自由变量:. l& e1 p+ |# B  |* k/ }
§      小写字母i和j不能作为自由变量。6 q1 T! T/ ?7 `! \4 g
§      符号表达式中如果有多个字符变量,则按照以下顺序选择自由变量:首先选择x作为自由变量;如果没有x,则选择在字母顺序中最接近x的字符变量;如果与x相同距离,则在x后面的优先。
- n  u9 r4 i4 L+ s: J/ d+ Z3 r$ Q§      大写字母比所有的小写字母都靠后。# B, ^. U0 k% P1 o8 C  G( S

2 ]( X) E4 L4 q9 H6 P( F% ~2. findsym函数
/ g# X" K' O( ^如果不确定符号表达式中的自由符号变量,可以用findsym函数来自动确定。
! p; ?1 y0 p: D4 @' h语法:7 L9 r0 Z& j: V' e) A
       findsym(EXPR,n)        %确定自由符号变量; O* ?0 K! Y& Q0 g% u2 L+ Q# T/ F
说明:EXPR可以是符号表达式或符号矩阵;n为按顺序得出符号变量的个数,当n省略时,则不按顺序得出EXPR中所有的符号变量。( c+ o( d+ E  o7 k- W; s
3.8】得出符号表达式中的符号变量。
) a. v( S! \/ p+ f2 ?: w0 Y f=sym('a*x^2+b*x+c')
) q: j- g/ M& D% M# h: h & b7 ~7 R6 R! h" E) J# ^
f =
3 }" S9 C7 M  x- p! a6 fa*x^2+b*x+c  - s  h# j' C0 [# N* N( Y
findsym(f)         %得出所有的符号变量 3 e/ ~; Z6 N# ]' A/ z
& k5 G2 ^9 @0 m: T" x9 T
ans =+ n2 k! _+ W# ^+ U6 Q
a, b, c, x  ; L6 B, p1 R' H) N! S
g=sym('sin(z)+cos(v)') [/hide]
9 E  Q6 R9 n1 t0 v6 h; ^
6 N( J8 o4 c. w) E" F( R
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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