matlab数学表达.docx
- 文档编号:11336249
- 上传时间:2023-02-27
- 格式:DOCX
- 页数:22
- 大小:91.33KB
matlab数学表达.docx
《matlab数学表达.docx》由会员分享,可在线阅读,更多相关《matlab数学表达.docx(22页珍藏版)》请在冰豆网上搜索。
matlab数学表达
MATLAB所具有的符号数学工具箱
MATLAB所具有的符号数学工具箱与其它所有工具不同,它适用于广泛的用途,而不是针对一些特殊专业或专业分支。
另外,MATLAB符号数学工具箱与其它的工具箱区别还因为它使用字符串来进行符号分析,而不是基于数组的数值分析。
为此,本章包含了该工具箱的教学辅导材料。
1、引言
符号数学工具箱是操作和解决符号表达式的符号数学工具箱(函数)集合,有复合、简化、微分、积分以及求解代数方程和微分方程的工具。
另外还有一些用于线性代数的工具,求解逆、行列式、正则型式的精确结果,找出符号矩阵的特征值而无由数值计算引入的误差。
工具箱还支持可变精度运算,即支持符号计算并能以指定的精度返回结果。
符号数学工具箱中的工具是建立在功能强大的称作Maple软件的基础上。
它最初是由加拿大的滑铁卢(Waterloo)大学开发的。
当要求MATLAB进行符号运算时,它就请求Maple去计算并将结果返回到MATLAB命令窗口。
因此,在MATLAB中的符号运算是MATLAB处理数字的自然扩展。
2、符号表达式
符号表达式是代表数字、函数、算子和变量的MATLAB字符串,或字符串数组。
不要求变量有预先确定的值,符号方程式是含有等号的符号表达式。
符号算术是使用已知的规则和给定符号恒等式求解这些符号方程的实践,它与代数和微积分所学到的求解方法完全一样。
符号矩阵是数组,其元素是符号表达式。
MATLAB在内部把符号表达式表示成字符串,以与数字变量或运算相区别;否则,这些符号表达式几乎完全象基本的MATLAB命令。
表22.1列有几则符号表达式例子以及MATLAB等效表达式。
表1
符号表达式
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是一字符串。
例如,MATLAB可以构造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
(1)符号变量
当字符表达式中含有多于一个的变量时,只有一个变量是独立变量。
如果不告诉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)
(2)符号表达式运算
一旦创建了一个符号表达式,或许想以某些方式改变它;也许希望提取表达式的一部分,合并两个表达式或求得表达的数值。
有许多符号工具可以帮助完成这些任务。
所有符号函数(很少特殊例外的情况,讨论于后)作用到符号表达式和符号数组,并返回符号表达式或数组。
其结果有时可能看起来象一个数字,但事实上它是一个内部用字符串表示的一个符号表达式。
正如我们前面所讨论的,可以运用MATLAB函数isstr来找出像似数字的表达式是否真是一个整数或是一个字符串。
(A)提取分子和分母
如果表达式是一个有理分式(两个多项式之比),或是可以展开为有理分式(包括哪些分母为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中。
(B)标准代数运算
很多标准的代数运算可以在符号表达式上执行,函数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
所有这些运算也同样用数组参量进行。
(C)高级运算
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
3、变换函数
本节提出许多工具,将符号表达式变换成数值或反之。
有极少数的符号函数可返回数值。
然而请注意,某些符号函数能自动地将一个数字变换成它的符号表达式,如果该数字是函数许多参量中的一个。
函数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
4、变量替换
假设有一个以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
5、符号表达式画图
在许多的场合,将表达式可视化是有利的。
MATLAB提供了函数ezplot来完成该任务。
>>y='16*x^2+64*x+96'%expressiontoplot
y=
16*x^2+64*x+96
>>ezplot(y)
图符号函数16*x^2+64*x+96(-2
≤x≤2
)
图符号函数16*x^2+64*x+960≤x≤6
正如图所示,ezplot绘制了定义域为-2
≤x≤2
的给定符号函数,并相应地调整了y轴比例,还加了网格栅和标志。
在这个例子中,我们感兴趣的时间是从0到6。
让我们再试一下,并指定时间范围,
>>ezplot(y,[06])%plotyfor0≤x≤6
现在,在所感兴趣的范围内显示得略好些。
一旦该图处在图形窗口内,它可以象其它图象一样作修改。
6、可变精度算术运算
因为数值的精度受每次操作所保留的数位的限制,所以数值的任何运算都会引入舍入误差,重复的多次数值运算会造成累积误差。
而对符号表达式的运算是非常准确的,因为它们不需要进行数值运算,所以无舍入误差。
对符号运算结果用函数eval或numeric,仅在结果转换时会引入舍入误差。
MATLAB对数的处理完全依靠计算机的浮点算术运算,显然在内存中进行运算,又快又好,只是浮点运算受到所支持字长的限制,每次操作会引入舍入误差,所以不能产生精确的结果。
MATLAB中各个算术运算的相对精度大约是16位。
相反,Maple的符号处理能力可以实现任何数位的运算。
当缺省的数位增加时,每次计算就需要附加时间和计算机内存。
Maple缺省为16位的精度。
函数digits返回全局Digits参数的当前值。
Maple缺省准确度可以由digits(n)来改变,其中n是所期望的准确度数位。
用这种方法增加准确度的副作用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- matlab 数学 表达
![提示](https://static.bdocx.com/images/bang_tan.gif)