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

MATLAB符号计算

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 cat12620 于 2018-11-7 16:33 编辑 . ^/ q) p% h, k3 C0 r2 f
# m+ T& L# p8 [
符号计算则是可以对未赋值的符号对象(可以是常数、变量、表达式)进行运算和处理。MATLAB具有符号数学工具箱(Symbolic Math Toolbox),将符号运算结合到MATLAB的数值运算环境。符号数学工具箱是建立在Maple软件基础上的。* v9 W9 E( }$ u- h: d  U1 Q
3.1 符号表达式的建立$ m$ u% m; z, |) z& F7 V1 |
Symbolic Math Toolbox2.1版规定在进行符号计算时,首先要定义基本的符号对象然后才能进行符号运算。' B- a# q: a  z/ ~( }8 X
3.1.1创建符号常量! @6 x. ^3 j! y3 i. K  P
符号常量是不含变量的符号表达式,用sym命令来创建符号常量。3 Q' r( s6 h6 R4 Y7 D' T- I
语法:- l. T) J2 L7 I
       sym(‘常量’)              %创建符号常量
, m& H# X8 ^' E4 P! ]- z2 V例如,创建符号常量,这种方式是绝对准确的符号数值表示:
6 ~# f/ v) v* y. k>> a=sym('sin(2)')( u- E9 v9 t, `
a =
1 u; M# u8 U/ S9 m5 nsin(2). J+ a1 v3 g7 y$ g
sym命令也可以把数值转换成某种格式的符号常量。* U8 f5 }( v' r! I* b1 J
语法:
( |" i, X( Z" I3 j/ M       sym(常量,参数)          %把常量按某种格式转换为符号常量
6 o9 C. o5 t5 `说明:参数可以选择为’d’、’f’、’e’或’r’ 四种格式,也可省略,其作用如表3.1所示。
& I0 m0 t" q4 [6 x  R1 c
3.1 参数设置
参数
# j6 Z" j1 O' O+ J: h2 ?2 ]0 ~9 H, N
作用
" b. e  u6 g' S& _# u5 C
d
* D, Q$ |) y. G" L+ X
返回最接近的十进制数值(默认位数为32位)
# L* M, c5 I8 I: A3 t8 _9 A
f
4 A8 [, R" N+ h8 G- ~  F" }
返回该符号值最接近的浮点表示& E/ d3 ~* m, |" T9 t
r: r) W! F% g* y  R& }; O; H* {
返回该符号值最接近的有理数型(为系统默认方式),可表示为p/q、p*q、10^q、pi/q、2^q和sqrt(p)形式之一
: {& I( p6 a1 b# F! G, n+ M
e
8 Z  m% E" ?- U. J! D" B; Q
返回最接近的带有机器浮点误差的有理值
" k8 Y% \1 D" d  u
例如,创建符号常量,这种方式是绝对准确的符号数值表示:2 o/ h* G: g: C+ J' Z9 h3 H5 Q, {: V
a=sym('sin(2)')
; I* p8 V! N1 W  h+ Y
7 I( m) H. y& c" w2 }6 Ya =
% r8 X7 u6 A3 I" P: O4 Lsin(2)  8 q4 R& V, g& \, ~) D' E: ~
游客,如果您要查看本帖隐藏内容请回复
- U6 Q' J$ L" c4 g& Y! U
eig(A)                 %计算特征值 . d8 H& e( v: p+ H3 N9 W+ n
4 D: u+ j5 B! j" ?
ans =8 y  @/ y$ d4 Z- e) x
[ 1/2*a11+1/2*a22+1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]) e3 h- `3 ]! I' M* R. N5 R
[ 1/2*a11+1/2*a22-1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]  3 i  U. f7 s, R7 k  X

3 N* N9 B! |% J! c. O3.5】符号表达式f=2x2+3x+4与g=5x+6的代数运算。
) g' h& M4 j+ W8 i" W f=sym('2*x^2+3*x+4')
* |3 O2 r. B. M/ J; \9 r$ }
; Z, H$ s4 y) \# p1 U/ rf =
+ T8 Q% e( U9 O  x7 @# |) J2*x^2+3*x+4  
& A( N5 g/ L6 G g=sym('5*x+6') ' H  e( a% \+ I9 D# c, [: E) t

+ a( ^; g. _3 z9 [* J% Eg =
0 U5 t$ h$ P) d$ Z  o( f5*x+6  
/ X( F) Z; l0 U% g- ?. \; f: H) x f+g                %符号表达式相加 ! p; I- G/ ?& n( U

$ a0 V1 H+ r# f8 a) X) ]ans =  S$ t" I& I7 [+ G. {6 K& W/ g8 v
2*x^2+8*x+10  
, q* X# V' x" P  v- X6 b/ Z f*g                %符号表达式相乘 $ U; Z+ x% \+ b  ^8 ~, o, E7 W
- r  m( Y4 o) Q6 |% L
ans =6 _3 V5 ]" B+ w1 M
(2*x^2+3*x+4)*(5*x+6)  / V$ \, v2 {; e) f- Y1 p4 }
3.2.2符号数值任意精度控制和运算
% t4 {. N: e8 U, O& I9 j8 `1. Symbolic Math Toolbox中的算术运算方式/ y% K9 C/ P# b: X. ~& t/ f
在Symbolic Math Toolbox中有三种不同的算术运算:0 B9 m$ U. G" r
§      数值型:MATLAB的浮点运算。- Q% a2 Y  n! m" r3 P
§      有理数型:Maple的精确符号运算。# B- G- o0 ^. E. H
§      VPA型:Maple的任意精度运算。0 v) T3 D3 D$ p# _  |
( K: q! a7 ]. T0 ]. ~' x
2. 任意精度控制, T2 Y7 n* S3 {: f* P# [% s/ |- G
任意精度的VPA型运算可以使用digits和vpa命令来实现。( K- q7 f& |7 d" f- _( G
语法:" i; i' z5 A* v  G6 H: v
       digits(n)                    %设定默认的精度. j3 z: H' m9 |7 |9 N
说明:n为所期望的有效位数。digits函数可以改变默认的有效位数来改变精度,随后的每个进行Maple函数的计算都以新精度为准。当有效位数增加时,计算时间和占用的内存也增加。命令“digits”用来显示默认的有效位数,默认为32位。; m: P# k4 i7 C& r# |  b9 F
语法:
4 _9 x- j5 ~% y/ L6 {       S=vpa(s,n)                %将s表示为n位有效位数的符号对象" _+ Q# N. r  V% p, m
说明:s可以是数值对象或符号对象,但计算的结果S一定是符号对象;当参数n省略时则以给定的digits指定精度。vpa命令只对指定的符号对象s按新精度进行计算,并以同样的精度显示计算结果,但并不改变全局的digits参数。: z5 U8 ?# k7 ?, ^7 {7 E1 |) e* P+ L
3.6】对表达式file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image006.gif进行任意精度控制的比较。
0 y2 ~4 ]9 `- ? a=sym('2*sqrt(5)+pi') ) x- x+ b& a1 |; @$ G- m% V! R) I
# j2 {2 z2 ]: X8 c2 h
a =1 _: G0 x' O$ T  s5 S) y+ S
2*sqrt(5)+pi  
; x% A) y/ x" p! l$ T4 U) ?# i# z( N digits      %显示默认的有效位数
$ F( \" A6 `8 M2 N
2 d) K" V0 ]; ~9 z! L! M 2 t( D8 a& R; F& z; @
Digits = 328 ]/ W6 y4 h. X' P( W
   4 G9 I+ ^  s. J! D$ t6 c) m
vpa(a)      %用默认的位数计算并显示 7 ~# ^" m. X& [( C5 e
, N5 q, T# [. B! I/ \
ans =! k# E( W4 i! \5 @6 S8 I& [
7.6137286085893726312809907207421  
5 j4 C1 C; Z* | vpa(a,20)       %按指定的精度计算并显示 / t3 R3 P. S0 a5 ]' d
4 f, M3 l3 G9 Y- ~' b
ans =
% y) e) x1 v+ t9 `( u$ w! j7.6137286085893726313  4 C5 {2 B& U, ^, H! V& g3 \' E
digits(15)      %改变默认的有效位数8 L+ a$ }. K& A$ r
vpa(a)      %按digits指定的精度计算并显示   {5 Q' d1 A8 ~( I4 R( d

5 C) T: `7 R5 v* L5 T9 Lans =
, Z9 m( l1 D6 ]5 V7 f) v7.61372860858937  
" J3 o( e: L0 _ ' H; F4 l& c! b( j, x6 P! x
3. Symbolic Math Toolbox中的三种运算方式的比较$ k& K2 \8 p6 `. i
3.6】用三种运算方式表达式比较2/3的结果。  [" J" u( ~+ {0 q
a1 =2/3      %数值型
; x( M# y! b2 z3 p0 ^' M
* O* c) k7 t7 l7 z  x' A2 }2 Ga1 =4 S! V, z# y9 Z- Y9 e: \% y8 f
    0.6667  
% c# X! n1 a) b2 c! ]" g6 Ta2 = sym(2/3)    %有理数型
9 D' G& ~/ h8 G' N
* @, K9 y& y( R0 ja2 =
- y# Z% Y0 i$ |0 K8 s, ~2/3  
/ @% {% S- h' K  q. p# G a3 =vpa('2/3',32) %VPA
; z9 K6 [" r* h9 s9 s ) F9 D& A; M3 ~' z2 _
a3 =  S! v6 r/ }; c$ R7 l; p/ I' |9 _
.66666666666666666666666666666667  ) Z3 ^! f: K; U
程序分析:
+ C$ g% \- k5 u3 Z- K§      三种运算方式中数值型运算的速度最快。. \1 b6 O+ `# s0 F2 \" \
§      有理数型符号运算的计算时间和占用内存是最大的,产生的结果是非常准确的。) f) n" t& e+ [' u( U
§      VPA型的任意精度符号运算比较灵活,可以设置任意有效精度,当保留的有效位数增加时,每次运算的时间和使用的内存也会增加。8 a# c7 G0 f7 p! v! e/ x
§      数值型变量a1结果显示的有效位数并不是存储的有效位数,在第一章中介绍显示的有效位数由“format”命令控制。如下面修改“format”命令就改变了显示的有效位数:- ?8 D: m2 H) K# U* U5 P3 Y1 e- A, z
format long
! c- m( w6 }+ k0 r% H, q; G' c+ \ a1
4 x" _5 C" X, O) v2 X # A- M: a0 ?0 I
a1 =
* t  {4 a/ V) X: Z, \   0.66666666666667  
  |3 D% Q* M9 B( `+ {! l5 T3 s% C3.2.3符号对象与数值对象的转换$ l' `4 e2 p4 N& E% s7 G: p
1. 将数值对象转换为符号对象
  ]! U+ |3 ?) [' A; d8 gsym命令可以把数值型对象转换成有理数型符号对象,vpa命令可以将数值型对象转换为任意精度的VPA型符号对象。7 {9 U7 J- H! s  y+ r/ {

3 n- y  g  ]! T  D: C2. 将符号对象转换为数值对象
1 `/ f6 x3 A/ v$ _' G3 Y. t* I使用double、 numeric函数可以将有理数型和VPA型符号对象转换成数值对象。
. d( P. g% q# @/ P' j5 r- {: F# o$ f语法:' B2 X/ s# J/ S+ l
       N=double(S)              %将符号变量S转换为数值变量N
2 o- v" Y- [; B; z/ r       N=numeric(S)           %将符号变量S转换为数值变量N; E+ m5 g9 u$ E, D) F
3.7】将符号变量file:///C:/DOCUME~1/ADMINI~1.468/LOCALS~1/Temp/msohtml1/01/clip_image008.gif与数值变量进行转换。+ p, B" b/ [3 {/ t6 F' M8 @* l' H
clear
( @8 R: K/ G1 |a1=sym('2*sqrt(5)+pi') ; L. y% G' G% `3 k  G) d
0 ?4 Q' @, u) x( I3 B
a1 =1 C  D- v; b9 i& O
2*sqrt(5)+pi  
" y# O1 l! f" N1 o9 T! s
9 H! x) [9 e7 n: R1 h" ` b1=double(a1)             %转换为数值变量 $ H) B( w6 L, S. Q) y) h+ D
2 J# w) v( \+ N" k6 D8 f( F: y
b1 =
/ w0 T/ N! o8 @# O9 G  W    7.6137  
. o/ c: ^4 ^- r1 v0 \- ] ) l4 K# J" y3 q9 T
a2=vpa(sym('2*sqrt(5)+pi'),32) ( T- L0 ~* e/ j4 q

6 ~+ h7 w7 y4 t; X& a6 oa2 =
/ H6 k+ u0 w8 x; t) k. a0 @; P1 \7.6137286085893726312809907207421  
3 X) F* n0 ]* j/ Z# v: H 8 K" a7 a/ S, e5 J7 ?- g
b2=numeric(a2)         %转换为数值变量
, a/ \: [: T8 p/ ^
" s% Y6 a- Y# f& M4 m! z% w0 x% gb2 =& M! ~# W& K4 U  X: G
    7.6137  
! f4 Y# V; Y% x+ N- t3.7】由符号变量得出数值结果。& H4 X) n; i9 D4 H+ ?
b3=eval(a1)
; ?# L; i; k" n+ e
) A% g* q1 o) f8 E' `( r; Kb3 =& z% o# x! b; |* {
    7.6137  , L9 E( s' t. A4 }) q
用“whos”命令查看变量的类型,可以看到b1、b2、b3都转换为双精度型:1 h& C3 e! ~" q3 J8 T
whos
' \- i) j. n( F' ]! O+ S. R9 c) s $ ~6 L1 R* @) s3 t. T
      Size                   Bytes Class
- d8 W0 E0 A. G2 s% k
8 D" |5 @$ [6 E7 Q        1x1                      148 sym object1 G0 D5 F5 |; |8 e
        1x1                      190 sym object
+ r6 P' H  Y+ }# c! T9 B/ _; T4 @        1x1                        8 double array4 }1 b  r3 d' V
        1x1                        8 double array
2 |( V$ f* X4 u5 @3 K        1x1                        8 double array4 x9 f, Y( t& t; o

) f* C+ l0 y9 TGrand total is 50 elements using 362 bytes  + M. Q! H7 q( L. Y! ?: Z/ Q" }
3.3符号表达式的操作和转换7 r- d+ v1 i$ x9 q
3.3.1符号表达式中自由变量的确定
% }0 R/ j% }; ?8 [1. 自由变量的确定原则
; s: g& P( c" H: G- ?( o2 ~,MATLAB将基于以下原则选择一个自由变量:+ i' e, p; @, h
§      小写字母i和j不能作为自由变量。( n0 k0 L2 P6 u
§      符号表达式中如果有多个字符变量,则按照以下顺序选择自由变量:首先选择x作为自由变量;如果没有x,则选择在字母顺序中最接近x的字符变量;如果与x相同距离,则在x后面的优先。
& b: p: Z2 l3 j§      大写字母比所有的小写字母都靠后。
! q5 h" i- w& g8 h 0 Q, }/ N2 z! e* ^! `: ]5 {
2. findsym函数
* H0 v, @2 s+ ]. {: S) T- x3 K  \如果不确定符号表达式中的自由符号变量,可以用findsym函数来自动确定。
( D* K: n- I' Y2 }语法:7 S' f( j' s; H
       findsym(EXPR,n)        %确定自由符号变量
8 A) o6 ^1 H- e说明:EXPR可以是符号表达式或符号矩阵;n为按顺序得出符号变量的个数,当n省略时,则不按顺序得出EXPR中所有的符号变量。
( ^& ?7 c  c# A+ I6 ?3.8】得出符号表达式中的符号变量。
5 e4 w2 z# E! |) v2 @6 X f=sym('a*x^2+b*x+c')
' I' M) h# v- r1 `1 W( L8 Q6 }1 x
5 e* y7 N: x1 if =3 m4 p) v- f! x( V3 @0 J! A. g
a*x^2+b*x+c  
  k6 G) g, }! k* M* s* ` findsym(f)         %得出所有的符号变量
; W  z; J, e3 }5 }: `
) q# \. M7 h. ?ans =
; c3 I9 u& J; ?; H# ha, b, c, x  
# Y- Z- J& @! P* P! n g=sym('sin(z)+cos(v)') [/hide], g1 H+ a9 J/ C3 W
5 C& q7 e% ~, n/ \" j; D( S: w$ R
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-9 23:27 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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