|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 cat12620 于 2018-11-7 16:33 编辑
% |( G+ B7 m' p% n7 z7 C+ u! D0 `
符号计算则是可以对未赋值的符号对象(可以是常数、变量、表达式)进行运算和处理。MATLAB具有符号数学工具箱(Symbolic Math Toolbox),将符号运算结合到MATLAB的数值运算环境。符号数学工具箱是建立在Maple软件基础上的。5 D- @3 S1 l2 P
3.1 符号表达式的建立* F& T* `5 U5 w0 f
Symbolic Math Toolbox2.1版规定在进行符号计算时,首先要定义基本的符号对象然后才能进行符号运算。
8 r! v# R/ U. K' c5 _5 U3.1.1创建符号常量5 U/ P* N7 g8 j5 E& `2 w% q
符号常量是不含变量的符号表达式,用sym命令来创建符号常量。3 h% X' k* ?8 w: R& r
语法:. L6 `" v; A, ~2 Y) z
sym(‘常量’) %创建符号常量: r, q$ Z7 i, S1 z
例如,创建符号常量,这种方式是绝对准确的符号数值表示:; J' i" I5 w' _) v4 S5 t- r
>> a=sym('sin(2)')
) d3 ^- z, L: Qa =( J+ i+ D8 |$ ^! K2 Y
sin(2)
0 q$ O( q3 M7 K3 m: _0 y6 Zsym命令也可以把数值转换成某种格式的符号常量。
7 C' N/ B) ?2 O. T, u/ r0 x语法:
% m' l4 }7 W0 z% s( @ sym(常量,参数) %把常量按某种格式转换为符号常量
! j% t2 E) `0 |/ W( J( w7 b说明:参数可以选择为’d’、’f’、’e’或’r’ 四种格式,也可省略,其作用如表3.1所示。
: _1 N4 G+ x" G5 G6 v" ~表3.1 参数设置 参数3 A3 S6 J( c- l. Z5 d0 ^+ L7 u
| 作用) I$ B& m9 v4 Y) X$ ]
| d6 b. l& E% d5 ^7 G. Q. X) S
| 返回最接近的十进制数值(默认位数为32位). F* i5 \) z7 y7 T6 P
| f
) W8 j: E# f0 y6 ] | 返回该符号值最接近的浮点表示
. Z3 w8 J- Y1 a Y | r
1 c/ D) J& j8 g | 返回该符号值最接近的有理数型(为系统默认方式),可表示为p/q、p*q、10^q、pi/q、2^q和sqrt(p)形式之一
0 b6 \) Q- @6 D) ] | e
, G; N; a2 Y2 W1 t# t | 返回最接近的带有机器浮点误差的有理值* s8 k; T& g) A% ?3 z8 ?0 v
|
例如,创建符号常量,这种方式是绝对准确的符号数值表示:
% A5 ^; y$ [! c3 n/ h+ O9 ] a=sym('sin(2)') ' b( z8 {1 `' _& e
9 i; C4 P) V. p
a =3 u8 A* i' c% E8 M5 X2 r
sin(2) 6 g6 F2 ^, Z" m+ d5 ^& Y
1 j! B8 L; F- O+ X
eig(A) %计算特征值 ) G' P1 H S* Q& v
; |1 a& P9 r0 N+ S9 K3 \7 ~/ @
ans =
& T" W0 k j! b7 {[ 1/2*a11+1/2*a22+1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]
, h9 ]1 w* L5 U% c; P4 ^4 X[ 1/2*a11+1/2*a22-1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)] 5 l/ B! j% G2 S$ `$ I
( e* m' @1 A0 @ F3 _【例3.5】符号表达式f=2x2+3x+4与g=5x+6的代数运算。
" ?8 C% ^ E$ t f=sym('2*x^2+3*x+4') ( u" Y# Z8 G* D' M" \5 G
% ~7 y4 U9 T' i' s( e2 P8 bf =
5 H) @' O9 }' w- h5 B0 T* Y2*x^2+3*x+4 # G& c6 g3 W% g/ s6 I# r& m) G
g=sym('5*x+6') 9 N" b3 z* q5 C+ R p: ]
0 r" K# B, T" x4 k2 ?: l. yg =. w( r0 |& C# D: E# W1 P4 x
5*x+6
! r9 g3 b% I# N% ?3 [6 l" _ f+g %符号表达式相加 . L4 L# C2 J+ M' L
4 }3 {8 ]2 a1 Q- ?0 I8 p" ~ans =
" _9 |- Y) r! A) { B) @% \7 k3 S Q A2*x^2+8*x+10 % ^- j5 ] E4 k
f*g %符号表达式相乘 % g& P& d+ n9 C7 [5 f! d6 x
1 Z' A# a* D9 n6 q0 o1 ians =: n/ @8 ?$ U5 }$ f/ D
(2*x^2+3*x+4)*(5*x+6) 9 {5 e7 T/ D+ x! c, t- Q. [2 u
3.2.2符号数值任意精度控制和运算/ Q+ i1 J+ Q4 X7 W: H% p. A9 L
1. Symbolic Math Toolbox中的算术运算方式
0 }" K: T) _/ X; N' f在Symbolic Math Toolbox中有三种不同的算术运算:
1 B4 O5 F! n* a3 `% t( `§ 数值型:MATLAB的浮点运算。
* }2 N6 H# I$ Y5 ^9 Q§ 有理数型:Maple的精确符号运算。3 ^; \4 E4 A" S, w4 {- [. R
§ VPA型:Maple的任意精度运算。
; }. ?: |. f- F/ E5 ?6 U3 N# {
: z* v7 A5 Z) \& Z$ W, c5 H2. 任意精度控制
/ Z! f4 r" B# j6 r( S% S" C5 }1 y b任意精度的VPA型运算可以使用digits和vpa命令来实现。+ d( X% g: d, P% m- o3 a f
语法:% n/ z/ L9 {$ ^$ R
digits(n) %设定默认的精度
: v0 L+ K) l0 U6 x# p$ [7 H说明:n为所期望的有效位数。digits函数可以改变默认的有效位数来改变精度,随后的每个进行Maple函数的计算都以新精度为准。当有效位数增加时,计算时间和占用的内存也增加。命令“digits”用来显示默认的有效位数,默认为32位。
3 D- L0 Q+ B, s: I( Z9 D语法:
! R, B4 O3 @7 v* l; z S=vpa(s,n) %将s表示为n位有效位数的符号对象
) P% E5 P7 x( {* r说明:s可以是数值对象或符号对象,但计算的结果S一定是符号对象;当参数n省略时则以给定的digits指定精度。vpa命令只对指定的符号对象s按新精度进行计算,并以同样的精度显示计算结果,但并不改变全局的digits参数。4 a; \1 ~/ d ~" w; A
【例3.6】对表达式file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image006.gif进行任意精度控制的比较。) y. v7 ^ l2 \. M G
a=sym('2*sqrt(5)+pi')
$ U' c# c, x4 s# N ) S! R: e# S* I: ~: Q) `4 K# Z9 ]
a =& B7 ] _' n+ T+ N" v( e
2*sqrt(5)+pi
5 x5 r, [' a1 ~+ l digits %显示默认的有效位数
# |4 `0 ~) F0 F( u3 J' A, u: L
" ]' G/ M" I- S* ] c6 } $ A7 L) I/ E$ C) a+ Z
Digits = 32% E3 k& G& T9 ?2 a% A
( ^1 [) m" e4 o7 I" {! I. W4 G vpa(a) %用默认的位数计算并显示
' X/ d5 T0 y& o. B( J
+ F! T8 l& K/ g: }8 kans =. L% H# ^# Y) l) o
7.6137286085893726312809907207421
! B3 v0 }& A( W" u$ r7 U8 p vpa(a,20) %按指定的精度计算并显示
9 O5 G; K4 z0 a9 U# L
$ }" Z( A- f0 ~/ ]- Q+ q1 Ians =) m6 I+ j9 J, v6 P* q* @
7.6137286085893726313
D/ O! V2 R, S digits(15) %改变默认的有效位数
! m( r1 U! D) O+ ~ vpa(a) %按digits指定的精度计算并显示 ) m! _: p: G% v. f( \
% e; B" C6 c+ \" n
ans =( n0 M+ p& z9 {* T' u( Q
7.61372860858937
' C- S: ^: q& o- z! g
! S6 s0 g6 T* z/ n6 T3. Symbolic Math Toolbox中的三种运算方式的比较
/ L* g1 s1 d- w! p3 N l【例3.6续】用三种运算方式表达式比较2/3的结果。
1 \. C! t V; I* g; ?a1 =2/3 %数值型
2 z( ]( _6 q1 Z& L5 J4 |" M4 r $ j8 l3 r1 ~. {2 I- }
a1 =
, ~& e6 x% `. o& h- H, f6 H/ ~ 0.6667 ; u7 A$ t2 B1 L, K" N& |
a2 = sym(2/3) %有理数型
" d: f0 b/ m& Z+ k$ w2 ~
8 X; m( Y/ H6 J8 Oa2 =
* W% \: k0 U! m$ D! O2/3
; E" _# C4 B) p a3 =vpa('2/3',32) %VPA型 1 L+ C" Y8 M+ \. O0 l
3 y! ]9 w5 V+ Q% w1 D- A( ~7 xa3 =
6 E$ s* g$ T5 c& m$ u6 C.66666666666666666666666666666667
1 ~& U3 ^- p- I" W5 {: b程序分析:
8 l2 F. Q( u/ y& m* W1 j§ 三种运算方式中数值型运算的速度最快。4 g: p" p$ r5 U# o1 x
§ 有理数型符号运算的计算时间和占用内存是最大的,产生的结果是非常准确的。
# S+ ]0 H% C$ I§ VPA型的任意精度符号运算比较灵活,可以设置任意有效精度,当保留的有效位数增加时,每次运算的时间和使用的内存也会增加。
U. z5 _0 y% k4 U§ 数值型变量a1结果显示的有效位数并不是存储的有效位数,在第一章中介绍显示的有效位数由“format”命令控制。如下面修改“format”命令就改变了显示的有效位数:
9 ?! f8 P, X; @9 D2 J( R format long
+ M* |. N0 ?) c3 z$ ~7 s# e* f a1 5 b7 p5 Q' r" }8 f
( t+ E6 s! t& G; z5 `/ b
a1 =
F7 ~8 f% e% g3 ] 0.66666666666667 " [% N. n9 I& k% E- |6 X
3.2.3符号对象与数值对象的转换
1 h8 d1 U# W8 [1. 将数值对象转换为符号对象
1 s3 z% u* f( |! g3 G2 i M1 hsym命令可以把数值型对象转换成有理数型符号对象,vpa命令可以将数值型对象转换为任意精度的VPA型符号对象。, q4 Q; ~% {: y% M, A
( _* L1 [. `$ k& {+ D, x
2. 将符号对象转换为数值对象
8 V: V" b3 v' i Z- G) ?% K使用double、 numeric函数可以将有理数型和VPA型符号对象转换成数值对象。" T0 m6 l7 Y4 a6 u( }( |& y4 [# v: L
语法:
' W9 O$ G0 _ T4 I6 J' M* c, b0 m N=double(S) %将符号变量S转换为数值变量N) o3 ^7 R9 @# V7 _1 a" n7 H
N=numeric(S) %将符号变量S转换为数值变量N" A) Y7 J+ x% D: g3 [; S- k
【例3.7】将符号变量file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image008.gif与数值变量进行转换。
" \5 o0 d1 o( A L clear
' } v% c9 b9 Ia1=sym('2*sqrt(5)+pi')
5 i5 O0 X3 v T, e( @( r& h; x; G; t 8 s& H6 Z R% B
a1 =
- ?+ Q1 Y6 L- l$ o& Z2*sqrt(5)+pi ; l2 M' y1 _$ t1 V( Z7 Y' Y: x
2 v% v) C' D! M% ? B8 e: L
b1=double(a1) %转换为数值变量 % @. s9 x* ?% _) V" ^5 Y7 U$ [
6 g% o1 h* _$ o* J% ?
b1 =
, K! q! A, q2 [ c 7.6137 / m% b* K( L1 x4 G" c
3 _9 I' i K' K. s& s# h' r0 b! u
a2=vpa(sym('2*sqrt(5)+pi'),32) 5 ?) l" ?4 B6 T4 ~: ~1 T9 C
. o% }3 `- h% A4 W( ~+ b' j4 j9 ?a2 =1 R# _& Q! i8 l( R
7.6137286085893726312809907207421
* Y l4 G0 G3 }
8 l' D% h6 ^6 A* }, v0 r b2=numeric(a2) %转换为数值变量
3 Z( a. A; p `) d1 p! w / l% z( `& |3 M+ u! K
b2 =
7 l2 H) H' l; W, ]% R 7.6137
+ m9 ?3 R D# p8 r+ s【例3.7续】由符号变量得出数值结果。! A' {/ w0 }8 K
b3=eval(a1) ( Y f1 c# s* ]
7 W$ y7 |6 ?# r; Q& u( k" K
b3 =
) X# D" [ `' [0 s 7.6137 2 n5 B, A4 V; p) z
用“whos”命令查看变量的类型,可以看到b1、b2、b3都转换为双精度型:
8 Z5 w8 L" v. \; g2 H1 j whos - y$ }. r7 @5 v: v3 ?* f s5 x4 R& b/ B' w
6 ~: u, z- W: ?2 w; ~ Size Bytes Class0 F- P# d; t' w3 p% r) m
( A2 l6 z9 _. ?$ t' X
1x1 148 sym object
0 }. Y' Q7 q* e0 ]* b2 W5 V 1x1 190 sym object
# H Z1 h5 w( V$ _ 1x1 8 double array- j9 o8 q; h# P8 f/ ]6 E( b
1x1 8 double array0 Q+ F6 z n+ y5 S5 e# L
1x1 8 double array
4 y$ L& G4 h/ K) K1 P ~6 G& d- k3 u- w4 ^2 I, S
Grand total is 50 elements using 362 bytes ' S6 S' w6 }8 b" Q/ ~- C. t$ O- X
3.3符号表达式的操作和转换
% x$ m3 f- ^5 X. _( w, m3.3.1符号表达式中自由变量的确定' n' H' q9 z" P* s6 K
1. 自由变量的确定原则+ S3 S. c% a, _/ C/ N7 e
,MATLAB将基于以下原则选择一个自由变量:. ^ _% D6 P* B2 @7 N1 d
§ 小写字母i和j不能作为自由变量。
8 r# W& m1 v; ~8 h2 S; g6 s§ 符号表达式中如果有多个字符变量,则按照以下顺序选择自由变量:首先选择x作为自由变量;如果没有x,则选择在字母顺序中最接近x的字符变量;如果与x相同距离,则在x后面的优先。
, l( c& c6 e& j' m) g% D§ 大写字母比所有的小写字母都靠后。
$ X$ [7 I% {/ B+ ]0 k# k6 H 2 W3 z c% q) h+ h+ D
2. findsym函数& L& M. B1 R& v& ~6 C9 ^# Q
如果不确定符号表达式中的自由符号变量,可以用findsym函数来自动确定。1 `2 y4 h* R }9 H! w- o8 ^
语法:
5 l. y/ J g) x findsym(EXPR,n) %确定自由符号变量
" i- ^3 G% X! V! u3 `4 }说明:EXPR可以是符号表达式或符号矩阵;n为按顺序得出符号变量的个数,当n省略时,则不按顺序得出EXPR中所有的符号变量。
' u) ^: v" b6 h# A$ o【例3.8】得出符号表达式中的符号变量。
& S! h! u o7 ^* L9 A3 r f=sym('a*x^2+b*x+c')
G. n4 q% L G! y9 U& l# g: t " Y$ X/ j$ S& X7 w& ]2 n( ~/ z
f =4 g( f# ^) h* `/ g% }
a*x^2+b*x+c 7 H, ^' B3 c6 s& L5 t: M: T5 `
findsym(f) %得出所有的符号变量
$ K" @4 g# G0 G, Q; z; S
# R# @1 k: E1 c: Qans =
9 t6 E/ o" M" ea, b, c, x
# H+ |4 w2 r( u, y6 h9 l g=sym('sin(z)+cos(v)') [/hide]- a7 w# e- [+ B9 E# p
7 `5 W, S0 {: u$ d |
|