|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 cat12620 于 2018-11-7 16:33 编辑
3 J" s1 Q2 m) M! U# B% h5 S7 h q- z+ Z) ^1 Y/ k2 z
符号计算则是可以对未赋值的符号对象(可以是常数、变量、表达式)进行运算和处理。MATLAB具有符号数学工具箱(Symbolic Math Toolbox),将符号运算结合到MATLAB的数值运算环境。符号数学工具箱是建立在Maple软件基础上的。
, t! _- [0 d) I+ ]/ |. b$ J3.1 符号表达式的建立
! R) b1 R) V5 F& t3 jSymbolic Math Toolbox2.1版规定在进行符号计算时,首先要定义基本的符号对象然后才能进行符号运算。
6 P- i4 C' C7 o! c5 o3.1.1创建符号常量
$ L: C& i$ |) n- u3 I: {符号常量是不含变量的符号表达式,用sym命令来创建符号常量。
- w( ~" g, |* E" |$ t7 A# X语法:
& O' U4 A' o* t. I, D% M- E6 v sym(‘常量’) %创建符号常量$ o, y7 y# G7 ^
例如,创建符号常量,这种方式是绝对准确的符号数值表示:
* o( M2 F/ [9 d) @4 k>> a=sym('sin(2)') K3 Q+ g, P3 M2 a
a =
9 `1 T0 X- c# q3 ?& Q% Z, e' tsin(2), e8 i/ ]! U! c. c6 e9 W( y% a
sym命令也可以把数值转换成某种格式的符号常量。
' q+ P5 X& k) {; A9 m! ?语法: g2 v4 p1 F' b. X0 b& ]/ ?3 L
sym(常量,参数) %把常量按某种格式转换为符号常量
" a4 y; g0 Z- {/ H说明:参数可以选择为’d’、’f’、’e’或’r’ 四种格式,也可省略,其作用如表3.1所示。4 l# b7 A: m3 M; o2 S
表3.1 参数设置 参数
4 F v8 G( @& b( Z4 E | 作用 K2 B2 `! d4 p
| d% N& {( w: E) @
| 返回最接近的十进制数值(默认位数为32位)
7 u2 p( t& `- z3 H8 e | f" W4 E6 b; U" t9 u- @* X, ^" o
| 返回该符号值最接近的浮点表示
* t6 o+ ~9 A6 t4 ?/ e; p | r2 `! N! t( I& r9 m% o% S4 B) a5 E
| 返回该符号值最接近的有理数型(为系统默认方式),可表示为p/q、p*q、10^q、pi/q、2^q和sqrt(p)形式之一: L9 ^8 r8 Y; d: P
| e
) J- ?/ m( v! B7 ` | 返回最接近的带有机器浮点误差的有理值- _: J y4 b% z2 N- L& M
|
例如,创建符号常量,这种方式是绝对准确的符号数值表示:& ?# U. d& S; B
a=sym('sin(2)')
i% Q8 b2 |1 L2 O3 u. b4 E9 x
+ ^% Z3 q" l/ @, f$ E) a; Oa =$ z1 G$ I+ w _; ]8 l$ m
sin(2) k, H! ]4 ?; B% _& J( L
' D# T& T0 F/ F8 J# ]& F
eig(A) %计算特征值 1 y4 m2 M8 K1 {8 R3 A" f
3 M4 v7 j7 @/ | Jans =
# |+ p# { l( a& @6 c3 \7 [9 \[ 1/2*a11+1/2*a22+1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]: B8 ?9 u7 Z) M' w, ?
[ 1/2*a11+1/2*a22-1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]
$ }/ ~/ \+ A) E% p
( v! K# Q5 u( r1 @; j【例3.5】符号表达式f=2x2+3x+4与g=5x+6的代数运算。
7 ]% x: n$ B+ X# n6 N! n, k6 r' o f=sym('2*x^2+3*x+4')
& I8 F; N! \. M2 ^6 w0 y, t + S2 @4 K- W- x# Q
f =
, B# Z' B8 A. M% z! i# D2*x^2+3*x+4 , R7 ?4 o0 M s4 c: {+ h
g=sym('5*x+6') . x x4 p3 f$ |1 I6 M
; {: D3 } F, @8 n6 y @g =9 Y) q G; z$ G x7 ]0 \2 m
5*x+6 0 J# G1 ]8 k3 m" N1 a4 H
f+g %符号表达式相加 9 X1 e. b, a" q0 ~
- X$ t- T" d* uans =3 G! I2 Y; t- j
2*x^2+8*x+10
. w7 F3 Y* s9 P f*g %符号表达式相乘 M: t: V( F+ X# L
3 S+ y R" Z" L* s/ K, z
ans =
# ]% v% m3 y$ p8 n7 s(2*x^2+3*x+4)*(5*x+6)
9 b/ P0 R9 s3 n' M3.2.2符号数值任意精度控制和运算
* t1 X) v* @- I) O1. Symbolic Math Toolbox中的算术运算方式
1 U7 e, N" A) g, l在Symbolic Math Toolbox中有三种不同的算术运算:5 C/ ]/ K }7 _
§ 数值型:MATLAB的浮点运算。* C0 O: B- f" q! S0 l. m
§ 有理数型:Maple的精确符号运算。
7 G G" K. }% E: G3 k* O§ VPA型:Maple的任意精度运算。
8 K& J$ j/ i f2 L" f
5 \" `* m/ P3 o) U! B% h/ N- |# E2. 任意精度控制3 c! w1 c+ Z: K
任意精度的VPA型运算可以使用digits和vpa命令来实现。; r! R! @4 R1 T O
语法:2 l$ {2 D" D# Z. ?# i
digits(n) %设定默认的精度
* T& X1 @# |9 F" B- n$ a说明:n为所期望的有效位数。digits函数可以改变默认的有效位数来改变精度,随后的每个进行Maple函数的计算都以新精度为准。当有效位数增加时,计算时间和占用的内存也增加。命令“digits”用来显示默认的有效位数,默认为32位。" p. `& }; d: d8 b5 o/ j0 x
语法:; V2 M- O8 l" u! g6 J; \5 L
S=vpa(s,n) %将s表示为n位有效位数的符号对象
: v- w5 n3 l5 \" y8 ^& a3 G) ^说明:s可以是数值对象或符号对象,但计算的结果S一定是符号对象;当参数n省略时则以给定的digits指定精度。vpa命令只对指定的符号对象s按新精度进行计算,并以同样的精度显示计算结果,但并不改变全局的digits参数。) x0 Q8 b+ t' S9 [- w9 O( K. F0 o
【例3.6】对表达式file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image006.gif进行任意精度控制的比较。
$ C% \+ N3 T9 j$ d0 } a=sym('2*sqrt(5)+pi') + X) k+ w A* b: f9 G, l0 p/ G0 b
/ s& h9 C1 X8 ]+ Y6 ^3 G; L/ i
a =
# }7 T, W0 i G4 v1 x0 f( I2*sqrt(5)+pi ( \) Y# w! d, N+ M& O
digits %显示默认的有效位数
: p7 ?- n! N6 T! z3 d) S' i ! B- J! s8 t1 Q; ^: l
6 l( W9 F/ c. @) f+ X% Q- eDigits = 32 N4 S% u( A/ q7 d% c6 t
0 M3 \9 f. P6 m5 _* `* \$ u1 |) A vpa(a) %用默认的位数计算并显示
+ I: C2 S8 H( U0 R. Q+ j, k' h! Q2 W ' p4 e K# D0 h# J" M" a' F, _
ans =
4 O& r; ]) L Z7.6137286085893726312809907207421
, k. Z/ _+ M/ \# s g) x vpa(a,20) %按指定的精度计算并显示 % k+ b& g; f- G4 N3 o6 K/ F' ^% v6 m
' @+ [ Z6 x: y0 x2 o3 s' Z' @
ans =
7 ]$ u0 j/ a- S0 u) o3 w7.6137286085893726313 1 }0 F. v& |) a( O: ?# X W
digits(15) %改变默认的有效位数1 z4 e& z+ E- U3 T9 R) Y/ f
vpa(a) %按digits指定的精度计算并显示 + A' w" b% `4 V/ d s6 g2 S; R7 l
8 f' y: U6 k7 m( K% F' y
ans =3 k9 [' t# q' h: ]( B
7.61372860858937 ( C2 V' r& U# C7 h; ]' i2 z$ h
7 ~. q: s6 o7 P+ H! m8 w3. Symbolic Math Toolbox中的三种运算方式的比较5 K4 V% D/ c" u/ f& n/ D
【例3.6续】用三种运算方式表达式比较2/3的结果。
1 G6 @4 o3 v3 M+ x" fa1 =2/3 %数值型
$ j6 J, p4 y, \6 @5 f( g4 A 0 b v. E7 G# b. E# D& l; F5 S
a1 =3 L1 A8 y3 X% G1 O, E
0.6667 : I5 r5 M+ V5 j) S( G( W
a2 = sym(2/3) %有理数型
0 }5 k6 U* p1 v0 A% ]& K 5 x! A- t. ^3 o8 Q( b; o
a2 =
% t9 r9 R! P0 d9 E2/3 / T" _6 U% y: g5 ^8 p$ Z
a3 =vpa('2/3',32) %VPA型 4 I/ b9 N8 w( Y- D+ r
' N' G D2 ~( T S, r$ e
a3 =
" g5 o4 v: y5 d/ g9 Y.66666666666666666666666666666667 ~; l4 T4 m- I
程序分析:4 T, \7 b+ M+ T1 p4 J0 [* x( d3 |2 i
§ 三种运算方式中数值型运算的速度最快。7 |9 n# r; A% ? \
§ 有理数型符号运算的计算时间和占用内存是最大的,产生的结果是非常准确的。: s2 \2 Z+ y0 Q% r2 u$ g0 J
§ VPA型的任意精度符号运算比较灵活,可以设置任意有效精度,当保留的有效位数增加时,每次运算的时间和使用的内存也会增加。
& `7 T1 |9 c3 U# p§ 数值型变量a1结果显示的有效位数并不是存储的有效位数,在第一章中介绍显示的有效位数由“format”命令控制。如下面修改“format”命令就改变了显示的有效位数:
. @! a. m) [: T) U& X5 l6 K) T format long: D7 x3 i, o. L5 I+ u4 L
a1 & v0 o, W% _* }' K* Z8 m- E, n
, X5 U, g- \: x+ y
a1 =% H; x. v8 [7 l! `* a
0.66666666666667
: u& Z" c1 Y* ]# ~2 @. Y5 _. U3.2.3符号对象与数值对象的转换+ U" }; D' L4 b6 p8 W$ P! N" i4 [
1. 将数值对象转换为符号对象" n# A4 f; W; q% r8 V! l
sym命令可以把数值型对象转换成有理数型符号对象,vpa命令可以将数值型对象转换为任意精度的VPA型符号对象。+ ?8 a F1 G; r H3 h' D$ E0 E$ z4 H
+ x9 \( @3 P$ [6 c2. 将符号对象转换为数值对象( S: }# N$ J3 }( m& F7 R! \" W
使用double、 numeric函数可以将有理数型和VPA型符号对象转换成数值对象。4 n$ O5 O' Y. B0 o" m
语法:
. t* z' h6 \/ r* V8 J1 K& F N=double(S) %将符号变量S转换为数值变量N- d8 `, F$ z% \7 i; c, m6 P# n D
N=numeric(S) %将符号变量S转换为数值变量N6 C/ A8 x# ~+ U. n- i6 {# E( k6 l1 C
【例3.7】将符号变量file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image008.gif与数值变量进行转换。
2 Q; X- \" \7 ~$ l; T clear2 Q/ @4 `6 B- a
a1=sym('2*sqrt(5)+pi')
1 @, b& Q3 O4 p4 @
, ]" P7 }& ~: t; p, ja1 =' g0 f1 D, O% o, ^
2*sqrt(5)+pi
6 Y. b8 [; I- }: O # {% j3 u6 ] h; X
b1=double(a1) %转换为数值变量
3 r+ a3 F5 O9 a6 ^4 d& y: a * D$ L7 G; |# b: ^6 K9 I
b1 =
& h9 n/ d+ J) g3 U8 }1 u9 f 7.6137 1 `' j' @' E; E+ g8 l. G
8 n' X! Q. E, e( V
a2=vpa(sym('2*sqrt(5)+pi'),32)
1 _8 D. T% u J: p; h, |, @, F
' v6 d$ {1 m4 U/ ka2 =
' X+ S g q% B/ @0 {3 D7.6137286085893726312809907207421
2 T: c& @2 C" ]2 S0 M' { 6 q5 ]1 l7 q z+ ]9 J2 o
b2=numeric(a2) %转换为数值变量
( K6 m a( u6 i7 m2 i 7 l; ?8 E8 y7 Y4 U7 \
b2 =8 Q7 j3 |) i$ ]+ ~' O/ ]; |
7.6137 1 `% G- ]+ d) [: M$ C: u
【例3.7续】由符号变量得出数值结果。
/ H& |# I' O. f: R b3=eval(a1)
$ {# ~$ J, ?" b4 N+ o & ^5 v; {1 e, G- {* _9 g$ L3 \
b3 =
6 [8 y! E4 Z# ? [" E7 c7 {7 J 7.6137 : i0 I/ K8 c, E3 A5 ~( k& B
用“whos”命令查看变量的类型,可以看到b1、b2、b3都转换为双精度型:
: _ \" J$ x+ z( x3 [* a whos
m/ a0 q4 p) Z
0 i9 w M Z/ Z& w$ c5 W- P1 F Size Bytes Class
?7 a( `7 N; I, ]3 v # g" y4 X, z1 A# _
1x1 148 sym object
) d: ?9 b, w/ @4 T, b' l 1x1 190 sym object
& E* t$ D" Z; A! l( j+ Q( H: z1 `8 Q 1x1 8 double array
, H5 q' b* f0 k- M( e1 `- B' ]- b 1x1 8 double array! b; K8 N; A; A" X" y- m9 \% ^
1x1 8 double array
I+ b+ W/ P8 s; c ! q& S6 s% l' |/ h# u' _
Grand total is 50 elements using 362 bytes
) t# F* R, p, Z2 ]4 c3.3符号表达式的操作和转换
8 h4 m/ l8 z% t- \) r3.3.1符号表达式中自由变量的确定
! a" n1 b# I- ? Y1. 自由变量的确定原则
9 O- F3 c* F0 I+ j8 i- h/ K,MATLAB将基于以下原则选择一个自由变量:
1 \: m/ i9 q# g/ D. [§ 小写字母i和j不能作为自由变量。# N9 y7 r' s/ c" X& U/ U
§ 符号表达式中如果有多个字符变量,则按照以下顺序选择自由变量:首先选择x作为自由变量;如果没有x,则选择在字母顺序中最接近x的字符变量;如果与x相同距离,则在x后面的优先。
* e/ P' ]8 I, _( `§ 大写字母比所有的小写字母都靠后。
% y4 m; L: n; j& I% ~
`- N j! b$ X9 q! Q% g2. findsym函数4 I) |* ^$ n* X8 p- Y) n6 W
如果不确定符号表达式中的自由符号变量,可以用findsym函数来自动确定。* q- Q2 O2 k) q2 A
语法:
, @3 ^! g+ }9 Z2 z0 D findsym(EXPR,n) %确定自由符号变量
, `/ N8 B+ j& h6 ^7 |说明:EXPR可以是符号表达式或符号矩阵;n为按顺序得出符号变量的个数,当n省略时,则不按顺序得出EXPR中所有的符号变量。
# ~4 I+ d% {# ?4 D- J【例3.8】得出符号表达式中的符号变量。
; a# L/ ?7 K# G1 Q5 f f=sym('a*x^2+b*x+c') 9 v/ z+ Z8 q; ~4 Z6 X
/ j$ a8 g' b- _& J5 o' f1 ^: ef =; S# c1 v: G: Q1 g. S$ ?* V& v
a*x^2+b*x+c
6 `1 T$ d; M$ R$ t% l4 r# [7 w findsym(f) %得出所有的符号变量 3 V- y" e5 F, F# ]' z
. o5 X( N, R( f* O! U: F
ans =* `; e! T! i) \* C) J
a, b, c, x
% G" Y+ U" B4 m/ a g=sym('sin(z)+cos(v)') [/hide]
; l2 p) K" ?6 A6 o' X- M, f; B
% z3 ?% K+ S) c2 Z |
|