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

MATLAB符号计算

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 cat12620 于 2018-11-7 16:33 编辑
" j" F+ |8 t' F, T8 {- q/ _. T
: ?. i& a! ^) P; f; [4 g( M. p符号计算则是可以对未赋值的符号对象(可以是常数、变量、表达式)进行运算和处理。MATLAB具有符号数学工具箱(Symbolic Math Toolbox),将符号运算结合到MATLAB的数值运算环境。符号数学工具箱是建立在Maple软件基础上的。
& Y% \: \% N, I$ j0 d; h& b3.1 符号表达式的建立
( B4 }5 r9 X  }1 \$ DSymbolic Math Toolbox2.1版规定在进行符号计算时,首先要定义基本的符号对象然后才能进行符号运算。$ g+ e0 K! Y: a' M7 f. f2 M
3.1.1创建符号常量
/ K) F# O/ P3 L% }; I符号常量是不含变量的符号表达式,用sym命令来创建符号常量。  J. W+ L' l+ R' z2 m" k3 H
语法:: N3 K$ j& z" W4 Z) p
       sym(‘常量’)              %创建符号常量
+ S5 o8 j! E" d1 {例如,创建符号常量,这种方式是绝对准确的符号数值表示:
5 S2 A7 O% @% Y+ f" T& x0 e2 f>> a=sym('sin(2)')
, N3 ?* e; q( \7 M. va =4 t1 G$ e8 G- D1 @
sin(2)
4 H. o$ W9 D9 O  csym命令也可以把数值转换成某种格式的符号常量。
) E9 S% j. B/ W. `语法:* ~/ Q% i% H3 ]/ _7 v" j% I
       sym(常量,参数)          %把常量按某种格式转换为符号常量
' [" K3 ]4 K) _& H( R说明:参数可以选择为’d’、’f’、’e’或’r’ 四种格式,也可省略,其作用如表3.1所示。
, T6 ]6 {1 X6 z
3.1 参数设置
参数/ E; Z2 m+ ]7 p3 L- `
作用; ]- b. d' q5 x- t
d
0 {9 ]! s3 m9 G
返回最接近的十进制数值(默认位数为32位)$ H' w% L& `: F7 k8 G3 J
f# J1 D4 a7 T3 v6 a8 R4 {/ C+ [
返回该符号值最接近的浮点表示6 [' ]1 e5 e. s
r
" f* |% ~! r8 l$ V
返回该符号值最接近的有理数型(为系统默认方式),可表示为p/q、p*q、10^q、pi/q、2^q和sqrt(p)形式之一; s" T6 c* c. E9 ^3 Y
e2 E6 f5 J  |9 M% g& J8 k, Y8 v
返回最接近的带有机器浮点误差的有理值
: W6 m: R1 J4 `! w9 D2 H
例如,创建符号常量,这种方式是绝对准确的符号数值表示:( u% F) o- S$ _: s- U" F; G* f" z
a=sym('sin(2)')
5 O+ |$ L) j7 V0 t9 { 8 V, L6 V" g8 G# v, e
a =- _8 E; @% k8 p" r( T
sin(2)  
  N  g1 ^4 |8 I! ^
游客,如果您要查看本帖隐藏内容请回复
' t2 \6 n" k; N& {. J) l
eig(A)                 %计算特征值
+ l+ f- {4 _3 f # {, c" z; e  U
ans =$ [# Y# u* c% v9 {$ ^0 t2 u) R1 F, E
[ 1/2*a11+1/2*a22+1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]6 A9 `1 Z1 T" f
[ 1/2*a11+1/2*a22-1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]  
$ B$ @" Y7 v9 h3 Z7 \* `9 a 6 L3 x1 F" V0 ^0 c( _! I% T
3.5】符号表达式f=2x2+3x+4与g=5x+6的代数运算。
. f1 h1 B. m" U4 V3 z$ f0 m  I f=sym('2*x^2+3*x+4') / a8 h  G" U) t' N, z

  k/ |! j5 |. r* M9 V- L1 z, `f =
% p" X2 X5 ]$ x3 s: \( \$ l3 m2*x^2+3*x+4    B0 g0 _. h2 X) d5 o& _
g=sym('5*x+6')
+ N6 z4 n4 V- ?+ _' X : d- g4 _2 s, j( D
g =. i# v/ W- I, ]& B
5*x+6  
+ n* N( `6 X3 ?, N: n f+g                %符号表达式相加
" e/ a  ~# R. g. e# M" M5 a
: R9 X+ P3 y2 aans =
, {0 h7 D- L" C/ F* |( S. s9 N2*x^2+8*x+10  
, h# }$ v$ ]9 _0 {0 R/ }! \ f*g                %符号表达式相乘
$ O6 w0 w$ g- v
3 p' D, @) ]& r, y% Pans =
8 j; @, \$ o; W. S/ _. E% n(2*x^2+3*x+4)*(5*x+6)  8 Z- T: e' G! K# C: c. ~) R: p
3.2.2符号数值任意精度控制和运算- t) v: O9 _: }, H5 Y
1. Symbolic Math Toolbox中的算术运算方式
1 Q5 l  j# }( A8 T& k0 L在Symbolic Math Toolbox中有三种不同的算术运算:5 u$ C4 N9 f, s2 w$ D& B& r% ~
§      数值型:MATLAB的浮点运算。
8 q' e) v4 D  w1 I' Q% ?4 y§      有理数型:Maple的精确符号运算。; ^( ]; ~0 c2 e6 @3 A! [
§      VPA型:Maple的任意精度运算。
* K1 \+ y4 l! I7 j- n' c& L* J% u * `) O& `8 j9 z+ J$ k% v
2. 任意精度控制
! C+ P. A, @8 p任意精度的VPA型运算可以使用digits和vpa命令来实现。" G$ i4 g8 v7 t# }3 X
语法:
( D. N( i3 A6 {4 y       digits(n)                    %设定默认的精度8 [& i# ?; y7 Z; O6 a
说明:n为所期望的有效位数。digits函数可以改变默认的有效位数来改变精度,随后的每个进行Maple函数的计算都以新精度为准。当有效位数增加时,计算时间和占用的内存也增加。命令“digits”用来显示默认的有效位数,默认为32位。, A/ z  ?/ o3 L/ ^
语法:% t- h+ C( c: k5 H0 _7 ~
       S=vpa(s,n)                %将s表示为n位有效位数的符号对象; ]2 ~; z- c4 H! t- O
说明:s可以是数值对象或符号对象,但计算的结果S一定是符号对象;当参数n省略时则以给定的digits指定精度。vpa命令只对指定的符号对象s按新精度进行计算,并以同样的精度显示计算结果,但并不改变全局的digits参数。1 H: V$ \1 d7 r* J- W
3.6】对表达式file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image006.gif进行任意精度控制的比较。
6 N( [' r# u- S0 R- Z3 o4 h a=sym('2*sqrt(5)+pi')
' T$ ~/ \. p: s' B( b
: I; t% h5 `0 \; la =
. `0 \$ A% k  R- B: X2*sqrt(5)+pi  
5 D' j) y4 j6 ?" Z" f) T, X digits      %显示默认的有效位数 ' {5 S6 [6 n- X( D6 d% L
0 V0 d: J6 |: q2 S

  a# Q5 K# O, s. B( eDigits = 32
7 k5 x5 d; `; C& l   
5 k, J; [+ i6 t& c/ O! }& f vpa(a)      %用默认的位数计算并显示
8 O5 w, A# h* F4 U
' s. I0 r7 a  Z# h- Kans =% k6 K6 `+ i4 }: F! V
7.6137286085893726312809907207421  
" L0 i3 P& B! } vpa(a,20)       %按指定的精度计算并显示
( E  C1 o4 g+ i, [7 Q8 _* v7 q6 k
) f3 g  G' V9 f. I' [- oans =9 ?% h: q" _* w. b2 L3 W
7.6137286085893726313  9 J4 l  ~; k* W; J+ I
digits(15)      %改变默认的有效位数7 `' }6 `/ Q# w# {, K' |4 z
vpa(a)      %按digits指定的精度计算并显示 + `8 S4 n( D9 J) \0 W- k

7 R- D# }! x6 G" W8 Dans =
' L5 Z( c. s7 o6 I7 A# D7.61372860858937  . M' e0 l$ ]6 q& A, x
& v) H/ D  G- ^) m: g; j2 Y
3. Symbolic Math Toolbox中的三种运算方式的比较
/ v( K: `' O5 |+ Z% h* J; [3.6】用三种运算方式表达式比较2/3的结果。1 _4 W8 Z) T* ]: X5 X, n
a1 =2/3      %数值型
+ R) S8 r' {' z0 F% s  k6 j
3 I0 t0 \; @) q* E7 Ca1 =' f- a$ s: J8 N5 x2 K2 w/ ~
    0.6667  ( |9 k, U7 o  P) f7 p" d
a2 = sym(2/3)    %有理数型
2 _7 k: r8 j1 J# G6 p& g
- }* o# g: }, M' d+ m! s' Y" \a2 =
8 j% U& f, [0 |+ P* v2/3  
2 F# @6 M# }) P8 @$ E a3 =vpa('2/3',32) %VPA
) H1 X/ ^; c5 l% o; D) H& R
$ }  @/ b! g7 N2 }+ i3 X$ fa3 =' t' G& t; ^7 \0 v7 n# d
.66666666666666666666666666666667  " O3 i% j& ^% P# `( x* d
程序分析:8 z2 J" ]; N) V0 L3 [
§      三种运算方式中数值型运算的速度最快。5 m8 n6 i- j( D. B. v* |
§      有理数型符号运算的计算时间和占用内存是最大的,产生的结果是非常准确的。
9 E) M/ o) v3 t- P  n$ ~§      VPA型的任意精度符号运算比较灵活,可以设置任意有效精度,当保留的有效位数增加时,每次运算的时间和使用的内存也会增加。
( z3 }: t/ q- {# W' t/ q" f  D§      数值型变量a1结果显示的有效位数并不是存储的有效位数,在第一章中介绍显示的有效位数由“format”命令控制。如下面修改“format”命令就改变了显示的有效位数:
& G% l+ Z7 _% Q9 o2 X format long
. W/ ^( h) E  h+ f0 _2 B a1
- g& {! s1 O* B& s$ { # L; I6 d1 N  _- E* Y5 V
a1 =
: \; r6 I- W  M( U   0.66666666666667  ; k! Q7 L5 H& n9 l9 {; u& \
3.2.3符号对象与数值对象的转换
2 w6 a" D; m: U  [, P, H- R1. 将数值对象转换为符号对象
4 Z) W) H7 D  c, lsym命令可以把数值型对象转换成有理数型符号对象,vpa命令可以将数值型对象转换为任意精度的VPA型符号对象。  [1 x* o. b; E9 `7 q! y
3 H0 @8 T( p4 v; K; y
2. 将符号对象转换为数值对象& n, P& H; k7 y8 l: M" A; c5 P6 Q
使用double、 numeric函数可以将有理数型和VPA型符号对象转换成数值对象。
; {6 p" D$ S8 }& T1 N" |语法:
0 t6 j9 k$ U0 N0 l. |7 H& ?       N=double(S)              %将符号变量S转换为数值变量N
- u5 v' k, ?* J       N=numeric(S)           %将符号变量S转换为数值变量N
, g$ M0 q5 D3 _2 s3.7】将符号变量file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image008.gif与数值变量进行转换。
, M6 t, ?( L- n$ j4 @ clear# w  a, V5 y1 q; B# o. v0 v0 A
a1=sym('2*sqrt(5)+pi')
! s! A4 O! i/ W9 `2 @3 |" k3 x
( C) ]9 |: E# n" `a1 =
- A1 m+ G) ~# s3 t2*sqrt(5)+pi  
$ w$ X) x1 X+ H
- {. ~$ Q4 e  f; p8 g/ Z& t b1=double(a1)             %转换为数值变量 # w2 P! t$ c# l
$ _: L1 F) h& ^; O5 ?4 L7 M
b1 =# Z5 |5 z0 i+ U* Y5 I( X- ]7 V
    7.6137  - F2 P- v2 O% y6 b$ y
# z$ j4 y' i- Q
a2=vpa(sym('2*sqrt(5)+pi'),32) ( H7 p' l- B4 n- l7 i3 p7 l( D+ k, w
' J* S9 k8 B! _+ s1 f6 V% W9 h
a2 =! ?+ I- p( [* U7 V% _
7.6137286085893726312809907207421  : [% K+ G; o2 X+ E4 t8 ?7 ~5 n

; o; V8 U/ N- V; Q2 w# Y3 \ b2=numeric(a2)         %转换为数值变量
, D* @6 G+ t+ k2 t8 k$ t % d' l" h5 w3 s  U
b2 =1 u/ Z5 ~) ]0 Q# m
    7.6137  * e( ^2 E) F5 |: h' `3 ^
3.7】由符号变量得出数值结果。
9 G- s/ C; A; a/ f1 L/ e b3=eval(a1)
3 T2 j5 R+ T) i: E, `: j ) V. s5 h+ U4 U0 k7 c
b3 =
* _2 t) l! p7 [# h) M    7.6137  
* W9 O/ t% u7 i+ r用“whos”命令查看变量的类型,可以看到b1、b2、b3都转换为双精度型:) j- }6 d; u" W4 j! I
whos
. m& a; L! B; x) z  T
" B& A4 Y1 l* ^' F+ I      Size                   Bytes Class  D$ E* w8 W# Y/ M" J& h/ N

5 p* `- G, K! c        1x1                      148 sym object
& D( _9 [) K' S' \, g# o        1x1                      190 sym object
; `( Y/ p& w# @6 S- \  y        1x1                        8 double array5 u/ j. B5 B& i
        1x1                        8 double array
) h( E2 \1 P# Y& r        1x1                        8 double array2 J, T) E' D; X7 p+ f1 F7 k
. ?) t, n& p6 @3 f# E2 g5 n
Grand total is 50 elements using 362 bytes  3 e( j* |9 c6 x$ s* g, X5 u- n9 X
3.3符号表达式的操作和转换; f  G4 n) t7 A6 u, s2 r
3.3.1符号表达式中自由变量的确定& [. H0 G' n4 }" p, I
1. 自由变量的确定原则
2 r- B. }: {9 B( ?2 Z8 J,MATLAB将基于以下原则选择一个自由变量:; c6 s9 j. i+ |) z
§      小写字母i和j不能作为自由变量。1 |8 R* s/ ]1 t# N+ S
§      符号表达式中如果有多个字符变量,则按照以下顺序选择自由变量:首先选择x作为自由变量;如果没有x,则选择在字母顺序中最接近x的字符变量;如果与x相同距离,则在x后面的优先。
# l5 U5 C' ?9 j! ~+ B: J§      大写字母比所有的小写字母都靠后。; W/ I' [6 Y" `5 B

- V& \! z/ i* R( [0 ^& s2. findsym函数" ^7 r& D0 @2 A$ m
如果不确定符号表达式中的自由符号变量,可以用findsym函数来自动确定。1 s% z5 |: m0 R/ c& v/ `6 s2 f
语法:4 u" d1 N. d7 G2 ?3 l8 M& ~2 u. V
       findsym(EXPR,n)        %确定自由符号变量
2 y0 v' v# X4 U说明:EXPR可以是符号表达式或符号矩阵;n为按顺序得出符号变量的个数,当n省略时,则不按顺序得出EXPR中所有的符号变量。
# J& d6 p3 E) e% y1 i5 F3.8】得出符号表达式中的符号变量。
4 Q! k3 E( o+ v/ Y% `2 G f=sym('a*x^2+b*x+c') 5 T; c1 c6 a- Y

8 ]- k+ g. u7 X/ C$ F8 [. s# [& qf =
1 O2 }; W5 i: c# T  Da*x^2+b*x+c  , Z$ g& o9 n- a: ~1 K. B
findsym(f)         %得出所有的符号变量 6 k1 c" _+ G$ B6 N) K# W, O9 c
1 n' R% I& d( u# X! B; X
ans =6 q6 Y$ `, D8 Q% W4 |" g, j! D. M
a, b, c, x  
" p& B. w3 V4 M& X; e g=sym('sin(z)+cos(v)') [/hide]
3 S* w) c" u. X' w3 Y
' i6 q3 H0 |0 W. A, G. J. O8 x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-20 14:13 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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