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

MATLAB符号计算

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 cat12620 于 2018-11-7 16:33 编辑
/ H' W! C( q" e9 g
: X& k4 T0 I/ g& _符号计算则是可以对未赋值的符号对象(可以是常数、变量、表达式)进行运算和处理。MATLAB具有符号数学工具箱(Symbolic Math Toolbox),将符号运算结合到MATLAB的数值运算环境。符号数学工具箱是建立在Maple软件基础上的。
6 j, D( Y/ K' G8 i# u! T3.1 符号表达式的建立, M  N8 h8 T1 |( f# v% V' q
Symbolic Math Toolbox2.1版规定在进行符号计算时,首先要定义基本的符号对象然后才能进行符号运算。
2 g- a7 h/ k8 N* J6 f1 {" g( l3.1.1创建符号常量: C/ ~- b; M0 q  \
符号常量是不含变量的符号表达式,用sym命令来创建符号常量。
1 |  o* r# M! c  F, Y) `) g语法:. O  |" k6 Z+ ]4 V0 t* Y
       sym(‘常量’)              %创建符号常量
" U) `6 p& s' O; f8 L! `例如,创建符号常量,这种方式是绝对准确的符号数值表示:
2 G7 a; c* o" e! P>> a=sym('sin(2)')
9 d6 _2 c, J  _2 ^% P0 P6 ?a =6 a5 Z- k  b1 x; L+ o# T+ _$ _8 B
sin(2)
& ^6 G" W2 }8 gsym命令也可以把数值转换成某种格式的符号常量。% t- @% I+ w, C7 G8 _6 k- x
语法:
( Y2 y) ^6 d# R, V* x; s       sym(常量,参数)          %把常量按某种格式转换为符号常量5 e- J* Q2 k  u  G
说明:参数可以选择为’d’、’f’、’e’或’r’ 四种格式,也可省略,其作用如表3.1所示。$ `% t# [1 ?7 }- o! j
3.1 参数设置
参数. I7 Q' X8 W5 a
作用
* C2 Q2 {7 ]( k0 Y5 v
d# f4 E$ O- W0 @
返回最接近的十进制数值(默认位数为32位)
4 [: u9 c* {$ w) _
f
& u5 l; L) U1 x/ f2 g+ D  O6 \& s
返回该符号值最接近的浮点表示4 B5 N3 n* ^" F2 ~" R
r
( v7 [8 q8 q% q
返回该符号值最接近的有理数型(为系统默认方式),可表示为p/q、p*q、10^q、pi/q、2^q和sqrt(p)形式之一. I% @3 I. q4 I* _0 b) y( F
e- W9 [; H- q& G& x& t
返回最接近的带有机器浮点误差的有理值3 j/ R# Y7 [6 I: k; C4 R/ A. b4 s
例如,创建符号常量,这种方式是绝对准确的符号数值表示:
& e6 o. g" r. k0 ^% @ a=sym('sin(2)')
7 g7 v8 I4 j7 T 7 R. M+ U7 M4 t" s
a =0 i8 ~9 G* R/ J' }* v
sin(2)  
1 R; Z! y7 m* c! ]& C
游客,如果您要查看本帖隐藏内容请回复

. H1 v) n, P% x; P: f eig(A)                 %计算特征值 $ T- u/ s+ J) Z, O* L8 ]/ u
! g8 q+ I+ b% X: f4 t* F
ans =
' y6 M9 B5 \2 G[ 1/2*a11+1/2*a22+1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]) `6 ?4 E6 d2 o
[ 1/2*a11+1/2*a22-1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]  
$ T6 Y2 V) Z9 N7 I) a! W2 V; z , Z, X; |# D6 U1 i: _, K1 Y
3.5】符号表达式f=2x2+3x+4与g=5x+6的代数运算。
6 f; l, m" Q5 R' e# m( K3 Y f=sym('2*x^2+3*x+4')
+ T0 q5 i2 v+ g
! w/ @1 J( B7 t1 h4 S% Y  P& `f =$ Q% _) d2 B( F8 K7 B/ M4 x9 i
2*x^2+3*x+4  3 ~* T5 f$ ?8 H; ]
g=sym('5*x+6') & w$ l5 N2 }- v8 y7 O" L$ ?
8 A! f, a* M& K) o8 \1 A8 t  t
g =
9 W2 I! q3 Q8 c' H- j% V5*x+6  
3 @) y9 x. Y7 r8 f; z' k f+g                %符号表达式相加 / D* h4 ^( h! l* k/ g" a: M

, f2 B7 M- P9 t% W2 z" O7 }ans =  q& K7 g9 E0 Z% i8 l2 ?
2*x^2+8*x+10  9 `/ `' q& u7 E- g
f*g                %符号表达式相乘
# K( E: d# ~$ M8 |( E/ u
: L: d. _* Y' r$ q/ w: }; K* Kans =. S+ y6 G  E0 A1 g' b$ [
(2*x^2+3*x+4)*(5*x+6)  2 Z4 Q) H5 d! `
3.2.2符号数值任意精度控制和运算
' U% }9 x9 z# H, J1. Symbolic Math Toolbox中的算术运算方式; ^& u# b9 p  s4 j+ ?5 R! F3 r# Q
在Symbolic Math Toolbox中有三种不同的算术运算:" i6 c3 Y9 `0 o$ w1 p0 y
§      数值型:MATLAB的浮点运算。6 b# V( }7 B) e# a+ u& y& s( j
§      有理数型:Maple的精确符号运算。
( ?. h8 ^2 S& }, r) M§      VPA型:Maple的任意精度运算。
0 B" K! ^" U3 T* V2 L8 i2 |, J ( r5 M+ T$ r6 r1 c
2. 任意精度控制8 n, |) H& w* g" N& b" t
任意精度的VPA型运算可以使用digits和vpa命令来实现。
0 P+ Z& f3 n2 c+ P$ S! h$ ?语法:/ Z* }2 z+ F' z1 c: D7 o7 B* j: [4 A* ^
       digits(n)                    %设定默认的精度  ?& A3 l7 j& ~- F; _- l( t
说明:n为所期望的有效位数。digits函数可以改变默认的有效位数来改变精度,随后的每个进行Maple函数的计算都以新精度为准。当有效位数增加时,计算时间和占用的内存也增加。命令“digits”用来显示默认的有效位数,默认为32位。& g9 j7 J1 s8 _* J% e
语法:/ p' P( U; ]+ A1 [
       S=vpa(s,n)                %将s表示为n位有效位数的符号对象+ @, O( h& `& ^' X5 D% ]7 H
说明:s可以是数值对象或符号对象,但计算的结果S一定是符号对象;当参数n省略时则以给定的digits指定精度。vpa命令只对指定的符号对象s按新精度进行计算,并以同样的精度显示计算结果,但并不改变全局的digits参数。
0 b. s; c) J& O2 }' r% f& R3.6】对表达式file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image006.gif进行任意精度控制的比较。
6 j3 j% C4 n% I& C a=sym('2*sqrt(5)+pi')
7 j2 s) J% I0 K  ]# _2 c2 p
) ]' N( E1 C4 i+ g3 p. ^/ ^a =
( w# E3 a( m0 X, J! O$ r+ S6 H2*sqrt(5)+pi  
) [* E: [. R, L- O2 ?, n& x8 e  { digits      %显示默认的有效位数 7 ]1 I" X, U4 ?/ c0 Q

/ G5 X. i) W1 a( o : |" U8 f# ^% c1 ~) k4 P
Digits = 32' b, `* o6 F* ]6 ]1 q
   2 y2 J# n/ g: ]5 N& E( W
vpa(a)      %用默认的位数计算并显示
. x; q% r/ `: ~1 t: Q) m 2 y7 O( b! Q" `
ans =& l/ R' f; h; Y7 A, F
7.6137286085893726312809907207421  4 v9 z$ ~3 `4 k8 g
vpa(a,20)       %按指定的精度计算并显示 5 z$ _! }. n* W, O& w- l
0 g* m0 b) n5 W! }7 c4 l  x
ans =
3 l) @: G: J0 g4 E: ?7.6137286085893726313  9 x6 Q" M: |. E+ D( X. e, b
digits(15)      %改变默认的有效位数
/ E6 M& F; v' i" r vpa(a)      %按digits指定的精度计算并显示 # p4 N* U) u+ Y9 @/ z: ^8 U8 q

7 Y  U  u/ Z7 h- G3 mans =
! o" G) t; Z4 F) j$ b6 j" k7.61372860858937  
( X- k8 d" r  y
6 N1 n% d) w; F8 ]4 f3 B2 z3. Symbolic Math Toolbox中的三种运算方式的比较
2 v8 }# O/ b# \, t+ |3.6】用三种运算方式表达式比较2/3的结果。
% s  D- U# \( O9 ?* b' [4 O# z2 P1 d4 Ca1 =2/3      %数值型
% O# Q" Y$ M7 P8 E
% ]5 g- }- ^0 G. Ta1 =# w- k) E  j; J4 v  K, o5 f
    0.6667  9 _$ Q- ^/ o, I
a2 = sym(2/3)    %有理数型 9 C& C0 }6 W2 r  q/ v( \
/ q( s, E& P% E+ T( I
a2 =
; _- Z6 W  |4 f  n2/3  $ W! F9 Q- g/ E8 j
a3 =vpa('2/3',32) %VPA
+ s& P" w3 `7 c  _
& q" M, M: D" Qa3 =& O$ {+ A  y- u" G5 t; t, ^
.66666666666666666666666666666667  2 R+ }4 N1 B0 r4 [
程序分析:
- T% {# K/ T! \§      三种运算方式中数值型运算的速度最快。. w2 }5 d6 r4 ~, ]
§      有理数型符号运算的计算时间和占用内存是最大的,产生的结果是非常准确的。
; S( |, N* \, F; R/ F6 H8 J§      VPA型的任意精度符号运算比较灵活,可以设置任意有效精度,当保留的有效位数增加时,每次运算的时间和使用的内存也会增加。, v" b7 h$ g. w2 L. d$ d6 y5 L2 d
§      数值型变量a1结果显示的有效位数并不是存储的有效位数,在第一章中介绍显示的有效位数由“format”命令控制。如下面修改“format”命令就改变了显示的有效位数:
' J  }" `) i( ?) N format long
" L" ~7 ~% n# b* S; ~0 n a1 7 b1 a, R+ i" u4 G
  U" [! \- J7 q+ S6 {: }& f1 |
a1 =
* L: V, w1 V  G; ^6 K; O2 w   0.66666666666667  
' }7 n/ ]- h  w# Q4 Y3.2.3符号对象与数值对象的转换
4 M6 E2 n2 V3 h3 d, a1. 将数值对象转换为符号对象/ P4 ]! u; T7 q8 \9 D/ u' M2 L
sym命令可以把数值型对象转换成有理数型符号对象,vpa命令可以将数值型对象转换为任意精度的VPA型符号对象。
3 y: d" s( u9 M9 e+ {. I 7 P3 d9 @. P, r$ p9 p- _( ~6 o# T( E
2. 将符号对象转换为数值对象- ^, ]/ Q5 Z; V4 B, Z: e
使用double、 numeric函数可以将有理数型和VPA型符号对象转换成数值对象。
4 X/ g7 j/ M4 o5 [9 h语法:% x1 B* c, T+ C7 f7 J3 i' {. `
       N=double(S)              %将符号变量S转换为数值变量N
# I, c1 i/ p; q4 O0 e" p       N=numeric(S)           %将符号变量S转换为数值变量N0 K) b3 y+ n: c! B+ R: N, ?% E
3.7】将符号变量file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image008.gif与数值变量进行转换。
; ?7 r6 M; ^/ t6 M clear
1 s$ O0 C" t3 g* Z/ z5 ]a1=sym('2*sqrt(5)+pi')
0 z5 V" `" B& V$ l' L
+ ]: a0 v& T. O( z2 ga1 =
6 @8 U+ U5 W: H3 S( }& v2*sqrt(5)+pi  3 `- ], N  s& ]2 m- g, ~' v
0 {% _4 Q' ^6 B( Q$ G9 _
b1=double(a1)             %转换为数值变量
5 S9 ~( L% A5 o" [# B; @   N* I/ S' Y/ }" {  W; B0 j' L
b1 =3 ]' {. s6 l* D% v
    7.6137  
7 V# ?: s2 `4 F/ s# @
1 r- z5 M% N3 `8 q a2=vpa(sym('2*sqrt(5)+pi'),32)
) `' p8 [+ r# j, g8 O ! Q( L5 d7 c% [! _5 f2 Y
a2 =) M/ z1 Y3 [# f5 ]5 f& q$ b& O
7.6137286085893726312809907207421  ( }/ r% a* {( o0 Y! Y: a7 d# |
1 Q0 D4 ?8 ~. K
b2=numeric(a2)         %转换为数值变量
( ?1 G& c) e: \6 o% w' g- i: R
2 L8 Q5 T) I7 T; T- a, C) q  Sb2 =) \1 q# e4 M- G/ d5 W6 M  X
    7.6137  8 ]& `5 [- D3 y& O7 X( C, t
3.7】由符号变量得出数值结果。
+ u; Z% U/ ^4 ~1 k, @: U7 { b3=eval(a1) ! N3 X' N. h# |* F
$ P2 ^, D5 g$ @
b3 =- _% A$ [! [( _! i  W
    7.6137  " k+ a: Q- X, u6 ~7 U& X
用“whos”命令查看变量的类型,可以看到b1、b2、b3都转换为双精度型:
( H% r! E+ d+ a1 k whos ( @5 a$ G6 H2 b% E& I
( x1 T/ ?. v/ ~6 S: s1 w. M
      Size                   Bytes Class+ _: O8 o" R* L0 c5 {" u4 v

# r8 I; o, U; ^+ q        1x1                      148 sym object
9 Y4 f5 L% r( q8 v: Z        1x1                      190 sym object
* Y' D2 `  g1 ?* Q" u% `        1x1                        8 double array
0 u3 i9 H' [9 O1 }/ [' E        1x1                        8 double array
6 r3 I) \+ u' _9 W        1x1                        8 double array
' q; N7 S$ B. p& Q  p9 ? ! S$ S8 Z0 s0 g
Grand total is 50 elements using 362 bytes  , V, a0 T7 T% F6 o2 l: U/ t
3.3符号表达式的操作和转换
2 [$ i" g) k& f0 B) E3.3.1符号表达式中自由变量的确定
6 F( ^' @0 v/ L9 g$ U, g+ ?( [1. 自由变量的确定原则4 s& g. H1 R) A1 B* v8 x6 L
,MATLAB将基于以下原则选择一个自由变量:/ N& d( ^( ~" Z; S& |9 ]/ G2 M
§      小写字母i和j不能作为自由变量。7 p$ I( W3 S6 J7 V1 A- ?
§      符号表达式中如果有多个字符变量,则按照以下顺序选择自由变量:首先选择x作为自由变量;如果没有x,则选择在字母顺序中最接近x的字符变量;如果与x相同距离,则在x后面的优先。
( ^3 s4 G) t% e$ x# r( w$ X; d§      大写字母比所有的小写字母都靠后。
! O1 Y  E( I% T" d2 Q" T
" h: t+ w( s+ r2. findsym函数: f2 ?; ?2 q9 |" z# L* v) c
如果不确定符号表达式中的自由符号变量,可以用findsym函数来自动确定。2 O3 ?4 b) e7 ?
语法:
. u8 S5 G" C+ ^0 a/ c- _% X9 D$ F- v       findsym(EXPR,n)        %确定自由符号变量+ _! w+ e( f2 g: C2 X! K; ^
说明:EXPR可以是符号表达式或符号矩阵;n为按顺序得出符号变量的个数,当n省略时,则不按顺序得出EXPR中所有的符号变量。
( J9 k! _2 |8 {6 d. g4 T3.8】得出符号表达式中的符号变量。9 k& v3 l# f" @+ g( p* h- A, A1 l* o& l
f=sym('a*x^2+b*x+c')
! l# w1 i0 f4 \* Q) x$ h' i) W
" P/ a' U9 b% B- `4 t; Hf =
4 q8 T5 {6 ~9 S3 H* V$ ja*x^2+b*x+c  
  j  [$ R# Z- [" ?2 \* H findsym(f)         %得出所有的符号变量
- |: _' m: q6 H5 @5 H8 y4 u( [2 O 1 q2 z7 e: f& U1 U. g
ans =/ w: u3 F$ C, |% e: `3 T. [1 Q: K4 y
a, b, c, x  
$ B# m5 G3 U* `* D3 }  K3 m g=sym('sin(z)+cos(v)') [/hide]
1 ~2 ~( U6 @: U4 I1 ^+ p
% u" v) h) g' {9 _: j4 e
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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