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

MATLAB符号计算

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 cat12620 于 2018-11-7 16:33 编辑 4 w) F  N" Z3 g5 U) p* E9 b
1 D/ a9 r& \6 l+ Y, ~
符号计算则是可以对未赋值的符号对象(可以是常数、变量、表达式)进行运算和处理。MATLAB具有符号数学工具箱(Symbolic Math Toolbox),将符号运算结合到MATLAB的数值运算环境。符号数学工具箱是建立在Maple软件基础上的。# {7 v/ a, _/ D' d/ v! D! K
3.1 符号表达式的建立
$ r% i5 J4 I  k! c. \Symbolic Math Toolbox2.1版规定在进行符号计算时,首先要定义基本的符号对象然后才能进行符号运算。" R& y4 m* l  c. m
3.1.1创建符号常量! G/ [; j  B0 a9 f/ O$ Z
符号常量是不含变量的符号表达式,用sym命令来创建符号常量。
( S& G2 P1 ~, k语法:
- M( C9 F/ Y! J% ^0 {$ a( [9 t       sym(‘常量’)              %创建符号常量
& c- Z; E+ i1 `4 A  J' |, L例如,创建符号常量,这种方式是绝对准确的符号数值表示:/ F: [4 i. s" C) O
>> a=sym('sin(2)'), o7 \# Y2 t1 z
a =
7 [' q2 Q3 Y$ X1 Z9 Vsin(2)4 N5 r" W5 ]' `9 N
sym命令也可以把数值转换成某种格式的符号常量。
' u+ \& I7 Q; @8 M% J0 x- u语法:
+ j) k5 b) F. j. _1 a, V" m: i       sym(常量,参数)          %把常量按某种格式转换为符号常量( S* Y3 Q( c0 C. ]3 q5 ~2 ?
说明:参数可以选择为’d’、’f’、’e’或’r’ 四种格式,也可省略,其作用如表3.1所示。
5 W- ^7 x/ e1 N# A4 |) G
3.1 参数设置
参数9 b1 E- l9 A* }4 i- C
作用
" d6 C1 ~3 V1 F& {" O' H  l
d# e; F+ E2 M$ u+ ?! Z
返回最接近的十进制数值(默认位数为32位)0 T2 t0 p! o0 d) c$ o6 P
f
/ b9 @8 V5 G% P8 @/ k
返回该符号值最接近的浮点表示
' A$ L$ W' e9 z4 B' L
r4 v% i# u: k3 n! X  c* f
返回该符号值最接近的有理数型(为系统默认方式),可表示为p/q、p*q、10^q、pi/q、2^q和sqrt(p)形式之一
, l1 n! a, \& U& A
e
1 S( y7 E  o* W/ J, u
返回最接近的带有机器浮点误差的有理值( V/ s# S( B- L7 u* S7 ?( @  N
例如,创建符号常量,这种方式是绝对准确的符号数值表示:# i7 [& m& i" X7 r# a- M
a=sym('sin(2)') : i" `+ s9 y& q& E) f

% ]7 Y* E: N5 f4 p* I6 da =8 W2 n* f' \8 a# @
sin(2)  
/ u8 r% B2 o, ?0 |( u& H7 x) _
游客,如果您要查看本帖隐藏内容请回复

1 _& ?( X8 j7 X6 R; F, ]: j$ E, X eig(A)                 %计算特征值
# \8 c$ d3 z5 j: [/ r( Y - G" M: j4 n% P" C% F
ans =& _# `' r) L  Q3 [6 E. k; {+ n
[ 1/2*a11+1/2*a22+1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]2 R) f% n3 y' E3 B! f0 H  o$ y2 i
[ 1/2*a11+1/2*a22-1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]  1 J" R! E9 Y7 U, t, ^9 a

2 t% H+ _9 s" }: N3 K  t/ h4 N/ A3.5】符号表达式f=2x2+3x+4与g=5x+6的代数运算。% f9 y. c, U. L$ l  k4 q
f=sym('2*x^2+3*x+4') " ?5 F5 u  A3 l: C8 B
6 D9 T6 }+ k, t( \* t5 g) y0 P
f =) i3 I, g1 {  T- a1 O
2*x^2+3*x+4  2 Z& T5 s6 m  g# p. P& g1 h4 P5 b
g=sym('5*x+6')
  a8 C7 M% g: p8 T9 d
+ f) O# @* C+ w, M  Cg =
6 ?3 C- I: k  s8 l" _+ S5*x+6  
, @8 P+ l' j2 \. ?; A, Y( l f+g                %符号表达式相加
7 i( V3 [8 ^7 [
. q  ]; A$ C! J0 K6 N! fans =( r' u9 {- m: ?
2*x^2+8*x+10  ; v% l) ]3 k  @6 ~' O
f*g                %符号表达式相乘
/ q3 T1 U+ j. c  j  [) I* r
7 g& n2 {+ u: H7 Tans =
' A$ d+ n1 U0 U% @! j6 W2 u(2*x^2+3*x+4)*(5*x+6)  7 b( I. p7 t+ T6 v
3.2.2符号数值任意精度控制和运算
, d& M4 U. U, }1. Symbolic Math Toolbox中的算术运算方式* n' s# Q: \. s; ?" }1 J
在Symbolic Math Toolbox中有三种不同的算术运算:
, y. F: W# z) K. ?- m$ H8 k$ O§      数值型:MATLAB的浮点运算。
; k7 b# V, L! Z3 n# j3 e/ B1 y2 j7 ]§      有理数型:Maple的精确符号运算。6 x! ?2 E5 S6 H) ^6 b+ N* D5 u! G5 O
§      VPA型:Maple的任意精度运算。# g4 p4 u7 B( X; ]! E

$ x, |+ N& ^5 d% N0 W1 |- E2. 任意精度控制
5 m6 Q: y9 C" z- E2 P! B, y任意精度的VPA型运算可以使用digits和vpa命令来实现。
7 B; C1 g! C0 H* L+ f语法:
  ]9 l5 \. u  ^* y' {! @7 b. C$ }       digits(n)                    %设定默认的精度
2 F8 w/ A" e0 d6 ?  D4 G8 w% h说明:n为所期望的有效位数。digits函数可以改变默认的有效位数来改变精度,随后的每个进行Maple函数的计算都以新精度为准。当有效位数增加时,计算时间和占用的内存也增加。命令“digits”用来显示默认的有效位数,默认为32位。
: q: z7 _( }( T语法:$ E7 x' J+ o" [/ T; e
       S=vpa(s,n)                %将s表示为n位有效位数的符号对象
4 X+ H$ a& }( q4 s, |说明:s可以是数值对象或符号对象,但计算的结果S一定是符号对象;当参数n省略时则以给定的digits指定精度。vpa命令只对指定的符号对象s按新精度进行计算,并以同样的精度显示计算结果,但并不改变全局的digits参数。
) e& [) N3 t' j# D; ~0 B9 t3.6】对表达式file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image006.gif进行任意精度控制的比较。6 x+ ^# }- w3 p3 ]$ r, w
a=sym('2*sqrt(5)+pi') , \& K. l) e% p! B/ [& P

  m& g, j0 E9 r/ {a =0 f' U' E: A0 N# o- u
2*sqrt(5)+pi  
$ R! o0 f% k. Z2 R5 d  w digits      %显示默认的有效位数 & r; \! @- U- t3 q4 s

  o# B% a# J! f  S, t# ^
9 ~  `& z; I; J; @/ X; fDigits = 329 X4 S$ Y5 v6 F: d& M/ ]; k/ A
   
1 z2 q1 v' z' U) C2 u1 B( a) ] vpa(a)      %用默认的位数计算并显示 9 u0 k! _) R# H+ J. x2 ^/ q, _$ R
5 v& F9 j$ B" M1 I; b) h% D
ans =
/ D. s4 u/ m* e: {/ ]/ t7 r  J3 e7.6137286085893726312809907207421  ! ^  G) O& K; d$ q
vpa(a,20)       %按指定的精度计算并显示 7 Q2 e' N( C$ n+ r/ g7 E; ^

6 `' L* s$ i% Qans =
1 ]' g" d: b. z+ Y* y$ D7.6137286085893726313  0 w  r! w1 [9 D- ]( f. T: D
digits(15)      %改变默认的有效位数: S: P6 S+ j7 n( P3 a
vpa(a)      %按digits指定的精度计算并显示
3 |" L" j- F, \2 x 6 `3 Z5 K' J7 F
ans =8 R& g# M0 ?& ]8 |& Z( S
7.61372860858937  
( I5 I( F7 {4 C6 Z6 w, i/ T" j ( B1 N  ?# P5 B
3. Symbolic Math Toolbox中的三种运算方式的比较9 x7 E9 ]2 K# r. W) Z. \' w7 ]$ B
3.6】用三种运算方式表达式比较2/3的结果。" C5 G' L/ q. I& P
a1 =2/3      %数值型
# {2 I7 i0 Z% ]# d6 Q7 Q) F  G 8 l' F# G: h3 Q5 {
a1 =  E& y4 ?% E- v5 A! s' j* V% `
    0.6667  
  Z, Q! u- i( r7 B% _- Wa2 = sym(2/3)    %有理数型
) y6 A0 f3 B  \# k7 J8 u
& E- s  u4 J$ M! ^5 Z  \) w6 Na2 =6 ?1 Q5 ^' y+ g' ~7 f+ c! M
2/3  ! Z6 K$ Y2 }$ i0 H" d+ U. w( n
a3 =vpa('2/3',32) %VPA
5 c* o; p! P0 f$ H 2 Q1 ~: V4 k& ]/ M% v! r3 R
a3 =# z' C+ Q' x/ R: o
.66666666666666666666666666666667  ) B8 y- D7 A, B; h* D7 T3 E
程序分析:, e& N4 P" r9 @# X8 P6 K3 @* ?" m
§      三种运算方式中数值型运算的速度最快。  W: x6 R, I  W- u; ~4 C/ l
§      有理数型符号运算的计算时间和占用内存是最大的,产生的结果是非常准确的。0 |. a. B3 |4 D" z& N, U" Y
§      VPA型的任意精度符号运算比较灵活,可以设置任意有效精度,当保留的有效位数增加时,每次运算的时间和使用的内存也会增加。
/ a* B9 Y1 G  b! S+ g§      数值型变量a1结果显示的有效位数并不是存储的有效位数,在第一章中介绍显示的有效位数由“format”命令控制。如下面修改“format”命令就改变了显示的有效位数:
( b" d, e2 E3 b: t7 l/ Z4 L% p format long
# f/ H% G( W6 G/ `; O6 y a1
, l3 g$ R, W6 t0 w
; [! e5 [$ l* {$ P6 T6 l% |* Fa1 =2 s9 a9 [) ?& l
   0.66666666666667  9 l3 O+ I' o: [+ h4 \, M$ M: f
3.2.3符号对象与数值对象的转换
$ R: F& D3 e7 l7 C/ F1. 将数值对象转换为符号对象
+ w& j0 H6 m$ J( dsym命令可以把数值型对象转换成有理数型符号对象,vpa命令可以将数值型对象转换为任意精度的VPA型符号对象。
. \' E: j% f0 @ $ `/ P* i- w& {  t! m
2. 将符号对象转换为数值对象
. {/ X  e6 e6 A3 ?" J6 Y使用double、 numeric函数可以将有理数型和VPA型符号对象转换成数值对象。+ Y# P0 t5 \4 N% F+ V. W0 B
语法:5 i- ^& p9 p5 \/ E2 b5 s$ t; y0 ^
       N=double(S)              %将符号变量S转换为数值变量N# v$ ~# `; Y/ M3 S  t7 @! Q% Y: K9 T
       N=numeric(S)           %将符号变量S转换为数值变量N
; ^- u9 [% J/ J' w0 O3.7】将符号变量file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image008.gif与数值变量进行转换。
) e/ g8 X5 |( l) V) \- R clear
4 k7 U0 r0 m% b& q! b/ oa1=sym('2*sqrt(5)+pi')
( ]' \! o$ ~5 @
9 l- {  \. ^; {& \$ S1 N9 j3 r9 _a1 =
# k- Q; q6 s) e: u2*sqrt(5)+pi  
% g8 M% p* A+ V) F$ f2 O ( X: [) X* @, Q7 [/ g! g0 |! c; e
b1=double(a1)             %转换为数值变量 7 n0 w8 ?8 Y0 [  z" U& O3 @2 b
* ]9 g7 w5 X- v5 b+ D. Y
b1 =3 w9 v5 b' T/ R
    7.6137  6 [1 L1 v* u0 ]. G; K7 `' Y/ D' R" D' n
8 k4 z( y  G7 D' R8 M# o; `
a2=vpa(sym('2*sqrt(5)+pi'),32) ) A5 u, P9 Y" f# Y: F

$ b) Z2 R( S! k1 x% X  t0 h, Za2 =
6 B0 B3 n* h2 x: v) @, m- [1 m* v7.6137286085893726312809907207421  
. A4 _7 q# b$ `7 [; B , P6 p- H6 P; @% F+ ]8 ]+ E8 i: x
b2=numeric(a2)         %转换为数值变量 0 ]% S) `8 Z' S

6 }9 F0 L2 j& Fb2 =
9 K! R. y2 `5 C( V2 d7 m7 j% i" L9 n    7.6137  4 b, n0 C8 Y1 }9 P- b
3.7】由符号变量得出数值结果。5 n6 l. N. U* [* Y1 Z6 l2 K& m
b3=eval(a1) ; C: V9 k0 M* \+ P7 D0 \. t; z
  x( n' R9 S# p
b3 =
6 b( p) Y' `1 |% f4 O    7.6137  
3 _- J% z( z2 u! D" x1 o用“whos”命令查看变量的类型,可以看到b1、b2、b3都转换为双精度型:
& G* D4 }0 n: [, o1 D whos
* C' h5 z9 |" J* M8 t
' @( Y1 q/ D. G( w- H' E      Size                   Bytes Class
; `, P0 L7 y- r& ` 8 _( L4 C6 I8 J$ Y5 e
        1x1                      148 sym object
% l% O  @/ e) y  X) a        1x1                      190 sym object
% L- R* t$ [* }5 t        1x1                        8 double array
% T- z* S5 ]3 ?3 V) s) X        1x1                        8 double array
* J  Y& j; |# ?6 Z, S6 D        1x1                        8 double array
; m3 `: B/ ^, F- I/ W - V$ j2 r" v4 B% ~7 A( B
Grand total is 50 elements using 362 bytes  $ V) y) k' a8 S4 O4 w
3.3符号表达式的操作和转换4 r- M$ ^5 b5 D. |  r  l2 o' E
3.3.1符号表达式中自由变量的确定
8 @: U/ L% B$ a( \9 x8 p3 A- L1. 自由变量的确定原则
" T8 s& A; t, e( r' ^3 T,MATLAB将基于以下原则选择一个自由变量:
2 ^% g, j9 D6 v9 w4 _0 a§      小写字母i和j不能作为自由变量。5 `7 ?$ K% I* N- n' ~# _
§      符号表达式中如果有多个字符变量,则按照以下顺序选择自由变量:首先选择x作为自由变量;如果没有x,则选择在字母顺序中最接近x的字符变量;如果与x相同距离,则在x后面的优先。! |" o4 i) e6 h, |" d
§      大写字母比所有的小写字母都靠后。
+ G4 K7 l- d, {( z( D) X" K4 _
1 {: H: q: b8 ?4 A8 H) |2. findsym函数
/ Y3 T* ]( Q- ~4 r6 \- Z如果不确定符号表达式中的自由符号变量,可以用findsym函数来自动确定。
1 ~0 H: [, }6 j1 B' _语法:
) N1 n- f% l) `1 G( q1 L       findsym(EXPR,n)        %确定自由符号变量
7 {( [. L) f6 t2 T( d7 i+ r说明:EXPR可以是符号表达式或符号矩阵;n为按顺序得出符号变量的个数,当n省略时,则不按顺序得出EXPR中所有的符号变量。
/ N% _1 `2 D1 \' }3.8】得出符号表达式中的符号变量。( D. j0 m4 V! d! K6 d7 f3 x
f=sym('a*x^2+b*x+c') 2 b: {& I- i7 \% B
" ?* V$ T8 s# D6 v1 s! g9 L, L; U
f =$ }4 Z$ h6 T  Y5 m. a8 ^
a*x^2+b*x+c  ( t2 ^2 j+ f  Z# {
findsym(f)         %得出所有的符号变量
( J$ P9 s4 g6 K0 R3 m9 c" `
/ B! U9 t$ v& `$ C7 Fans =
! w  N' D* D' ~5 [a, b, c, x  0 h! [& |. U& Y9 u6 R
g=sym('sin(z)+cos(v)') [/hide]$ o4 Q( a, k% a- K/ Z% c

% C% B9 ~0 L! g3 V
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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