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

MATLAB符号计算

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 cat12620 于 2018-11-7 16:33 编辑
$ Y, A9 N' g8 Z+ j. b0 ?3 y; B
' K: y0 |: h" r4 e$ N' ^符号计算则是可以对未赋值的符号对象(可以是常数、变量、表达式)进行运算和处理。MATLAB具有符号数学工具箱(Symbolic Math Toolbox),将符号运算结合到MATLAB的数值运算环境。符号数学工具箱是建立在Maple软件基础上的。* }8 q% f6 V! {2 Q/ _/ }
3.1 符号表达式的建立
% \( ?7 r, r/ ~" q: @  wSymbolic Math Toolbox2.1版规定在进行符号计算时,首先要定义基本的符号对象然后才能进行符号运算。1 h' \  @2 T. [/ B
3.1.1创建符号常量2 X- y, c: m, O  J7 R9 y  Q* f
符号常量是不含变量的符号表达式,用sym命令来创建符号常量。
# Z; T0 J; o- Z2 _. A& U语法:
) g3 E1 R1 S1 w, W+ w8 \, R8 F8 ]       sym(‘常量’)              %创建符号常量" R0 Y2 M+ o0 Y1 {0 ^% _
例如,创建符号常量,这种方式是绝对准确的符号数值表示:
! S/ Y* {# V6 {' P>> a=sym('sin(2)')
9 g/ V; a! v' l  G3 ca =
4 \0 ]8 m- F5 C7 O" }0 Xsin(2)
4 y8 N" u& E, w* G$ u9 dsym命令也可以把数值转换成某种格式的符号常量。
& t( D0 o6 z2 _& g1 t0 ?语法:
' @! J2 v! c. a4 d6 |3 z# M* O1 O       sym(常量,参数)          %把常量按某种格式转换为符号常量  T+ t- j: W- L' K
说明:参数可以选择为’d’、’f’、’e’或’r’ 四种格式,也可省略,其作用如表3.1所示。
6 P3 z/ |4 @1 j4 u
3.1 参数设置
参数( i& X, V  O$ r, G8 v5 \
作用
8 K7 T3 ?& u3 a* l& L/ ^( W: |
d; h7 c- ^  J: d% |
返回最接近的十进制数值(默认位数为32位)2 G! U2 Z! v7 d7 \# H+ Z
f: L2 ^# u# c" o0 L7 b
返回该符号值最接近的浮点表示
) ^7 F& L5 q" u$ M4 [
r6 B0 G" `/ t' [# O( O
返回该符号值最接近的有理数型(为系统默认方式),可表示为p/q、p*q、10^q、pi/q、2^q和sqrt(p)形式之一
9 v$ W3 m* x- w3 L1 _- O
e3 f5 f# |. S* t* k2 m8 t, C: H
返回最接近的带有机器浮点误差的有理值; k. L5 i5 e1 ^! i
例如,创建符号常量,这种方式是绝对准确的符号数值表示:* t/ W8 ~9 M2 Y) E3 ^; w1 t
a=sym('sin(2)')
4 T# M/ ^# q2 W6 d# D% C5 c+ U
' ^: N) q+ P" ]& oa =& t  b/ _; V2 J- c3 ?
sin(2)  
: w- s+ L' ]( b0 y8 V, d6 r
游客,如果您要查看本帖隐藏内容请回复

* B8 d* W& H3 g3 Y# h eig(A)                 %计算特征值 $ \0 e) X6 t8 y7 w' K

4 k. g$ [. R" k8 ]  f" m% Lans =
3 v& c8 A& C# Y! g* \; ]; ], t5 D[ 1/2*a11+1/2*a22+1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]: H! [. N- w/ z! I
[ 1/2*a11+1/2*a22-1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]  : T3 s0 E, ^6 U' x/ Q
6 n6 Z8 j6 N! ^
3.5】符号表达式f=2x2+3x+4与g=5x+6的代数运算。7 b3 Z4 b: y2 @+ U7 X8 F
f=sym('2*x^2+3*x+4')
! m: s: J* R$ R; |4 R$ i1 o( L - ^* s8 a! D: h/ T, O; m
f =6 Z) F. y; g) x% K  {
2*x^2+3*x+4  ; W1 ^$ {; Y& P$ s  m/ z: A6 N4 P
g=sym('5*x+6') % [! H+ q9 _3 i1 O
( G* N. T: n  }# ?  o* L
g =& x+ _$ x' L5 t" |& `- l0 `6 p
5*x+6  
; H) }, P9 E& X4 K% q; x: u f+g                %符号表达式相加
" j8 x+ ]# |7 U2 u# v# H4 x9 d+ E% J& K 5 i" d) \8 o8 O  v9 T+ S/ x
ans =
6 Z3 H' W) ]7 t0 r' F2*x^2+8*x+10  ! \+ }! R; r& k: t6 k
f*g                %符号表达式相乘
) v, Z0 R; r4 S/ ~$ T
: T6 V" `. z1 H. Kans =4 b! x) W1 [( Z1 P5 G. C- [
(2*x^2+3*x+4)*(5*x+6)  & S8 B9 I& U  T3 e
3.2.2符号数值任意精度控制和运算3 P8 D0 _$ _, K! L$ Y
1. Symbolic Math Toolbox中的算术运算方式
  X9 e7 f/ c4 L在Symbolic Math Toolbox中有三种不同的算术运算:
2 L; ?) c2 G! |. D& z§      数值型:MATLAB的浮点运算。3 n# [. A. C; Z# E$ }2 `' z
§      有理数型:Maple的精确符号运算。
5 k& ?! T3 b8 f9 e2 _§      VPA型:Maple的任意精度运算。# }. {: ?: j4 o" p5 w" V( |; G; |

! I" k3 h3 x0 F& N1 P" q' h2. 任意精度控制
* }/ [8 Y# d7 t# e- u- S任意精度的VPA型运算可以使用digits和vpa命令来实现。: k" D0 A2 @- F6 G# ?4 k  ~; g
语法:" o6 I6 P6 a' @4 z
       digits(n)                    %设定默认的精度6 `6 \9 _- D4 \$ H, X& v
说明:n为所期望的有效位数。digits函数可以改变默认的有效位数来改变精度,随后的每个进行Maple函数的计算都以新精度为准。当有效位数增加时,计算时间和占用的内存也增加。命令“digits”用来显示默认的有效位数,默认为32位。
* E0 C% U; z+ |9 I( u4 r语法:
% H+ d  @+ L3 s  K4 P       S=vpa(s,n)                %将s表示为n位有效位数的符号对象
0 a2 h/ X& [/ |5 c2 i$ |) |7 ]/ d说明:s可以是数值对象或符号对象,但计算的结果S一定是符号对象;当参数n省略时则以给定的digits指定精度。vpa命令只对指定的符号对象s按新精度进行计算,并以同样的精度显示计算结果,但并不改变全局的digits参数。: J5 d' V+ u2 b! b! y) Y
3.6】对表达式file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image006.gif进行任意精度控制的比较。& L' o9 a# d( ]/ {6 p/ S% O: v5 P
a=sym('2*sqrt(5)+pi')
; M" d) L) `- g- T! \
" e( J9 \- `  l. X% O$ ka =! e- A2 [. R9 P: L
2*sqrt(5)+pi  5 K  S. h4 I- [/ I  z& G
digits      %显示默认的有效位数 ! y, N/ ?0 I6 G

9 n; g% p9 q% T! p* x 6 ~+ _6 Z( C7 u
Digits = 32
1 l2 {" ], z7 ~% R% j, W/ f" h( r   - H$ N  _8 ^5 e
vpa(a)      %用默认的位数计算并显示   w* h7 r$ C0 E; H( h

) I: y1 g" w  p1 ~% I5 a: Yans =% ~& K8 j  r9 v, n' N' ~% j  d" U5 Y# B2 {+ \
7.6137286085893726312809907207421  
" i6 k  F" l% v) x' T! v3 F vpa(a,20)       %按指定的精度计算并显示
. y' y/ P% M! q, m( \# F / O" R5 A1 \6 h3 ~  U5 |
ans =; j: c) a# g* H/ S
7.6137286085893726313  
: p! Z; N8 J7 Y digits(15)      %改变默认的有效位数
0 p/ q% d  o0 M- U' T6 Q- P3 [ vpa(a)      %按digits指定的精度计算并显示 # r& R. ~% i! J! w- R0 |
+ M' m! Y; h* d7 i
ans =
" [* u+ J3 l& |# q' Q4 I7.61372860858937  
7 P# Q3 h2 S9 g: r7 u: D' }4 d
; J" J* }& H5 E9 k5 U3. Symbolic Math Toolbox中的三种运算方式的比较4 F# t1 C: p4 |
3.6】用三种运算方式表达式比较2/3的结果。
7 k8 p/ V# ?# @3 ^a1 =2/3      %数值型
: c/ f. d; e! ]4 R' `* `; d
5 B+ O7 w# L8 H$ ga1 =
8 h6 `; p; T7 W* ^2 {2 N    0.6667  ' M; d, r( e' B7 `+ z0 `+ v, u
a2 = sym(2/3)    %有理数型 0 Y9 J4 R+ M+ J7 p6 J6 g
, @% D- ?, K! V2 X
a2 =
6 K8 P" t2 n) j2/3  
! }. i% ~/ V' k2 J  ~. J a3 =vpa('2/3',32) %VPA
4 i1 _# Z$ F( a
# E& X8 m8 a+ X  N3 i- m: C& _a3 =
7 [5 d' L) l. I" Y: D.66666666666666666666666666666667  / [; L! A0 K% ^0 C/ p! @3 N1 k
程序分析:
1 B9 O; F! J: L) T( m§      三种运算方式中数值型运算的速度最快。& c1 z" V: P3 d1 G4 I; ~/ Z
§      有理数型符号运算的计算时间和占用内存是最大的,产生的结果是非常准确的。. j, e! G8 ~7 A0 _$ n1 }
§      VPA型的任意精度符号运算比较灵活,可以设置任意有效精度,当保留的有效位数增加时,每次运算的时间和使用的内存也会增加。/ r* [8 Z$ M9 q# A
§      数值型变量a1结果显示的有效位数并不是存储的有效位数,在第一章中介绍显示的有效位数由“format”命令控制。如下面修改“format”命令就改变了显示的有效位数:
: i% B5 m/ `, N& R  k format long
, W: b8 O" |9 ~9 ?. J- q0 J a1
) R5 `3 h! F2 K9 q8 ]2 F! L
# o9 X; U3 m; }5 |0 [8 ^a1 =! E9 w* K# L3 h# D
   0.66666666666667  ) ~, ?5 ]2 q4 i
3.2.3符号对象与数值对象的转换5 R5 d9 t- w6 l$ V  C
1. 将数值对象转换为符号对象! ]0 U# u. O# W5 p
sym命令可以把数值型对象转换成有理数型符号对象,vpa命令可以将数值型对象转换为任意精度的VPA型符号对象。# a/ x( Y# T- `- V: |- D8 z5 f

* b( v0 n1 [- M$ \4 _) E  U3 L/ O; S; f2. 将符号对象转换为数值对象. v- D: F9 E0 L; g3 d) Y# U; S* y; o6 l
使用double、 numeric函数可以将有理数型和VPA型符号对象转换成数值对象。8 O! I; P; F( L
语法:
& y6 B5 D1 \" E% S3 ?0 }' o, V1 o       N=double(S)              %将符号变量S转换为数值变量N
3 R! j- s0 x) o8 b* x       N=numeric(S)           %将符号变量S转换为数值变量N- |% V% ]' S" ?! ?2 {+ U& T
3.7】将符号变量file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image008.gif与数值变量进行转换。9 [- E- j+ ?% H$ I3 c" I
clear
' K! U3 L/ J! W$ v3 C& Va1=sym('2*sqrt(5)+pi')
" i7 K+ C: S# B2 x: L* k0 X/ |& `
7 `8 H  l6 Z! O( [a1 =; ]9 R. U2 ]  D4 q( J1 T
2*sqrt(5)+pi  , K5 k3 G" W5 L9 N9 T

# n" W2 @0 B# a b1=double(a1)             %转换为数值变量 4 m; A4 D5 {) }/ B6 n& Z& I& ]

% H4 x* l% H8 v. H9 nb1 =1 t, y! ]( g+ M# ?+ m
    7.6137  " E/ A) u, x5 H$ @% c# @
6 i; X' T$ I0 N% h( z
a2=vpa(sym('2*sqrt(5)+pi'),32)
" V% R( B7 K% Q0 U & I) }$ v# J4 A: n  I; O# K& o
a2 =6 I) l$ s: u' m# P2 H* A. R1 G* V% G
7.6137286085893726312809907207421  3 P- H8 a/ l9 i2 i& C( Y

; U" m0 L& i& o' R9 x8 N b2=numeric(a2)         %转换为数值变量 0 a" V# I2 y% F7 v+ n0 P9 {
: m) g) E( k% j: b9 J
b2 =
4 F; l$ i# g" s    7.6137  
: U7 i7 T' R  [9 E! S2 i! K$ b3.7】由符号变量得出数值结果。( A1 d* j- c# c% }$ p1 m3 l5 a
b3=eval(a1)   u1 b7 k  V$ d( T/ U7 w

6 ~# A9 y( `4 K0 ?! M! Sb3 =8 d- G' Q1 P: N: ]( P- m- Q
    7.6137  
2 v' N) L6 f' ~( E用“whos”命令查看变量的类型,可以看到b1、b2、b3都转换为双精度型:
8 J, {% X" T6 Z whos / T7 i' U; l: M* {, L3 @9 \
6 {" S& Z/ m4 N
      Size                   Bytes Class
+ D! J, O/ ~8 A) n/ M8 F+ c: ~ + R/ }! V' \: [- o+ |1 |
        1x1                      148 sym object+ j6 O0 B/ l2 _8 |( R
        1x1                      190 sym object
3 `) w; p) |! v; G7 ]" j1 W$ W        1x1                        8 double array
( h. ?$ f8 c! j$ {4 ]4 j1 }        1x1                        8 double array, C% \/ i* d5 h# h6 S6 }" R+ p  V
        1x1                        8 double array9 J# v0 I& D, b  O0 l# `  U' n
. I* W& j6 S$ d- y: [! e1 H: U
Grand total is 50 elements using 362 bytes  ( k$ U! o. h, {4 q0 k9 t7 N
3.3符号表达式的操作和转换
; {0 K4 ~4 P/ G: J! p0 Y: R) a' u3.3.1符号表达式中自由变量的确定
! i6 q, b/ C5 M# u. t7 r; W( k1. 自由变量的确定原则
& I* x9 ~& m3 K,MATLAB将基于以下原则选择一个自由变量:! N# u' E: V& |- Y1 K
§      小写字母i和j不能作为自由变量。. b  B" ^3 c' x/ O' G- d
§      符号表达式中如果有多个字符变量,则按照以下顺序选择自由变量:首先选择x作为自由变量;如果没有x,则选择在字母顺序中最接近x的字符变量;如果与x相同距离,则在x后面的优先。) N0 D- h5 L$ V/ K- g( f* i
§      大写字母比所有的小写字母都靠后。2 \8 v. b5 ~* \
0 l4 }( U* b; Z9 z1 ]. {! u/ S9 O
2. findsym函数
  i, R/ `4 I9 a如果不确定符号表达式中的自由符号变量,可以用findsym函数来自动确定。/ N9 l: a  _( Q$ [8 v7 x( D
语法:7 s3 A$ k4 Y% f4 X# v- L3 G
       findsym(EXPR,n)        %确定自由符号变量
" ]9 x' L6 m- L: [; `0 y说明:EXPR可以是符号表达式或符号矩阵;n为按顺序得出符号变量的个数,当n省略时,则不按顺序得出EXPR中所有的符号变量。0 ~! p/ o& b, j
3.8】得出符号表达式中的符号变量。  l; S3 ?8 ?2 o
f=sym('a*x^2+b*x+c')
' ~, v: q) G# n& n 2 X( j$ c  `& X: X7 o4 r7 S
f =
0 C$ @" V  [" Pa*x^2+b*x+c  
8 R0 e3 _- U! o! V1 }* K/ {1 } findsym(f)         %得出所有的符号变量
- q1 `) g; K% f/ P$ K9 N- d  f  r $ v# u! b4 ?- O! \. C' y' m3 x- @
ans =' n3 B# b+ I& s. B' E
a, b, c, x  ' C! b& u9 H6 B* Q! w
g=sym('sin(z)+cos(v)') [/hide]2 u! g! i  W. {6 G+ P6 |* A0 P

( n8 Q7 C5 I3 R2 V. I) L
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-5 02:28 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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