matlab的符号计算.docx

上传人:b****0 文档编号:9847742 上传时间:2023-05-21 格式:DOCX 页数:28 大小:29.08KB
下载 相关 举报
matlab的符号计算.docx_第1页
第1页 / 共28页
matlab的符号计算.docx_第2页
第2页 / 共28页
matlab的符号计算.docx_第3页
第3页 / 共28页
matlab的符号计算.docx_第4页
第4页 / 共28页
matlab的符号计算.docx_第5页
第5页 / 共28页
matlab的符号计算.docx_第6页
第6页 / 共28页
matlab的符号计算.docx_第7页
第7页 / 共28页
matlab的符号计算.docx_第8页
第8页 / 共28页
matlab的符号计算.docx_第9页
第9页 / 共28页
matlab的符号计算.docx_第10页
第10页 / 共28页
matlab的符号计算.docx_第11页
第11页 / 共28页
matlab的符号计算.docx_第12页
第12页 / 共28页
matlab的符号计算.docx_第13页
第13页 / 共28页
matlab的符号计算.docx_第14页
第14页 / 共28页
matlab的符号计算.docx_第15页
第15页 / 共28页
matlab的符号计算.docx_第16页
第16页 / 共28页
matlab的符号计算.docx_第17页
第17页 / 共28页
matlab的符号计算.docx_第18页
第18页 / 共28页
matlab的符号计算.docx_第19页
第19页 / 共28页
matlab的符号计算.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

matlab的符号计算.docx

《matlab的符号计算.docx》由会员分享,可在线阅读,更多相关《matlab的符号计算.docx(28页珍藏版)》请在冰点文库上搜索。

matlab的符号计算.docx

matlab的符号计算

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)')%differentiatecos(x)withrespecttox

ans=-sin(x)

>>M=sym('[a,b;c,d]')%createasymbolicmatrixM

M=

[a,b]

[c,d]

>>determ(M)%findthedeterminantofthesymbolicmatrixM

ans=a*d-b*c

要注意的是,以上第一例的符号表达式是用单引号以隐含方式定义的。

它告诉MATLAB'cos(x)'是一个字符串并说明diff('cosx')是一个符号表达式而不是数字表达式;然而在第二个例子中,用函数sym显式地告诉MATLABM=sym('[a,b;c,d]')是一符号表达式。

在MATLAB可以自己确定变量类型的场合下,通常不要求显式函数sym。

MATLAB中函数functionargument形式是与function('argument')等价的。

其中,function是一个函数,argument是一字符串。

例如,diffcos(x)和diff('cos(x)')两者都意味diff(sym'cos(x)')。

但第一种形式显然更便于输入。

然而,很多时候sym是必要的。

在上述的第二个例子中,

>>M=[a,b;c,d]%Misanumericmatrixusingvalueofathroughd

?

?

?

Uundefinefunctionorvariablea.

>>M='[a,b;c,d]'%Misacharacterstring,butnotasymbolicmatrix

M=[a,b;c,d]

>>M=sym('[a,b;c,d]')%Misasymbolicmatrix

M=[a,b]

[c,d]

M以三种方式定义:

数字型(如果a、b、c、d已预先确定)、字符串型或符号矩阵型。

许多符号函数非常巧妙能够自动将字符转变为符号表达式。

但在某些情况下,尤其是建立符号数组时,必须用函数sym,特别地将字符串变为符号表达式。

隐含形式,例如diffcos(x),对于那些不需要参考先前结果的简单任务,最有用。

但是最简单形式(无引号)要求一个参量,它是一个单字符的字符串、不包含插入的空格。

>>diffx^2+3*x+5%theargumentisequivalentto'x^2+3*x+5'

ans=2*x+3

>>diffx^2+3*x+5%spacesbreaktheargumentintoseparatestrings

?

?

?

Errorusing==>diff

Toomanyinputarguments

无变量的符号表达式称作符号常量。

符号常量常常与整数很难区别,例如

>>f=symop('(3*4-2)/5+1')%reduceasymbolicconstanttoitssimplestform

f=3

>>isstr(f)%isfastring?

(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*)%findthedefaultsymbolicvariable

ans=x

>>symvar('a*t+s/(u+3)')%uistheclosestto'x'

ans=u

>>symvar('sin(omega)')%'omega'isnotasingleecharacter。

ans=x

>>symvar('3*i+4*j')%iandjareequeltosqrt(-1)

ans=x

>>symvar('y+3*s','t')%findthevariableclosesttotratherthanx

ans=s

如果利用规则symvar不能找到一个缺省独立变量,它便假定无独立变量并返回x。

这一结论对含有由多个字母组成的变量,如:

alpha或s2的表达式,或不含变量的符号常数均成立。

如果需要,绝大多数命令都使用用户选项以指定独立变量。

>>diff('x^n')%differentiatewithrespecttothedefaultvariable'x'

ans=x^n*n/x

>>diff('x^n','n')%differentiatex^nwithrespectto'n'

ans=x^n*log(x)

>>diff('sin(omega)')%differentiateusingthedefaultvariables(x)

ans=0

>>diff('sin(omega)','omega')%specifytheindependentvariable

ans=cos(omega)

8.2符号表达式运算

一旦创建了一个符号表达式,或许想以某些方式改变它;也许希望提取表达式的一部分,合并两个表达式或求得表达的数值。

有许多符号工具可以帮助完成这些任务。

提取分子和分母:

如果表达式是一个有理分式(两个多项式之比),或是可以展开为有理分式(包括哪些分母为1的分式),可利用numden来提取分子或分母。

例如,给定如下的表达式:

在必要时,numden将表达式合并、有理化并返回所得的分子和分母。

进行这项运算的MATLAB语句是:

>>m='x^2'%createasimpleexpression

m=x^2

>>[n,d]=numden(m)%extractthenumeratoranddenominator

n=x^2

d=1

>>f='a*x^2/(b-x)'%createarationalexpression

f=a*x^2/(b-x)

>>[n,d]=numden(f)%extractthenumeratoranddenominator

n=a*x^2

d=b-x

前二个表达式得到期望结果。

>>g='3/2*x^2+2/3*x-3/5'%rationalizeandextracttheparts

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)'%thesumofrationalpolynomials

h=(x^2+3)/(2*x-1)+3*x/(x-1)

>>[n,d]=numden(h)%rationalizeandextract

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]')%tryasymbolicarray

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'%definethesymbolicexpression

f=2*x^2+3*x-5

>>g='x^2-x+7'

g=x^2-x+7

>>symadd(f,g)%findanexpressionforf+g

ans=3*x^2+2*x+2

>>symsub(f,g)%findanexpressionforf-g

ans=x^2+4*x-12

>>symmul(f,g)%findanexpressionforf*g

ans=(2*x^2+3*x-5)*(x^2-x+7)

>>symdiv(f,g)%findanexpressionforf/g

ans=(2*x^2+3*x-5)/(x^2-x+7)

>>sympow(f,'3*x')%findanexpressionfor

ans=(2*x^2+3*x-5)^3**

另一个通用函数可让用户用其它的符号变量、表达式和算子创建新的表达式。

symop取由逗号隔开的、多至16个参量。

各个参量可为符号表达式、数值或算子('+'、'-'、'*'、'/'、'^'、'('或')'),然后symop可将参量联接起来,返回最后所得的表达式.

>>f='cos(x)'%createanexpression

f=cos(x)

>>g='sin(2*x)'%createanotherexpression

g=sin(2*x)

>>symop(f,'/',g,'+',3)%combinethem

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';%createthefourexpression

>>g='sin(x)';

>>h='1/(1+u^2)';

>>k='sin(v)';

>>compose(f,g)%findanexpressionforf(g(x))

ans=1/(1+sin(x)^2)

>>compose(g,f)%findanexpressionforg(f(x))

ans=sin(1/(1+x^2))

compose也可用于含有不同独立变量的函数表达式。

>>compose(h,k,'u','v')%givenh(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')%theinverseof1/xis1/xsince'1/(1/x)=x'

ans=1/x

>>finverse('x^2')%g(x^2)=xhasmorethanonesolution

Warning:

finverse(x^2)isnotunique

ans=x^(1/2)

>>finverse('a*x+b')%findthesolutionto'g(f(x))=x'

ans=-(b-x)/a

>>finverse('a*b+c*d-a*z'),'a')%findthesolutionto'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)%changetheform(wewillrevisit'factor'lateron)

ans=1/3*n*(2*n-1)*(2*n+1)

最后让我们试一试,其返回应是。

>>symsum('1/(2*n-1)^2',1,inf)

ans=1/8*pi^2

8.5变换函数

本节提出许多工具,将符号表达式变换成数值或反之。

有极少数的符号函数可返回数值。

然而请注意,某些符号函数能自动地将一个数字变换成它的符号表达式,如果该数字是函数许多参量中的一个。

函数sym可获取一个数字参量并将其转换为符号表达式。

函数numneric的功能正好相反,它把一个符号常数(无变量符号表达式)变换为一个数值。

>>phi='(1+sqrt(5))/2'%the'golden'ratio

phi=(1+sqrt(5))/2%converttoanumericvalue

>>numeric(phi)

ans=1.6180

函数eval将字符串传给MATLAB以便计算。

所以eval是另一个可用于把符号常数变换为数字或计算表达式的函数。

>>eval(phi)%executethestring'(1+sqrt(5))/2

ans=1.6180

正如所期望那样,numeric和eval返回相同数值。

符号函数sym2poly将符号多项式变换成它的MATLAB等价系数向量。

函数poly2syrn功能正好相反,并让用户指定用于所得结果表达式中的变量。

>>f='2*x^2+x^3-3*x+5'%fisthesymbolicpolynomials

f=2*x^2+x^3-3*x+5

>>n=sym2poly(f)%extractehtnumericcoefficientvector

n=12-35

>>poly2sym(n)%recreatethepolynomialsinx(thedefault)

ans=2*x^2+x^3-3*x+5

>>poly2sym(n,'s')%recreatethepolynomialsins

ans=s^3+2*s^2-3*s+5

8.6变量替换

假设有一个以x为变量的符号表达式,并希望将变量转换为y。

MATLAB提供一个工具称作subs,以便在符号表达式中进行变量替换。

其格式为subs(f,new,old),其中f是符号表达式,new和old是字符、字符串或其它符号表达式。

'新'字符串将代替表达式f中各个'旧'字符串。

以下有几个例子:

>>f='a*x^2+b*x+c'%createafunctionf(x)

f=a*x^2+b*x+c

>>subs(f,'s','x')%substitute's'for'x'intheexpressionf

ans=a*s^2+b*s+c

>>subs(f,'alpha','a')%substitute'alpha'for'a'inf

ans=alpha*x^2+b*x+c

>>g='3*x^2+5*x-4'%createanotherfunction

g=3*x^2+5*x-4

>>h=subs(g,'2','x')%substitute'2'for'x'ing

h=18

>>isstr(h)%showthattheresultisasymbolicexpression

ans=1

最后一个例子表明subs如何进行替换,并力图简化表达式。

因为替换结果是一个符号常数,MATLLAB可以将其简化为一个符号值。

注意,因为subs是一个符号函数,所以它返回一个符号表达式。

尽管看似数字,实质上是一个符号常数。

为了得到数字,我们需要使用函数numeric或eval来转换字符串。

>>numeric(h)%convertasymbolicexpressiontoanumber

ans=18

>>isstr(ans)%showthattheresultisanumericvalue

ans=0

8.7微分和积分

微分和积分是微积分学研究和应用的核心,并广泛地用在许多工程学科。

MATLAB符号工具能帮助解决许多这类问题。

微分

符号表达式的微分以四种形式利用函数diff:

>>f='a*x^3+x^2-b*x-c'%defineasymbolicexpression

f=a*x^3+x^2-b*x-c

>>diff(f)%differentiatewithrespecttothedefaultvariablex

ans=3*a*x^2+2*x-b

>>diff(f,'a')%differentiatewithrespecttoa

ans=x^3

>>diff(f,2)%differentiatetwicewithrespecttox

ans=6*a*x+2

>>diff(f,'a',2)%differentiatetwicewithrespecttoa

ans=0

函数diff也可对数组进行运算。

如果F是符号向量或数组,diff(F)对数组内的各个元素进行微分。

>>F=sym('[a*x,b*x^2;c*x^3,d*s]')%createasymbolicarray

F=[a*x,b*x^2]

[c*x^3,d*s]

>>diff(F)%differentiatetheelementwithrespecttox

ans=[a,2*b*x]

[3*c*x^2,0]

注意函数diff也用在MATLAB计算数值向量或矩阵的数值差分。

对于一个数值向量或矩阵M,diff(M)计算M(2:

m,:

)-M(1:

m-1,:

)的数值差分,如下所示:

>>m=[(1:

8).^2)]%createavector

M=1491625364964

>>diff(M)%findthedifferencesbetweenelements

ans=3579111315

如果diff的表达式或可变参量是数值,MATLAB就非常巧妙地计算其数值差分;如果参量是符号字符串或变量,MATLAB就对其表达式进行微分。

积分

积分函数int(f),其中f是一符号表达式,它力图求出另一符号表达式F使diff(F)=f。

正如从研究微分学所了解的,积分比微分复杂得多。

积分或逆求导不一定是以封闭形式存在,或许存在但软件也许找不到,或者软件可明显地求解,但超过内存或时间限制。

当MATLAB不能找到逆导数时,它将返回未经计算的命令。

>>int('log(x)/exp(x^2)')%attempttointegrate

ans=log(x)/exp(x^2)

同微分一样,积分函数有多种形式。

形式int(f)相对于缺省的独立变量求逆导数;形式(f,'s')相对于符号变量s积分;形式int(f,a,b)和int(f,'s',a,b),a,b是数值,求解符号表达式从a到b的定积分;形式int(f,'m','n')和形式int(f,'s','m','n'),其中m,n是符号变量,求解符号表达式从m到n的定积分。

>>f='sin(s+2*x)')%crateasymbolicfunction

f=sin(s+2*x)

>>int(f)%integratewithrespecttox

ans=-1/2*cos(s+2*x)

>>int(f,'s')%integratewithrespecttos

ans=-cos(s+2*x)

>>int(f,pi/2,pi)%integratewithrespecttoxfrom/2to

ans=-cos(x)

>>int(f,'s',pi/2,pi)%integratewith

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2