|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 cat12620 于 2018-11-7 16:33 编辑 0 K2 v7 K" P0 @6 s" B( ^0 _
4 v9 N' Y6 Y' ]符号计算则是可以对未赋值的符号对象(可以是常数、变量、表达式)进行运算和处理。MATLAB具有符号数学工具箱(Symbolic Math Toolbox),将符号运算结合到MATLAB的数值运算环境。符号数学工具箱是建立在Maple软件基础上的。* r/ ?. o1 H7 y4 Z
3.1 符号表达式的建立
* L- F9 t8 T" HSymbolic Math Toolbox2.1版规定在进行符号计算时,首先要定义基本的符号对象然后才能进行符号运算。
9 T: c0 F& {1 I7 f5 D% O" n! N$ X3.1.1创建符号常量
0 E3 [% ?; M1 K1 H符号常量是不含变量的符号表达式,用sym命令来创建符号常量。
9 J# ^1 i4 S, F2 K6 f语法:9 \( m% k! c C$ n
sym(‘常量’) %创建符号常量
$ ^! i+ j$ O2 _, l例如,创建符号常量,这种方式是绝对准确的符号数值表示:
- Q+ e+ n6 Z6 j; J! v* v>> a=sym('sin(2)'); s+ n$ T9 z0 E- Y# I7 x
a =
2 u* C9 P0 E( Y6 k9 R/ Gsin(2): p; I2 \$ \% i" J1 ^& ]
sym命令也可以把数值转换成某种格式的符号常量。
$ Q) y% f. k& L7 i9 `语法:
! Z6 R, J9 q" M! A% z6 ~ sym(常量,参数) %把常量按某种格式转换为符号常量" I9 Z! z; f) {# }2 q+ a) M
说明:参数可以选择为’d’、’f’、’e’或’r’ 四种格式,也可省略,其作用如表3.1所示。
* p7 b# I+ P8 c7 c! o表3.1 参数设置 参数: Y6 ^ i1 ^3 \# x4 c& g
| 作用
# B: F. g& v; B- m | d
$ t; ]& G: l+ j* K | 返回最接近的十进制数值(默认位数为32位)
9 j2 N3 E% d5 O; F" p# J3 ^ | f
/ ^! e8 a, k: i3 `3 o2 z | 返回该符号值最接近的浮点表示4 d4 @+ ]3 r4 O2 t5 S: p" W7 O
| r# P, L" \$ u/ z4 F: c3 l4 }
| 返回该符号值最接近的有理数型(为系统默认方式),可表示为p/q、p*q、10^q、pi/q、2^q和sqrt(p)形式之一: E2 M0 p( }. _+ h- v
| e
) V( s6 |" b3 q# }0 H; ` | 返回最接近的带有机器浮点误差的有理值1 q& i" S4 x0 B8 W/ d
|
例如,创建符号常量,这种方式是绝对准确的符号数值表示:
8 O# Q9 q( Q! P! w3 O a=sym('sin(2)')
) d9 M4 y0 q$ t 3 K( R! `4 G. }5 e
a =& W; [9 k8 ], ^: N- C) ~" w* I: p
sin(2) * h$ T# N' h+ j5 l, Z N
9 O( \7 w/ N% \/ q% ?
eig(A) %计算特征值
+ u2 t/ {4 }0 p) A+ |7 C6 o' I+ U
6 `2 r, N% b3 q3 Tans =9 M3 l* b" n6 k* T
[ 1/2*a11+1/2*a22+1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]
0 {, Y2 O6 X0 Z5 S[ 1/2*a11+1/2*a22-1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)] : e- m9 u ?( P/ p+ }
7 D' B) p+ }) K- ~+ i【例3.5】符号表达式f=2x2+3x+4与g=5x+6的代数运算。
7 [' h! X3 u$ `# g9 S f=sym('2*x^2+3*x+4')
9 T% v/ @; ? @" v1 Z- H: I% r . ?& u0 w/ q3 j
f =
) T& z3 N' ?. U5 W) E% F2*x^2+3*x+4
+ e9 `; f' j0 K# ^' n/ l( |; G3 \ g=sym('5*x+6') 8 A1 {$ G( x+ d6 Y) m* G
) c/ n7 U: _5 x7 L1 g
g = }4 D7 Q. H( W
5*x+6 4 d M% g% H% W7 E( \
f+g %符号表达式相加
/ Q \0 A- K b ; J9 ^# q/ ?1 W
ans =/ A: L, e% N2 n) e4 i
2*x^2+8*x+10
$ z# S( [, Z g* @/ l N: c. r f*g %符号表达式相乘
9 ]& q8 _; O4 d' W3 \ 2 p$ y0 \% J; _5 E1 w
ans =
* [8 k4 H+ i7 _- k/ {, o(2*x^2+3*x+4)*(5*x+6) & X0 p# E6 z$ ~. O$ L
3.2.2符号数值任意精度控制和运算" h9 B% b4 r6 Y0 g# P R9 r
1. Symbolic Math Toolbox中的算术运算方式! j3 d9 m, o+ e7 E1 [4 c. A% K
在Symbolic Math Toolbox中有三种不同的算术运算:
6 m: C5 d1 G9 Q8 u0 ^§ 数值型:MATLAB的浮点运算。9 ~7 t9 T+ N$ K* C2 Q1 W& h
§ 有理数型:Maple的精确符号运算。* V$ }& N1 [. F& ?) `( S j1 d1 }
§ VPA型:Maple的任意精度运算。2 Q/ I8 Q. D: Z8 c' q/ _
[# I) O- }4 N
2. 任意精度控制 a$ ?3 e5 a6 C# S
任意精度的VPA型运算可以使用digits和vpa命令来实现。8 w3 q! J# x# t
语法:" S( V7 Y' Z4 n4 e, {& @
digits(n) %设定默认的精度5 t- f0 r: X: L- q; E
说明:n为所期望的有效位数。digits函数可以改变默认的有效位数来改变精度,随后的每个进行Maple函数的计算都以新精度为准。当有效位数增加时,计算时间和占用的内存也增加。命令“digits”用来显示默认的有效位数,默认为32位。5 b& J7 I" w9 s
语法:
- M$ R+ d' C7 s4 } S=vpa(s,n) %将s表示为n位有效位数的符号对象
2 S3 w) d5 l; T# f1 b2 j5 K3 P说明:s可以是数值对象或符号对象,但计算的结果S一定是符号对象;当参数n省略时则以给定的digits指定精度。vpa命令只对指定的符号对象s按新精度进行计算,并以同样的精度显示计算结果,但并不改变全局的digits参数。
3 D$ C, p1 [: s3 i* i7 @. _【例3.6】对表达式file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image006.gif进行任意精度控制的比较。6 U' ~8 E- j8 |2 t; r0 }+ X& E% f+ T
a=sym('2*sqrt(5)+pi')
/ q2 [8 a( f% C1 o) _: ^
7 I9 w, d, j6 N+ D2 K% D3 `a =# P) t, w! H3 }% f; Q
2*sqrt(5)+pi
. s9 J7 r$ d& d; b A# V9 U! @ digits %显示默认的有效位数 7 {, Q% ^+ B5 I5 j; m! t, G- B( y
+ {, A7 a0 [5 k. z& P( @6 s
F: |, q: j; G5 l
Digits = 32
8 H4 B: |# e5 H' [+ F5 U, a
+ q! Q3 G! T/ f1 i# x/ t+ H vpa(a) %用默认的位数计算并显示 # S- g& ^( ?# k1 `
* C. N' `- z' B5 |/ zans =
1 B! L% Z( [, E0 u7.6137286085893726312809907207421
0 S. K% H/ j+ @/ Q y. {; r" J4 p vpa(a,20) %按指定的精度计算并显示
3 h. M) r5 c' ?0 x4 M" D
- T9 y" b9 n1 @1 V5 T8 D: vans =
( D6 O( u$ l7 X) \& p# A2 |7.6137286085893726313
9 B" b2 {9 q/ t& T9 c# h/ W digits(15) %改变默认的有效位数
; W. |6 Z9 o2 _& N0 l4 ? vpa(a) %按digits指定的精度计算并显示
7 L" R- n' t8 `1 L( M% W 7 B7 y6 C. }# T: Q3 r/ F
ans =$ k9 \: ?4 o2 k* `4 `4 `
7.61372860858937
5 v7 H9 s. f1 K( m' G O2 t ) z: h% i$ p* z5 v8 j' N4 n0 t
3. Symbolic Math Toolbox中的三种运算方式的比较
% M8 [+ C% l/ O【例3.6续】用三种运算方式表达式比较2/3的结果。1 w$ n5 C* u! m' C+ W
a1 =2/3 %数值型
3 R& C: ] m. |+ t/ `7 r- g
7 M R. G$ L1 |2 _$ q& o( c. ?a1 =1 y& J' }( r$ Y! n# s
0.6667
" u1 i4 Y: d3 o5 \a2 = sym(2/3) %有理数型
4 e7 w3 z) a o & i( Z# [' X7 `4 Y1 j
a2 =- ~/ n j( n) y" n6 C+ Y: }
2/3 ' _' w6 {5 n5 \6 w/ z' A0 A# b
a3 =vpa('2/3',32) %VPA型 & J) T: m. P$ H+ u( B
3 |# W5 d, V2 j" ~1 V5 o. P& F
a3 =: b4 F+ x4 [& ?" A
.66666666666666666666666666666667 * j/ a3 G& A$ }0 h/ {
程序分析:! Z' W- c* d7 f1 T) B- [
§ 三种运算方式中数值型运算的速度最快。8 M4 b, a+ r: \7 m+ Z$ H
§ 有理数型符号运算的计算时间和占用内存是最大的,产生的结果是非常准确的。+ h* n2 ^. C4 s( j/ m( }
§ VPA型的任意精度符号运算比较灵活,可以设置任意有效精度,当保留的有效位数增加时,每次运算的时间和使用的内存也会增加。" L3 j$ O" h# A! m; k, o
§ 数值型变量a1结果显示的有效位数并不是存储的有效位数,在第一章中介绍显示的有效位数由“format”命令控制。如下面修改“format”命令就改变了显示的有效位数:) g( M* N6 K4 U; s$ T3 }
format long
( L' v: U- g) E' b. O, Y6 _+ e a1
) C6 O4 i* S( S& Z2 L& @
) R+ }3 B6 o3 X( C" Ua1 =
& G- A$ B% p3 R6 @: y 0.66666666666667 |. z& ?: V- K8 U# A1 e! H
3.2.3符号对象与数值对象的转换
% c* B% Y8 S% y8 d- z2 N1. 将数值对象转换为符号对象
. U2 W: _/ z! z+ R6 Zsym命令可以把数值型对象转换成有理数型符号对象,vpa命令可以将数值型对象转换为任意精度的VPA型符号对象。9 R! z' w% w: ? Q- H
3 E: L4 B& z! e8 ?0 P! X# ~, R2 X
2. 将符号对象转换为数值对象' M; X5 l& g9 w0 y0 u
使用double、 numeric函数可以将有理数型和VPA型符号对象转换成数值对象。/ _+ ^9 g. x6 P/ O& \
语法:3 V6 q% V+ I8 n L( J
N=double(S) %将符号变量S转换为数值变量N+ z& c% l+ q& ~" o' V3 @ K
N=numeric(S) %将符号变量S转换为数值变量N
0 i8 [) G/ D+ O( C3 G7 ~【例3.7】将符号变量file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image008.gif与数值变量进行转换。) l+ G! O6 ^% i
clear
3 ?3 i$ @, E" ka1=sym('2*sqrt(5)+pi') , `2 d M G) i9 o* s
' }4 y! z( l0 h8 W3 C4 n+ @a1 =/ u- s& e# A6 i: v. ?/ S
2*sqrt(5)+pi
* o! P9 P( t* c6 j# Z
' `: H9 q! Y) ~. q! W, i) _ b1=double(a1) %转换为数值变量 + `. X8 r$ \/ ]0 Y
+ T/ N! n/ Q! X+ S9 {b1 =- }9 Q: d0 l5 O3 ?, ?) F$ Y
7.6137
6 v! B- e+ H* U% D, f& M
* w' V" \ P, t! ?" I a2=vpa(sym('2*sqrt(5)+pi'),32) ' S8 a7 F. l3 X% Q9 _
, j! C/ i0 B4 V4 w0 Y7 t' |
a2 =, m$ G' v+ G1 d/ x- h0 `
7.6137286085893726312809907207421 . Y% d6 E: w$ r$ g$ _* ~' A1 E
) f! U( v. w J. |& J5 q3 T+ z4 m
b2=numeric(a2) %转换为数值变量
5 i5 _$ ]' S7 }' O+ h3 I% B% J + p! N7 d, d. `; p4 P) e' Q
b2 =
" A# [& ~& g. o' j2 R( m. H" v5 j 7.6137 ; o! Q8 u% ~3 B/ Q" B+ k
【例3.7续】由符号变量得出数值结果。
# s' \! d1 h8 }% ` b3=eval(a1) 5 h& p2 Q0 l3 ~) U6 q. w
0 ?) G R' Q F9 `( w) l! j. ~
b3 =" S7 s3 s7 Q( F2 V5 K7 W6 w
7.6137 - k. V N0 Q4 e1 a: s3 L
用“whos”命令查看变量的类型,可以看到b1、b2、b3都转换为双精度型:! D+ x! O! C* Z/ A% t: u' U) q
whos
2 E) g3 g: q7 q- }
- [6 g. ]& P. Q4 ^0 b- _% D Size Bytes Class% T- t! q0 c2 l5 O+ T4 s
0 u" X/ f# @# E* z# _ 1x1 148 sym object
0 j% d: d% a7 r 1x1 190 sym object
3 C4 c O; B3 F 1x1 8 double array9 N. @; m4 B T7 J8 b6 [: z
1x1 8 double array
2 X+ r% B1 h0 ?* D3 `# U0 x5 W 1x1 8 double array
+ r( V ~6 T( o% M0 e5 w' w0 d
7 w1 Y4 p4 t d3 L. a9 s- f$ AGrand total is 50 elements using 362 bytes
& r% @9 y. X; t( {: ]3.3符号表达式的操作和转换( z5 |0 c5 `& h! O4 J- k) ^
3.3.1符号表达式中自由变量的确定
% P" ]: Q( u" U. N: Y1. 自由变量的确定原则, l! h+ C; u; b; U
,MATLAB将基于以下原则选择一个自由变量:
' s9 ^% p! W. i/ l§ 小写字母i和j不能作为自由变量。
* G, f& |! U% X2 y" X§ 符号表达式中如果有多个字符变量,则按照以下顺序选择自由变量:首先选择x作为自由变量;如果没有x,则选择在字母顺序中最接近x的字符变量;如果与x相同距离,则在x后面的优先。
. e7 O: v' l9 p# \4 g0 V§ 大写字母比所有的小写字母都靠后。. q; l' D ?1 ]: M9 G
7 e/ K: m U, H: b9 w2. findsym函数
! j3 ?. o% b4 R3 N' c8 J如果不确定符号表达式中的自由符号变量,可以用findsym函数来自动确定。
; P2 Q/ E; V [0 L语法:
9 g( h% U9 B% h. P0 Q findsym(EXPR,n) %确定自由符号变量
9 `. v$ ]' g9 z- ]& m说明:EXPR可以是符号表达式或符号矩阵;n为按顺序得出符号变量的个数,当n省略时,则不按顺序得出EXPR中所有的符号变量。
2 k/ e, k8 O5 R0 J7 ?【例3.8】得出符号表达式中的符号变量。
) Y2 A+ a& X! i0 J: U f=sym('a*x^2+b*x+c')
* ^, l0 U7 x: b5 w6 H6 N8 h/ Q
5 |% D: b+ t$ n/ [, u( ?f =
, E5 u% ~% V D. n4 w s. Ia*x^2+b*x+c
' @' }9 j* R0 o0 w findsym(f) %得出所有的符号变量
) G, ^% p% P; i, o, d' o / W, j5 ^) h8 p( y; I
ans =
1 W5 ] {/ `8 n; V" ~9 V3 sa, b, c, x
# L: A3 D: L* }; _ g=sym('sin(z)+cos(v)') [/hide]$ q1 b) ?3 g: i+ i# I$ }8 ~+ _
H1 U$ B9 g4 T' Z
|
|