怎样提取表达式的分子和分母
(2011-12-21 15:58:51)
标签:
杂谈 |
分类: MATLAB |
本文摘自:http://www.zdh1909.com/html/matlab/6413.html
MATLAB中所有符号函数(很少特殊例外的情况,讨论于后)作用到符号表达式和符号数组,并返回符号表达式或数组。其结果有时可能看起来象一个数字,但事实上它是一个内部用字符串表示的一个符号表达式。正如我们前面所讨论的,可以运用MATLAB函数isstr来找出像似数字的表达式是否真是一个整数或是一个字符串。
m=
n=
d=
f=
n=
d=
g=
n=
d=
h=
n=
d=
在提取各部分之前,这二个表达式g和h被有理化,并变换成具有分子和分母的一个简单表达式。
>> k=sym( '
[3/2,(2*x+1)/3;4/x^2,3*x+4] ' )
k=
>> [n,d]=numden(k)
n=
d=
这个表达式k是符号数组,numden返回两个新数组n和d,其中n是分子数组,d是分母数组。如果采用s=numden(f)形式,numden仅把分子返回到变量s中。
高级运算
MATLAB7.0具有对符号表达式执行更高级运算的功能。函数compose把f(x)和g(x)复合成f(g(x))。函数finverse求表达式的函数逆,而函数symsum求表达式的符号和。
给定表达式
>> f= ' 1/(1+x^2) ' ;
%
>> g= ' sin(x) ' ;
>> h= ' 1/(1+u^2) ' ;
>> k=' sin(v) ' ;
>> compose(f,g)
ans=
>> compose(g,f)
ans=
compose也可用于含有不同独立变量的函数表达式。
>>
compose(h,k,'u','v')
ans=
表达式譬如f(x)的函数逆g(x),满足g(f(x))=x。例如, 的函数逆是ln(x),因为ln( )=x。sin(x)的函数逆是arcsin(x),函数 的函数逆是arcsin 。函数fincerse返回表达式的函数逆。如果解不是唯一就给出警告。
>> finverse( '
1/x)
ans=
>> finverse( ' x^2 '
)
Warning:
ans=
>> finverse( ' a*x+b '
)
ans=
>> finverse( ' a*b+c*d-a*z ' ), '
a ' )
ans=
symsun函数求表达式的符号和有四种形式:symsun(f)返回;symsum(f, ' s ' )返回,symsun(f,a,b)返回;最普通的形式symsun(f, ' s ' ,a,b)返回。
让我们试一试,它应返回: 。
>> symsum('x^2')
ans=
又怎么样呢?它应返回 。
>> sym('(2*n-1)^2',1,'n')
ans=
>> factor(ans)
ans=
最后让我们试一试 ,其返回应是 。
>> symsum( ' 1/(2*n-1)^2 ' ,1,inf)
ans=
标准代数运算
很多标准的代数运算可以在符号表达式上执行,函数symadd、symsub、symlnul和symdiv为加、减、乘、除两个表达式,sympow将一个表达式上升为另一个表达式的幂次。例如: 给定两个函数
>> f= ' 2*x^2+3*x-5
'
f=
>> g= ' x^2-x+7 '
g=
>> symadd(f,g)
>> symsub(f,g)
ans=
>> symmul(f,g)
ans=
>> symdiv(f,g)
ans=
>> sympow(f, ' 3*x '
)
ans=
另一个通用函数可让用户用其它的符号变量、表达式和算子创建新的表达式。symop取由逗号隔开的、多至16个参量。各个参量可为符号表达式、数值或算子(' + '、' - '、'*'、' / '、' ^ '、' ( '或' ) '),然后symop可将参量联接起来,返回最后所得的表达式.
>> f= ' cos(x)
'
f=
>> g= ' sin(2*x)
'
g=
>> symop(f,'/
ans=
所有这些运算也同样用数组参量进行。
变量替换
假设有一个以x为变量的符号表达式,并希望将变量转换为y。MATLAB提供一个工具称作subs,以便在符号表达式中进行变量替换。其格式为subs(f,new,old),其中f是符号表达式,new和old是字符、字符串或其它符号表达式。‘新’字符串将代替表达式f中各个‘旧’字符串。以下有几个例子:
>> f= ' a*x^2+b*x+c
'
f=
>> subs(f,' s ',' x
')
ans=
>> subs(f,' alpha ',' a
')
ans=
>> g=' 3*x^2+5*x-4
'
g=
>> h=subs(g,' 2 ',' x ')
h=
>> isstr(h)
ans=
变换函数
本节提出许多工具,将符号表达式变换成数值或反之。有极少数的符号函数可返回数值。然而请注意,某些符号函数能自动地将一个数字变换成它的符号表达式,如果该数字是函数许多参量中的一个。
函数sym可获取一个数字参量并将其转换为符号表达式。函数numneric的功能正好相反,它把一个符号常数(无变量符号表达式)变换为一个数值。
>> phi=' (1+sqrt(5))/2
'
phi=
>> numeric(phi)
ans=
正如第六章所介绍,函数eval将字符串传给MATLAB以便计算。所以eval是另一个可用于把符号常数变换为数字或计算表达式的函数。
>> eval_r(phi)
ans=
正如所期望那样,numeric和eval返回相同数值。
符号函数sym2poly将符号多项式变换成它的MATLAB等价系数向量。函数poly2syrn功能正好相反,并让用户指定用于所得结果表达式中的变量。
>> f=' 2*x^2+x^3-3*x+5
'
f=
>> n=sym2poly(f)
n=
>> poly2sym(n)
ans=
>> poly2sym(n,' s
')
ans=
最后一个例子表明subs如何进行替换,并力图简化表达式。因为替换结果是一个符号常数,MATLLAB可以将其简化为一个符号值。注意,因为subs是一个符号函数,所以它返回一个符号表达式。尽管看似数字,实质上是一个符号常数。为了得到数字,我们需要使用函数numeric或eval来转换字符串。
>> numeric(h)
ans=
>> isstr(ans)
ans=