matlab的符号计算
符号数学工具箱是操作和解决符号表达式的符号数学工具箱(函数)集合,有复合、简化、微分、积分以及求解代数方程和微分方程的工具。另外还有一些用于线性代数的工具,求解逆、行列式、正则型式的精确结果,出符号矩阵的特征值而无由数值计算引入的误差。工具箱还支持可变精度运算,即支持符号计算并能以指定的精度返回结果。
符号数学工具箱中的工具是建立在功能强大的称作Maple软件的基础上。它最初是由加拿大的滑铁卢(Waterloo)大学开发的。当要求MATLAB进行符号运算时,它就请求Maple去计算并将结果返回到MATLAB命令窗口。因此,在MATLAB中的符号运算是MATLAB处理数字的自然扩展。
8.1 符号表达式
符号表达式是代表数字、函数、算子和变量的MATLAB字符串,或字符串数组。不要求变量有预先确定的值,符号方程式是含有等号的符号表达式。符号算术是使用已知的规则和给定符号恒等式求解这些符号方程的实践,它与代数和微积分所学到的求解方法完全一样。符号矩阵是数组,其元素是符号表达式。MATLAB在内部把符号表达式表示成字符串,以与数字变量或运算相区别;否则,这些符号表达式几乎完全象基本的MATLAB命令。
下表列有几则符号表达式例子以及MATLAB等效表达式。
符号表达式 MATLAB表达式
'1/(2*x^n)'
y='1/sqrt(2*x)'
'cos(x^2)-sin(2*x)'
M=sym('[a,b;c,d]')
f=int('x^3/sqrt(1-x)','a','b')
MATLAB符号函数使我们能用多种方法来操作符号表达式,比如,
>>diff('cos(x)') %differentiate cos(x) with respect to x
ans=-sin(x)
>>M=sym('[a,b;c,d]') %create a symbolic matrix M
M=
[a,b]
[c,d]
>>determ(M) %find the determinant of the symbolic matrix M
ans=a*d-b*c
要注意的是,以上第一例的符号表达式是用单引号以隐含方式定义的。它告诉MATLAB 'cos(x)'是一个字符串并说明diff('cosx')是一个符号表达式而不是数字表达式;然而在第二个例子中,用函数sym显式地告诉MATLAB M=sym('[a,b;c,d]')是一符号表达式。在MATLAB可以自己确定变量类型的场合下,通常不要求显式函数sym。
MATLAB中函数function argument形式是与function( 'argument ')等价的。其中,function是一个函数,argument是一字符串。
例如,diff cos(x)和diff( 'cos(x) ')两者都意味diff (sym 'cos(x) ')。但
第一种形式显然更便于输入。然而,很多时候sym是必要的。在上述的第二个例子中,
>>M=[a,b;c,d] % M is a numeric matrix using value of a through d Uundefine function or variable a.
>>M= '[a,b;c,d] ' % M is a character string, but not a symbolic matrix M=[a,b;c,d]
>>M=sym('[a,b;c,d]') %M is a symbolic matrix
M= [a,b]
[c,d]
M以三种方式定义:数字型(如果a、b、c、d已预先确定)、字符串型或符号矩阵型。许多符号函数非常巧妙能够自动将字符转变为符号表达式。但在某些情况下,尤其是建立符号数组时,必须用函数sym,特别地将字符串变为符号表达式。隐含形式,例如diff cos(x),对于那些不需要参考先前结果的简单任务,最有用。但是最简单形式(无引号)要求一个参量,它是一个单字符的字符串、不包含插入的空格。
>>diff x^2+3*x+5 %the argument is equivalent to 'x^2+3*x+5 '
ans=2*x+3
>> diff x^2 + 3*x + 5 % spaces break the argument into separate strings Error using==>diff
Too manyinput arguments
无变量的符号表达式称作符号常量。符号常量常常与整数很难区别,例如
>>f=symop('(3*4-2)/5+1') %reduce a symbolic constant to its simplest form f=3
>>isstr(f) %is f a string? (1=yes,0=no)
ans=1
在这个例子中,f代表符号常数'3';而不是数字3。MATLAB是以字符ASCII码形式来存储字符串的。所以,如果对字符串进行数字运算,则在运算中,采用各字符串的ASCII码值。因为数字51是字符 ' 3 ' 的ASCII表示,所以f加1
在数值上不能得到期望的结果
>>f+1
ans=52
当字符表达式中含有多于一个的变量时,只有一个变量是独立变量。如果不告诉MATLAB哪一个变量是
独立变量,MATLAB将基于以下规则选择一个:
在符号表达式中缺省的独立变量是唯一的,除去i和j的小写字母,不是单词的一部分。如果没有这种字母,就选择x作为独立变量。如字符不是唯一的,就选择在字母顺序中最接近x的字母。如果有相连的字母,就选择在字母表中较后的那一个。
缺省的独立变量,有时称作自由变量,在表达式'1/(5+cos(x))'中是' x';在
'3*y+z'中是'y';在'a+sin(t)'是't'。在表式' sin(pi/4)-cos(3/5) '中自由符号变量是'x ',因为此式是一个符号常数无符号变量。可利用函数symvar询问MATLAB在符号表达式中哪一个变量它认为是独立变量。
>>symvar('a*x+y*) %find the default symbolic variable
ans=x
>>symvar('a*t+s/(u+3)') %u is the closest to 'x'
ans=u
>>symvar('sin(omega)') % 'omega' is not a singlee character。
ans=x
>>symvar('3*i+4*j') %i and j are equel to sqrt(-1)
ans=x
>>symvar('y+3*s','t') % find the variable closest to t rather than x ans=s
如果利用规则symvar不能到一个缺省独立变量,它便假定无独立变量并返回x。这一结论对含有由多个字母组成的变量,如:alpha或s2的表达式,或不含变量的符号常数均成立。如果需要,绝大多数命令都使用用户选项以指定独立变量。
>>diff('x^n') %differentiate with respect to the default variable 'x' ans=x^n*n/x
>> diff('x^n','n') % differentiate x^n with respect to 'n'
ans=x^n*log(x)
>>diff('sin(omega)') %differentiate using the default variables (x) ans=0
>>diff( 'sin(omega)','omega') %specify the independent variable
ans=cos(omega)
8.2 符号表达式运算
一旦创建了一个符号表达式,或许想以某些方式改变它;也许希望提取表达式的一部分,合并两个表达式或求得表达的数值。有许多符号工具可以帮助完成这些任务。
提取分子和分母:
如果表达式是一个有理分式(两个多项式之比),或是可以展开为有理分式(包括哪些分母为1的分式),可利用numden来提取分子或分母。例如,给定如下的表达式:
在必要时,numden将表达式合并、有理化并返回所得的分子和分母。进行这项
运算的MATLAB语句是:
>>m='x^2' %create a simple expression
m=x^2
>>[n,d]=numden(m) %extract the numerator and denominator
n=x^2
d=1
>>f='a*x^2/(b-x)' %create a rational expression
f=a*x^2/(b-x)
>>[n,d]=numden(f) %extract the numerator and denominator
n=a*x^2
d=b-x
前二个表达式得到期望结果。
>>g='3/2*x^2+2/3*x-3/5' %rationalize and extract the parts
g=3/2*x^2+2/3*x-3/5
>>[n,d]=numden(g)
n=45*x^2+20*x-18
d=30
>>h='(x^2+3)/(2*x-1)+3*x/(x-1)' %the sum of rational polynomials
h=(x^2+3)/(2*x-1)+3*x/(x-1)
>>[n,d]=numden(h) %rationalize and extract
n=x^3+5*x^2-3
d=(2*x-1)*(x-1)
在提取各部分之前,这二个表达式g和h被有理化,并变换成具有分子和分母的一个简单表达式。
>>k=sym('[3/2,(2*x+1)/3;4/x^2,3*x+4]') % try a symbolic array
k=[ 3/2,(2*x+1)/3]
[4/x^2, 3*x+4]
>>[n,d]=numden(k)
n=[3, 2*x+1]
[4, 3*x+4]
d=[ 2,3]
[x^2,1]
这个表达式k是符号数组,numden返回两个新数组n和d,其中n是分子数组,d是分母数组。如果采用s=numden(f)形式,numden仅把分子返回到变量s中。
8.3 标准代数运算
很多标准的代数运算可以在符号表达式上执行,函数symadd、symsub、symlnul 和symdiv为加、减、乘、除两个表达式,sympow将一个表达式上升为另一个表达式的幂次。例如:给定两个函数
>>f='2*x^2+3*x-5' %define the symbolic expression
f=2*x^2+3*x-5
>>g='x^2-x+7'
g=x^2-x+7
>>symadd(f,g) % find an expression for f+g
ans=3*x^2+2*x+2
>>symsub(f,g) % find an expression for f-g
ans=x^2+4*x-12
>>symmul(f,g) %find an expression for f*g
ans=(2*x^2+3*x-5)*(x^2-x+7)
>>symdiv(f,g) %find an expression for f/g
ans=(2*x^2+3*x-5)/(x^2-x+7)
>>sympow(f, ' 3*x ' ) % find an expression for
ans=(2*x^2+3*x-5)^3**
另一个通用函数可让用户用其它的符号变量、表达式和算子创建新的表达式。symop取由逗号隔开的、多至16个参量。各个参量可为符号表达式、数值或算子(' + '、' - '、'*'、' / '、' ^ '、' ( '或' ) '),然后symop可将参量联接起来,返回最后所得的表达式.
>>f='cos(x)' % create an expression
f=cos(x)
>>g='sin(2*x)' % create another expression
g=sin(2*x)
>>symop(f,'/ ',g,'+',3) %combine them
ans=cos(x)/sin(2*x)+3
所有这些运算也同样可数组参量进行。
8.4 高级运算
MATLAB具有对符号表达式执行更高级运算的功能。函数compose把f(x)和g(x)复合成f(g(x))。函数finverse求表达式的函数逆,而函数symsum求表达式的符号和。
给定表达式
>>f='1/(1+x^2'; % create the four expression
>>g='sin(x)';
>>h='1/(1+u^2)';
>>k='sin(v)';字符串函数怎么获取
>>compose(f,g) % find an expression for f(g(x))
ans=1/(1+sin(x)^2)
>>compose(g,f) % find an expression for g(f(x))
ans=sin(1/(1+x^2))
compose也可用于含有不同独立变量的函数表达式。
>>compose(h,k,'u','v') % given h(u),k(v),find(k(v))
ans=1/(1+sin(v)^2)
表达式譬如f(x)的函数逆g(x),满足g(f(x))=x。例如,的函数逆是ln(x),因为ln( )=x。sin(x)的函数逆是arcsin(x),函数的函数逆是arcsin 。函数fincerse返回表达式的函数逆。如果解不是唯一就给出警告。
>>finverse('1/x') %the inverse of 1/x is 1/x since '1/(1/x)=x ' ans=1/x
>>finverse('x^2') % g(x^2)=x has more than one solution
Warning: finverse(x^2) is not unique
ans=x^(1/2)
>>finverse( ' a*x+b ' ) % find the solution to ' g(f(x))=x '
ans=-(b-x)/a
>>finverse('a*b+c*d-a*z'),'a') %find the solution to 'g(f(a))=a ' ans=-(c*d-a)/(b-z)
symsun函数求表达式的符号和有四种形式:symsun(f)返回;symsum(f,'s ')返回,symsun(f,a,b)返回;最普通的形式symsun(f,'s',a,b)返回。试一试,它应返回:。
>>symsum('x^2')
ans=1/3*x^3-1/2* x^2+1/6*x
又怎么样呢?它应返回。
>>sym('(2*n-1)^2',1,'n')
ans=11/3*n+8/3-4*(n+1)^2+4/3*(n+1)^3
>>factor(ans) % change the form ( we will revisit 'factor' later on) ans=1/3*n*(2*n-1)*(2*n+1)
最后让我们试一试,其返回应是。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论