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

MATLAB符号计算

[复制链接]

该用户从未签到

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

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 @; j3.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- J3.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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 16:39 , Processed in 0.187500 second(s), 23 queries , Gzip On.

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

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

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