EDA365电子论坛网

标题: Matlab 符号表达式和符号函数的操作 [打印本页]

作者: relchhiclty    时间: 2019-1-7 06:00
标题: Matlab 符号表达式和符号函数的操作
Matlab 符号表达式和符号函数的操作% h! b% J  S7 L; L

5 o* \2 R/ {+ r0 U2 o6.2 符号表达式和符号函数的操作
' x/ _/ t* Q5 u1 V9 k2 [6.2.1 符号表达式的操作! r+ H: _% i0 b9 W- ^3 k4 N( T5 P

' J  A7 J0 t$ c7 E3 X8 W8 {$ _【 * 例 6.2.1 -1 】按不同的方式合并同幂项。
  a8 ^/ A- m5 T7 K: DEXPR=sym('(x^2+x*exp(-t)+1)*(x+exp(-t))');
2 l* o2 v4 ~" C" m4 a4 ]2 c3 E1 a: Mexpr1=collect(EXPR) % 默认合并 x 同幂项系数
1 ?0 M6 h: ?1 }" Mexpr2=collect(EXPR,'exp(-t)') % 合并 exp(-t) 同幂项系数& y6 n5 e7 i( `/ A
expr1 =
6 U* W+ m( U: ?3 c( e. q. F- p" Nx^3+2*exp(-t)*x^2+(1+exp(-t)^2)*x+exp(-t)
2 ?8 O/ n. h: d: X" G" ^# K( t3 Bexpr2 =
6 {& `0 k; r: ]1 ^, n0 p6 n" |x*exp(-t)^2+(2*x^2+1)*exp(-t)+(x^2+1)*x, [  c4 L) X% O# }  Z

8 b: e) E0 w; X% L* }) w, M- p【 * 例 6.2.1 -2 】 factor 指令的使用
4 |7 g/ q1 i* P(1)除 x 外不含其它自由变量的情况8 [& `$ `7 j- w1 V: `9 v. S! F( V6 I
syms a x;f1=x^4-5*x^3+5*x^2+5*x-6;factor(f1)
/ N9 @: a# {# `: g1 \) S( H. R% E7 Z4 cans =
6 R6 G' A! _0 a- P4 o7 Y! D- D(x-1)*(x-2)*(x-3)*(x+1)( b8 T% t" F! k$ V

: Z% u6 ^% M$ ?8 P(2)含其它自由变量的情况之一
; \0 s& P6 ^" k  E! [f2=x^2-a^2;factor(f2)
. X( k" W3 ^. _8 T# S6 a( {. Z' |( U6 j7 Z( A5 ?- M( N
ans = . A. |7 ~- z9 q: B* s: Q: E
(x-a)*(x+a)
1 Y; d' H+ V$ K4 H# k3 ?+ `0 H- w: P7 J! z" e; @  [6 i
(3)对正整数的质数分解" a3 c- q% k+ n( x" `' Q
factor(1025)   X) a0 V% D- C& _- A) m
ans =
% g# g$ e$ ]3 u/ V2 ^  ]5 5 41
7 a9 D2 Q( L) A) o& _& `2 ?5 U( Z. O' \7 ^- p
【 * 例 6.2.1 -3 】对多项式进行嵌套型分解$ }* j, r" A: P6 K( f
clear;syms a x;f1=x^4-5*x^3+5*x^2+5*x-6;horner(f1) " e9 E$ A3 p9 W8 T( j/ s* \
ans =
; S- }8 U, c  |6 X+ X1 B-6+(5+(5+(-5+x)*x)*x)*x( j) S( A" F* E2 D% }2 F
  ]5 P. ^4 J8 a- l) C
【 * 例 6.2.1 -4 】写出矩阵各元素的分子、分母多项式
* h; k; {; L" J5 |3 G(1)求矩阵各元素的分子、分母多项式
+ \: j: N# Q2 N, ^" y; f" V6 u. Osyms x;A=[3/2,(x^2+3)/(2*x-1)+3*x/(x-1);4/x^2,3*x+4]; & ?7 P* x8 |) p5 ]+ r, i: b# H
[n,d]=numden(A)
/ r1 W' n4 _1 Ypretty(simplify(A)) % 为方便阅读而设。请用 simple 代替 simplify 试试。 <3>/ T4 v9 I7 ~2 ]+ t$ c
n =
- P' z+ |9 V  h% D% a3 S3 V& e[ 3, x^3+5*x^2-3]6 ?) O, G) r7 G/ L
[ 4, 3*x+4]
9 `4 u9 u0 _% [' X/ G0 s: h7 u+ Zd =- C. V8 [6 S9 p( e4 i  l
[ 2, (2*x-1)*(x-1)]
0 v4 u% D4 _' s1 e' {[ x^2, 1]5 Z: s9 Y7 x3 C1 E# [% W
[ 3 2 ]2 y$ L0 `9 A' A; ]* G! V
[ x + 5 x - 3 ]
2 d4 G9 t' \* b5 w[3/2 -----------------]) x$ {5 y7 H, e" F$ N# i6 x

9 m1 E1 F1 _* u
$ B# o( P- I, h& r" O  x4 f' d1 n, w


8 [$ c- J5 Z/ W3 v: L& n[ (2 x - 1) (x - 1)]
( {) |: r% I! e0 R& I5 o[ ]
; {: U5 n* i! ^2 k1 F% @0 |9 I[ 4 ]
5 E* L5 A% R' b, a$ h[---- 3 x + 4 ]
# F- g" Z; Q4 ~% Q+ c[ 2 ]
& C  L- U6 I% s: B  w[ x ]2 E3 b1 }" y9 Q/ R7 d# p6 B

. O0 W6 G7 z; e0 a(2)请读者自己运行以下指令,显示结果应与指令 <3> 相同。
  O9 s& B. L7 B5 W4 B/ _: P' _8 Dpretty(simplify(n./d)) % 注意这里用的是“数组除”,而不是“矩阵除”
( N8 @6 N3 D& O9 r[ 3 2 ]
- q' e  P+ n! |7 _# X* E8 H, A[ x + 5 x - 3 ]
- f, I, r. G6 d6 `/ O' g[3/2 -----------------]
& _! O7 E: v- t+ M& O; U[ (2 x - 1) (x - 1)]) ?% r: k( J  u0 J4 x+ L# Z
[ ]
$ J: B4 i! k8 W; X3 E! {# }& D[ 4 ]
/ M* T& n: ?5 z' l& R+ d; \4 m0 @2 j- G[---- 3 x + 4 ]. h; B6 d. W+ T" c2 T$ F
[ 2 ], [6 G. n( q6 e0 z( ]% Z2 G2 g
[ x ]
) q: M% X2 A+ ^* B) U; b9 m' y( E
2 U9 q0 ?, \4 M' w0 C( O3 ~/ m$ e( Z' H! ~
【 * 例 6.2.1 -5 】简化 4 k9 x; _# C' ]9 J, ]3 h& U
(1)运用 simplify 简化(即使多次运用 simplify 也不能得到最简形式。)
9 W& F5 s! G) q; [# Y- d/ c1 G! ysyms x;f=(1/x^3+6/x^2+12/x+8)^(1/3);
6 Q5 g' I. L" ^' S计算机教程Matlab 符号表达式和符号函数的操作来自www.itwen.comIT WEN计算机教程网 & q# x( d- D3 I% U9 {9 g

8 V3 j( l  w$ M! F# l6 ?sfy1=simplify(f),sfy2=simplify(sfy1)
; h: m" u* C) M2 g# _7 ~+ Rsfy1 = : v6 Y5 V& J7 q# c$ |- D$ f" Q& w8 u
((2*x+1)^3/x^3)^(1/3)
- e6 H7 v+ J& Vsfy2 =7 A) v0 \% s' Z9 n0 f% i9 l
((2*x+1)^3/x^3)^(1/3)1 b  h. [7 S* I7 r
2 m- Y5 j: R4 y! N# V( N  D
(2)运用 simple 简化1 U) W5 O3 v# Z' {) I) |
g1=simple(f),g2=simple(g1)
$ p1 X, u! R5 K) H& W  bg1 =
6 ^" l% m" A, ~$ Y$ F: ?(2*x+1)/x2 w7 g9 M8 D8 l( ~; B6 N! ?
g2 =
" v" H, Z; r  Y4 h% U9 z" u- a' R5 e2+1/x$ z* v- z' Z9 B

8 [) H6 h; T/ H* ?2 {& ?8 b; B
' i7 \$ J* d* ~2 @- g$ @9 {( p% O* `【 * 例 6.2.1 -6 】简化
3 s) E0 \' r7 h1 Wsyms x;ff=cos(x)+sqrt(-sin(x)^2); ' A& B9 ?) L) v3 [( Z& m
ssfy1=simplify(ff),ssfy2=simplify(ssfy1)9 l9 T) x  y3 X, W. [9 J/ E7 t
ssfy1 = , ^4 J1 l3 z# g6 g! I
cos(x)+(-sin(x)^2)^(1/2)
% I! E* p+ y8 N' G  k$ d. Rssfy2 =) v3 z  v7 [; }" G
cos(x)+(-sin(x)^2)^(1/2)3 `$ r8 i. i7 x( G
gg1=simple(ff),gg2=simple(gg1)
6 B! |" {0 i) w- W5 mgg1 = 5 g& [& ?/ `  x% d9 q) F% V
cos(x)+i*sin(x)
4 v8 n2 c: j* ~1 c& V* {- Bgg2 =& V$ G* }5 V( E( W
exp(i*x)' S: \2 [- w6 h) e

! |- e# O. R8 E% L+ }, r* w2 @6 D, L
6.2.2 符号函数的求反和复合


  L# e% K( h. L9 r! P/ `

  

/ R5 K5 J7 F% j/ N. c" a0 J

5 `; t7 k) P( a

) R) N, A3 {9 W, L* I% A* H【 * 例 6.2.2 -1 】求 的反函数
: R) m: ^! ~4 ~9 L0 P5 _syms x;f=x^2;g=finverse(f)
" A; w  w! U, PWarning: finverse(x^2) is not unique.
2 a& D$ G! Q, `9 }% y> In E:\MAT53\toolbox\symbolic\@sym\finverse.m at line 43, q$ \/ F2 \  D8 r8 E! q5 C* e
g =
$ @3 Q  |& v2 ^- Z: n. cx^(1/2) : G; ?% F* k. A% N6 v; |% w3 p
4 n) o7 q2 w  R) g/ g! C6 f
fg=simple(compose(g,f)) % 验算 g(f(x)) 是否等于 x+ S8 t. G9 H5 ~* a! v
fg =
5 T2 o  A) N% q8 z9 c* A/ @5 qx
& b- J+ C! h' e" {' X
, z+ k7 I3 x# ^3 J3 @: Z【 * 例 6.2.2 -2 】求 的复合函数
1 u- O( ~. O9 p6 J  ^, h3 N4 K1 Q$ A" u! n
(1)自变量由机器确定6 x6 @. H7 \" Q' r: v0 U
syms x y u fai t;f=x/(1+u^2);g=cos(y+fai);fg1=compose(f,g) 5 P* Z# f9 N) u% ]( R0 y, N2 L
fg1 = ! Q7 z3 `! c$ `- u
cos(y+fai)/(1+u^2)& L3 H# P. K+ W! Y5 v! O- a
" @% x3 X/ D/ L6 M8 M
(2)指定自变量4 T5 \0 R7 e1 L- k
# C9 h8 y$ v, l1 {( X5 X* x
fg2=compose(f,g,u,fai,t) 8 X# j1 c+ T! |( y/ [6 |
fg2 =
, b0 }- o( d& |' vx/(1+cos(y+t)^2)
: k' G) @% W) z; @5 [  Q
# F& j  h# p% \) E
8 B! }$ z$ f4 Z4 h8 A. U3 u6.2.3 置换及其应用
% f1 `' x. S: \3 W6.2.3.1 自动执行的子表达式置换指令2 J/ ~2 r5 Y4 `9 @6 a2 P" }

: f- ^9 W" T- L5 k【 * 例 6.2.3 .1-1 】演示子表达式的置换表示。0 m8 d) S7 ^) B
clear all,syms a b c d W;[V,D]=eig([a b;c d]); 5 r- {, j0 Q4 [/ @  k) R
[RVD,W]=subexpr([V;D],W) %<2>" B* P8 \7 a' z8 V+ D
RVD =4 b8 [+ H( m" c7 s$ B. O, p; P
[ -(1/2*d-1/2*a-1/2*W)/c, -(1/2*d-1/2*a+1/2*W)/c]9 _, D9 x# D+ c
[ 1, 1]/ V6 [; s4 ^( H* S
[ 1/2*d+1/2*a+1/2*W, 0]8 j9 T1 e& C) _- V6 C
[ 0, 1/2*d+1/2*a-1/2*W]8 A& G* A  \4 c3 E. {6 q) \2 l4 c
W =
) z; c* w# s" G0 X% i5 i(d^2-2*a*d+a^2+4*b*c)^(1/2)
0 l# z9 Y, }6 N6 q
, q, [' r8 D4 S; H$ U% Z: U0 y* M: o  T( |! ?) r  Q
6.2.3.2 通用置换指令
% Y$ L, e& Z+ R0 D! Q% F0 g( L8 b' d" g/ v3 M
【 * 例 6.2.3 .2-1 】用简单算例演示 subs 的置换规则。4 n6 Z+ E; d0 a2 Y: ^
(1)产生符号函数
8 G: g9 n3 L+ Z) ^$ u, I5 e( b$ Jsyms a x;f=a*sin(x)+5; - w% M- ~, }" C0 q# k
+ \2 e. U2 D4 R9 j
(2)符号变量置换& J& j# G9 K" T9 D6 j
f1=subs(f,'sin(x)',sym('y')) %<2>   


" x! c! a- I* r4 N


8 B, U+ D6 w8 @( o; a4 Rf1 = : d0 f9 @* o2 `
a*y+55 D& [3 E) E8 _, z3 c# |
5 ~% [" L' F* m- o# h
(3)符号常数置换
7 j( u1 A& [* g  U1 \+ nf2=subs(f,{a,x},{2,sym(pi/3)}) %<3>
& b" W  \' U% Y) \f2 = 8 S  k( ]9 f4 S: z
3^(1/2)+5  q3 D: I6 x% O) S
; b# |& \0 A( P2 {, }
(4)双精度数值置换(即所有自由变量被双精度数值取代。取 a=2 , x=pi/3 )1 o2 z2 ?* `% x2 _: H) ^3 y
f3=subs(f,{a,x},{2,pi/3}) %<4> ) ?' X3 h% {0 m, n4 a$ ~
f3 = 7 |1 z) N% n! W9 K
6.7321 + s, A6 n0 k6 }. C7 D

7 F2 i8 Y1 T+ H; U, ^5 Q: o5 V(5)数值数组置换之一(取 a=2 , x=0:pi/6:pi )
" v/ q3 @8 ?, C$ r1 h* ^' _1 Kf4=subs(subs(f,a,2),x,0:pi/6:pi) %<5> 7 @4 {6 y0 u2 X; ?- B% q
f4 = 6 e8 k1 P& w# D2 z4 h# w
5.0000 6.0000 6.7321 7.0000 6.7321 6.0000 5.0000 # J; ~0 q  w& F& P0 x+ o

$ O# v- D, t; z* ]6 ]( c3 }(6)数值数组置换之二(取 a=0:6 , x=0:pi/6:pi ): T3 W2 J. C2 x! ]
f5=subs(f,{a,x},{0:6,0:pi/6:pi}) %<6>
2 u4 h& L& ]) p- C2 K) j3 `f5 = 8 y& s7 F2 {0 f6 f7 M: [( i5 I
5.0000 5.5000 6.7321 8.0000 8.4641 7.5000 5.0000
1 a8 _' \5 I8 r) |; y; w! |6 M1 m6 p" V! Q8 t$ [  I5 z4 h  k

: l8 j7 A$ M9 _: S6.2.4 符号数值精度控制和任意精度计算% q% ~- D6 u7 }
6.2.4.2 任意精度的符号数值
/ z6 C6 p! k$ z# X3 I9 ^! L. w/ E( t8 v: s9 s) K- f
【 * 例 6.2.4 .2-1 】指令使用演示。5 K1 |' n! M. H. k8 ]+ K6 ~/ |
digits % 显示省缺符号数值计算相对精度
$ J6 }$ c3 ]( ]; H) m* ~9 SDigits = 32 $ r2 K2 x. }; _( [; o6 v
p0=sym('(1+sqrt(5))/2'); %p0 为 (1+sqrt(5))/2 准确值
. o" E& r- c( Q1 Y% f3 `p1=sym((1+sqrt(5))/2) %p1 是 (1+sqrt(5))/2 在数值环境下的近似值
, c, C9 }6 P7 b3 U/ R1 ze01=vpa(abs(p0-p1)) % 在符号环境 32 位省缺精度下,观察 p0, p1 间误差7 k) p& U. I' r# Z
p1 =
4 y8 }. B. v3 J4 \5 N7286977268806824*2^(-52)# @" O3 ?! P5 a  {1 ]
e01 =
3 b2 @! F2 L8 A, k- L2 Z.543211520368250e-16
/ y, F6 b1 n7 N( R) bp2=vpa(p0) %p2 是 p0 在 32 位相对精度下的近似
9 }9 S, `3 }+ `. a( Ie02=vpa(abs(p0-p2),64) % 在 64 位相对精度下,观察 p0, p2 间的误差
! m7 f4 i; g0 m; [p2 = 1 w, l! F0 u3 {/ h
1.6180339887498948482045868343657
1 [$ B$ F9 p1 I- d) ue02 =
1 s9 x5 ^6 L' f* `6 N3 Z.61882279690820194237137864551377e-31
7 [# e5 }% I7 G' Ndigits % 验证 vpa 变精度计算不影响全局的符号数值计算精度
, q  K% @, `- N1 XDigits = 32 " ~# m2 n/ p4 w" U/ M) |. P# q" z# [; M

+ J8 C9 g7 U  Q& r; ^3 R& |  _9 _
! j( v+ F/ D$ i6.2.5 符号对象与其它数据对象间的转换* @9 N4 M4 Z3 [0 p

0 ~) ?/ q2 |3 ]* h' o- Y# T

+ R: K6 g9 J3 E' D; a6 U
【 * 例 6.2.5 -1 】符号、数值间的转换。
' C8 q+ T6 D4 X: Q* z" `phi=sym((1+sqrt(5))/2) % 把数值对象转换成符号常数0 z, p+ k7 t% n. U) c
double(phi) % 把符号常数转换为双精度存储的数值
! D* [) ], y" {5 ?5 N3 D5 l$ Aphi =
$ a2 P4 ^! y+ r- R5 a- X6 l7286977268806824*2^(-52)
9 M% W* t  e% ?9 l% oans =
4 @$ _; |  w* {: Z1.6180% _. o+ m  @7 `% Q! J
+ \0 e* O+ @5 o
【 * 例 6.2.5 -2 】各种多项式表示形式之间的转换
, O7 |  r' v# ^# Ssyms x;f=x^3+2*x^2-3*x+5; % 生成符号多项式, @: a  L1 N: B! E  ^- E4 u- A- i
sy2p=sym2poly(f) % 由符号多项式产生数值系数行向量# R; D- h8 ?8 |
p2st=poly2str(sy2p,'x') % 把系数行向量变成易读表示式
2 {+ F& H) F% n+ w( v2 h  Ap2sy=poly2sym(sy2p) % 把数值系数行向量再转换为符号多项式
& d+ u; Y2 {$ \) T. O* @7 f# E* L. bpretty(f,'x') % 显示符号多项式的易读表示形式- |  n9 R  f7 C& t1 G
sy2p = . A7 L& a" z: N0 b, f3 O
1 2 -3 5# D( r$ J6 ^2 q2 ?" s
p2st =4 A, a- k5 W: b8 |2 W3 o& ?9 _. B
x^3 + 2 x^2 - 3 x + 5
1 s) Z6 y, D' _, ?/ A' @p2sy =
( D& a( W' S2 d7 T: t9 w# X% Px^3+2*x^2-3*x+5
  G1 T8 g) Y% v8 C! z3 26 A4 M% t5 q; D: b: ^1 }# B
x + 2 x - 3 x + 5


8 b! F7 R8 p( `$ n* z2 a; I
) u5 d" l6 K6 C+ M4 k
作者: xuzwg    时间: 2019-1-7 17:02
谢谢分享
作者: gaoxings    时间: 2019-1-8 11:12
这个不错




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2