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

MATLAB符号计算

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 cat12620 于 2018-11-7 16:33 编辑 . P) _) N' A/ D: c
0 }9 Y4 f! {+ h6 i, ?3 f
符号计算则是可以对未赋值的符号对象(可以是常数、变量、表达式)进行运算和处理。MATLAB具有符号数学工具箱(Symbolic Math Toolbox),将符号运算结合到MATLAB的数值运算环境。符号数学工具箱是建立在Maple软件基础上的。( O$ g  O: s0 b% P' _/ W
3.1 符号表达式的建立& E0 ~- C* O# n5 N9 d
Symbolic Math Toolbox2.1版规定在进行符号计算时,首先要定义基本的符号对象然后才能进行符号运算。( ^1 ]% [$ V7 _2 T) F9 N+ b
3.1.1创建符号常量! H3 U, N0 M1 ?1 H) Y" L: r
符号常量是不含变量的符号表达式,用sym命令来创建符号常量。" M8 g+ m* e) ?6 q* l- t; T2 `
语法:
" V" Q( _  H$ H3 _       sym(‘常量’)              %创建符号常量2 \& @- I& w$ u8 K4 n0 u
例如,创建符号常量,这种方式是绝对准确的符号数值表示:& I' A- G6 f# J
>> a=sym('sin(2)')
$ y# |; m* B$ \5 ?& q' ya =( @0 u+ ~4 o# u- y
sin(2)
3 W  w4 C) P3 P5 S2 Gsym命令也可以把数值转换成某种格式的符号常量。
- o0 X# \1 c* L4 B语法:
" v( `3 ^5 ?: K. c$ d$ ^       sym(常量,参数)          %把常量按某种格式转换为符号常量7 u& ]& ?* \$ z8 n) s/ U' f! {( W
说明:参数可以选择为’d’、’f’、’e’或’r’ 四种格式,也可省略,其作用如表3.1所示。& ?/ ?: D' }8 i4 P: K
3.1 参数设置
参数* U4 r  ?0 h$ D4 m9 o
作用
7 A. g( d; O7 W7 E& L4 p
d) e( B$ C: w4 b% V% Y' I8 q
返回最接近的十进制数值(默认位数为32位)4 o8 i- R1 {! N0 I) Y
f
, K, H/ f! R1 B  X- }
返回该符号值最接近的浮点表示
9 U; M+ y/ V; x; a: Q6 K0 s- M
r
) D+ v3 t2 f9 a4 Y' i
返回该符号值最接近的有理数型(为系统默认方式),可表示为p/q、p*q、10^q、pi/q、2^q和sqrt(p)形式之一
4 x! }, s8 [- x! ?& M* _$ D% G
e) v. L* Z, G4 J  e9 a1 e% b. i
返回最接近的带有机器浮点误差的有理值" j% _7 m; a, c& r% M/ A9 `7 B1 M
例如,创建符号常量,这种方式是绝对准确的符号数值表示:' |  m8 {, S, O9 \" j
a=sym('sin(2)')
0 w# ]+ z. p2 S6 b- q8 y: [
/ V; u% P- [0 T' xa =
( I9 r( y( P6 L3 x2 O! Lsin(2)  
: J2 z0 r% m2 V! d7 n
游客,如果您要查看本帖隐藏内容请回复

* d4 y% c- [/ \+ K0 }0 s5 R8 ^) l eig(A)                 %计算特征值
1 ?0 Y+ J& x1 N' ?2 c$ z+ W 7 P4 Y: b) b  S* w; H; s, z
ans =, W' {6 w/ s. t5 v
[ 1/2*a11+1/2*a22+1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]
3 E2 T1 [" X) u7 Q6 Z[ 1/2*a11+1/2*a22-1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]  
* F: _& M1 H" c, u* X" I   S* d0 p# G. E  ?- m8 P8 l( u
3.5】符号表达式f=2x2+3x+4与g=5x+6的代数运算。4 d& P1 D8 H7 b4 T
f=sym('2*x^2+3*x+4') " q8 e* v# G7 M; T8 b9 ^
$ ^8 Q- ?1 V' q/ c' n
f =
  s. D$ U* {1 r$ ~9 a' K+ v2 S% Z6 }2*x^2+3*x+4  
1 I# Z( c6 P6 v) s& p5 D) B g=sym('5*x+6')
4 i# K' H# K% q5 u7 Y- q* }; ~
5 v. O& x0 X# h* R& i9 p! |7 Kg =
0 r$ A0 q. X  C: s# c% s  |5*x+6  3 D  E: _. s. Q- f
f+g                %符号表达式相加 3 `$ A& O) p3 u  `

" o2 m, k3 M" K  ~ans =2 l7 [6 _2 G4 ~  Q) M5 d; j+ E! C
2*x^2+8*x+10  
1 ~; Q: f$ s" T6 B f*g                %符号表达式相乘 9 |7 b( S2 v  T+ D

' l$ g1 C* @) b! W* m& _. w. W* k" Ians =
' Q5 P5 R( M/ U5 z4 M(2*x^2+3*x+4)*(5*x+6)  
2 {2 z- t" A! C0 T% R1 ]3.2.2符号数值任意精度控制和运算) _( W3 F8 ]$ a- I$ e# B
1. Symbolic Math Toolbox中的算术运算方式3 t2 v) W5 H* Y: k- q& h# U
在Symbolic Math Toolbox中有三种不同的算术运算:( \3 o; V* b% B8 N
§      数值型:MATLAB的浮点运算。
/ @) F, U, B* K4 E6 K§      有理数型:Maple的精确符号运算。
1 m( {3 ~9 z" T3 I, J% R0 ^$ J§      VPA型:Maple的任意精度运算。
6 g3 y$ m' Y7 U6 w( X
: l" I9 {* k* b' t1 N  o2. 任意精度控制1 V- ?$ f8 d$ ?0 g0 K8 b  v9 A9 f
任意精度的VPA型运算可以使用digits和vpa命令来实现。( j2 I) ]# i- ?  h
语法:; g- [4 F: h( [7 z% ]
       digits(n)                    %设定默认的精度
5 l# j6 n* D6 `' P  m' G说明:n为所期望的有效位数。digits函数可以改变默认的有效位数来改变精度,随后的每个进行Maple函数的计算都以新精度为准。当有效位数增加时,计算时间和占用的内存也增加。命令“digits”用来显示默认的有效位数,默认为32位。
: A  i1 |: j  h语法:
% t' }5 s- s2 q) H       S=vpa(s,n)                %将s表示为n位有效位数的符号对象
5 L5 Q3 f  K/ v说明:s可以是数值对象或符号对象,但计算的结果S一定是符号对象;当参数n省略时则以给定的digits指定精度。vpa命令只对指定的符号对象s按新精度进行计算,并以同样的精度显示计算结果,但并不改变全局的digits参数。1 O/ N, s1 x( }$ l( T' k
3.6】对表达式file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image006.gif进行任意精度控制的比较。# D0 b: a- |+ C
a=sym('2*sqrt(5)+pi')
0 L# t0 p% y" E+ K! B3 J. \
- }! b! H) U, n, F% E( ?2 |a =- [0 C  f# c( n! L( v
2*sqrt(5)+pi  
( Z' [) I7 i  h digits      %显示默认的有效位数 $ P$ l0 T9 A0 o, A, W

2 E. L4 [, M7 l: Z6 L 3 m! Y6 T. i3 m% V% @
Digits = 32+ c7 ?" `4 v/ P; }7 q7 N. H  Z7 {0 [
   
6 W7 p( J# U" C vpa(a)      %用默认的位数计算并显示
3 U. h+ G' \2 x% E3 o8 Y
2 |" N# T9 U  o* N7 yans =
/ \/ q2 V# S6 Q, x! b7.6137286085893726312809907207421  
/ a, M: e8 y$ V# O) b6 z vpa(a,20)       %按指定的精度计算并显示 * _) q: D7 Y- x( ?
& m4 @2 ]/ \- n# l9 Y  n& {( C2 q
ans =
5 B6 L9 G! ~) a1 |$ o% K) l7.6137286085893726313  
  u  U0 a/ O* [5 n digits(15)      %改变默认的有效位数
" d! @4 O% p& W+ _; m  A6 L, }4 H vpa(a)      %按digits指定的精度计算并显示
3 T+ {& x# b2 h: I! Z
: P: k$ K( i9 Eans =3 v4 C. c2 c4 ]2 T7 N! ]5 V; a' `
7.61372860858937  
* ?9 H; x4 G1 s' G2 i3 A/ Z - {' j1 X" Z% t2 l! ]2 Z. E
3. Symbolic Math Toolbox中的三种运算方式的比较
7 s7 S' e2 v' m  c5 X* M3.6】用三种运算方式表达式比较2/3的结果。7 u* L: q' a4 i  D  t
a1 =2/3      %数值型 + R8 l* y8 g% \  O1 {7 n

- x) p) A; O* g/ d1 Ha1 =
! c' G5 ?  f0 _) I  M$ ~    0.6667  ) S  j. ~( q, {2 G  e3 \
a2 = sym(2/3)    %有理数型 9 w) k4 |  K& S, `! G( C6 b. X: D

. k, _5 p, F. E4 O" ha2 =! G  ~% ?. o# Q4 c! Z+ ?
2/3  # R. n$ K# X* C$ u5 _5 g
a3 =vpa('2/3',32) %VPA
4 |8 P# b5 Q& C" P1 a! [0 c4 R) } % a; M$ q3 n4 W" D2 n" M
a3 =2 x# T( V* T" K9 L1 {8 l
.66666666666666666666666666666667  ! }1 F% r1 L! I4 ~( v. j
程序分析:
, |2 u, ~+ w. s" ~§      三种运算方式中数值型运算的速度最快。
9 \  S) h+ \3 ^7 X* S9 I§      有理数型符号运算的计算时间和占用内存是最大的,产生的结果是非常准确的。
+ b1 @$ z& I. w§      VPA型的任意精度符号运算比较灵活,可以设置任意有效精度,当保留的有效位数增加时,每次运算的时间和使用的内存也会增加。
4 `* s" K0 I9 t4 [8 o1 u, A§      数值型变量a1结果显示的有效位数并不是存储的有效位数,在第一章中介绍显示的有效位数由“format”命令控制。如下面修改“format”命令就改变了显示的有效位数:1 _2 g  T- d" O; `
format long; U! h4 a; c3 R+ C
a1
/ c7 o, J7 S2 S2 J; e9 {. h; i5 { 4 A" |( Z" W6 e+ t& ^! ]- k; {
a1 =, z+ G; v3 W8 d% y2 w7 V) D
   0.66666666666667  9 Q: o: l6 @7 L" z) c/ q1 t
3.2.3符号对象与数值对象的转换
) M( J  _9 N7 p, n  y1 k; N1. 将数值对象转换为符号对象& ?8 f6 j" L  K. ^
sym命令可以把数值型对象转换成有理数型符号对象,vpa命令可以将数值型对象转换为任意精度的VPA型符号对象。
6 b: L7 F; @* T, x' E: ?* d
  D+ \5 E( [& C, F% T1 G0 |: P, R2. 将符号对象转换为数值对象
; i2 z2 C, Y2 `: y使用double、 numeric函数可以将有理数型和VPA型符号对象转换成数值对象。7 w) g+ D  _6 y+ _1 c' W2 e3 _
语法:" b7 s- ?! v5 N* w* D# i! B* J0 J8 p0 d
       N=double(S)              %将符号变量S转换为数值变量N" V& v! o2 O% X
       N=numeric(S)           %将符号变量S转换为数值变量N# l3 V) `$ X6 l1 j! t
3.7】将符号变量file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image008.gif与数值变量进行转换。
3 p" F! d% v* l; ]3 S( d clear' [1 ^6 e; H7 n- Q8 n  Q8 e% {
a1=sym('2*sqrt(5)+pi')
- W3 v* ]! b0 P# ?0 N 6 b- d( F& v. w$ w
a1 =& E! y$ {- \+ G7 C6 p; k/ V3 H
2*sqrt(5)+pi  
$ A9 u  Y+ }3 F: Y/ i/ m
; K9 n" `6 V7 d6 \  n  X b1=double(a1)             %转换为数值变量   D( Y% y4 q$ G- g

( i8 v+ f3 I+ O* wb1 =- x3 V; ?' n* t9 w; S8 O3 ?
    7.6137  
& T7 F$ p! m! s% N) A3 [8 l* y- P; w! G
2 j$ N) T/ p9 Y+ B6 J% A% N5 q a2=vpa(sym('2*sqrt(5)+pi'),32) ! j7 z$ C6 P* x& _, e5 N4 ^: F

  p5 W" A7 z. d5 t7 A- ]a2 =- E( l8 ~2 V: v( b* |0 h
7.6137286085893726312809907207421  
2 E  ]1 N3 D1 M7 o' Q$ i. | 5 A3 d  @( _/ G
b2=numeric(a2)         %转换为数值变量
- |8 d" |) Q: x* l4 @( L / K3 H  f+ p3 D) E. D
b2 =
$ o5 p  F1 }  t    7.6137  3 ]' a( x' e! F2 G' r
3.7】由符号变量得出数值结果。
  a9 g4 G6 b( l( v! x7 A b3=eval(a1)
+ v0 X4 Y8 G, o- f9 \+ t8 a
8 Z% E7 W6 h( F, U5 Ab3 =6 H$ ?* G; p- N" v
    7.6137  2 r; O% A6 ?0 [; F
用“whos”命令查看变量的类型,可以看到b1、b2、b3都转换为双精度型:
) p, t9 i4 r' f9 f$ u' P whos & z! |6 s" c/ q+ s+ H  i
' t5 a) M+ Y/ J/ M9 {4 y0 ^
      Size                   Bytes Class7 t/ s* @, s/ C$ c# z
: v" i1 M  {: b3 B6 |& z. k
        1x1                      148 sym object4 t' \  O% \0 Q, L. s4 y3 U
        1x1                      190 sym object
* Z8 P" ~# d/ X; p" i; a        1x1                        8 double array
9 H) V" A! D1 W& ^        1x1                        8 double array
) S' u3 Z$ |$ l5 T. L: {        1x1                        8 double array
0 \( B* p; D2 i) @% ?) K2 R  c& |) U1 P ' [3 p. `6 N# l5 _
Grand total is 50 elements using 362 bytes  1 d3 \6 d. x7 ^
3.3符号表达式的操作和转换1 y- m+ x0 J; t! E
3.3.1符号表达式中自由变量的确定9 ^6 N6 @8 B- z0 {5 p
1. 自由变量的确定原则
' {/ u( `  G& n4 H& s9 X1 f,MATLAB将基于以下原则选择一个自由变量:
4 y. ~" B. A6 d3 Z! f2 \§      小写字母i和j不能作为自由变量。
; f- q# J! R& X' C% z§      符号表达式中如果有多个字符变量,则按照以下顺序选择自由变量:首先选择x作为自由变量;如果没有x,则选择在字母顺序中最接近x的字符变量;如果与x相同距离,则在x后面的优先。5 X6 ~' d- L. }
§      大写字母比所有的小写字母都靠后。" ]( |' r- p7 K$ y" V

  d% P) p  \9 C8 z) P1 U. K2. findsym函数8 i* u8 r( S/ k, m" T
如果不确定符号表达式中的自由符号变量,可以用findsym函数来自动确定。
8 P" Q! Q9 \" E' @' ]语法:
1 p+ v1 z* k6 u+ G* V$ a       findsym(EXPR,n)        %确定自由符号变量
6 F' k0 W4 w/ ?8 P4 N. g0 }说明:EXPR可以是符号表达式或符号矩阵;n为按顺序得出符号变量的个数,当n省略时,则不按顺序得出EXPR中所有的符号变量。
9 w/ R6 t: s% ?3.8】得出符号表达式中的符号变量。4 J0 m. A1 s, s3 r
f=sym('a*x^2+b*x+c')
, x, \( c1 U. ~1 t: y0 J. c
/ g1 a9 B7 W5 t# Mf =5 Z3 a0 l8 F8 p% s. j4 P8 P
a*x^2+b*x+c  
: U" {4 W7 O# z1 V; h- J findsym(f)         %得出所有的符号变量
4 P- |& L" N9 V( P2 [ % b1 M( C) E$ F
ans =& ?, T4 P: T- ]7 h
a, b, c, x  
) W! j, |9 R. Q g=sym('sin(z)+cos(v)') [/hide]! X7 n8 ~1 H  o: P2 _; H
3 J4 x5 p9 Y+ z' n% r( Q7 h* S3 t! I
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-2 22:46 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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