您好,欢迎访问三七文档
当前位置:首页 > 高等教育 > 其它文档 > MATLAB第九讲符号运算(续).
在前面讨论过求和函数sum,sum处理的级数是有穷级数。对于无穷级数求和,sum是无能无力的。求无穷级数的和需要使用符合表达式求和函数symsum。1.级数的符号求和级数符号求和函数symsum,调用格式为:symsum(a,n,n0,nn)级数例1求级数之和。(1)常数项级数n=sym('n');s1=symsum(1/n^2,n,1,inf)%求s1s1=pi^2/6(2)s2=symsum((-1)^(n+1)/n,1,inf)%求s2。未指定求和变量,缺省为ns2=log(2)21116191411nsnsn1)1(413121112(3)函数项级数s3=symsum(n*x^n,n,1,inf)%求s3。此处的求和变量n不能省略。s3=piecewise([abs(x)1,x/(x-1)^2])(4)s4=symsum(n^2,1,100)%求s4。计算有限级数的和s4=338350(5)s5=symsum(sin(n*pi/6),1,inf)%求s5。s5=NaNnnxxxxs3233210000169414s6πsin6π2sin6πsin5ns2函数的泰勒级数泰勒(Taylor)级数将一个任意函数表示为一个幂级数,并且,在许多情况下,只需要取幂级数的前有限项来表示该函数,这对于大多数工程应用问题来说,精度已经足够。MATLAB中提供了将函数展开为幂级数的函数taylor,其调用格式为:taylor(f,v,n,a)该函数将函数f按变量v展开为泰勒级数,展开到第n项(即变量v的n-1次幂)为止,n的默认值为6,v的默认值与diff函数相同。参数a指定将函数f在自变量v=a出展开,a的默认值是0。例求函数在指定点的泰勒展开式。(1)求的5阶泰勒级数展开式。x=sym('x');f1=sqrt(1-2*x+x^3)-(1-3*x+x^2)^(1/3);taylor(f1,5)%求(1)。ans=(119*x^4)/72+x^3+x^2/6(2)将在x=1处按5次多项式展开。f2=(1+x+x^2)/(1-x+x^2);taylor(f2,6,x,1)%求(2)。展开到x的5次幂时应选择n=6ans=2*(x-1)^3-2*(x-1)^2-2*(x-1)^5+33233121xxxx2211xxxxMATLAB5.x版中,尚未提供求函数傅立叶级数的内部函数。下面我们自己设计一个简化的求任意函数的傅立叶级数的函数文件。functionmfourier=mfourier(f,n)symsxabc;mfourier=int(f,-pi,pi)/2;%计算a0fori=1:na(i)=int(f*cos(i*x),-pi,pi);b(i)=int(f*sin(i*x),-pi,pi);mfourier=mfourier+a(i)*cos(i*x)+b(i)*sin(i*x);endReturn调用该函数时,需给出被展开的符号函数f和展开项数n,不可缺省。函数的傅立叶级数例6.26在[-π,π]区间展开函数为傅立叶级数。命令如下:x=sym('x');a=sym('a');f=x;mfourier(f,5)%求f(x)=x的傅立叶级数的前5项f=abs(x);mfourier(f,5)%求f(x)=|x|的傅立叶级数的前5项symsa;f=cos(a*x);mfourier(f,6)%求f(x)=cos(ax)的傅立叶级数的前6项f=sin(a*x);mfourier(f,4)%求f(x)=sin(ax)的傅立叶级数的前4项符号方程求解1符号代数方程求解代数方程是指未涉及微积分运算的方程,相对比较简单。在MATLAB中,求解用符号表达式表示的代数方程可由函数solve实现,其调用格式为:solve(eq):求解符号表达式表示的代数方程eq,求解变量为默认变量。当方程右端为0时,方程eq中可以不包含右端项和等号,而仅列出方程左端的表达式。solve(eq,v):求解符号表达式表示的代数方程eq,求解变量为v。solve(eq1,eq2,…,eqn,v1,v2,…,vn):求解符号表达式eq1,eq2,…,eqn组成的代数方程组,求解变量分别v1,v2,…,vn。若不指定求解变量,由默认规则确定。例1解下列方程(1)x=solve('1/(x+2)+4*x/(x^2-4)=1+2/(x-2)','x')%解方程(1)x=1(2)f=sym('x-(x^3-4*x-7)^(1/3)=1');x=solve(f)x=322144212xxxx17433xxx(3)x=solve('2*sin(3*x-pi/4)=1')%解方程(3)x=(5*pi)/36(4)x=solve('x+x*exp(x)-10','x')%解方程(4)。仅标出方程的左端x=1.63350617015584638419316517897891)43sin(2x010xxex例解下列方程组(1)[xy]=solve('1/x^3+1/y^3=28','1/x+1/y=4','x,y')%解方程组(1)x=11/3y=1/31411281133yxyx(2)[xy]=solve('x+y-98','x^(1/3)+y^(1/3)-2','x,y')%解方程组(2)x=[emptysym]y=[]29833yxyx(3)[xy]=solve('x^2+y^2=5','2*x^2-3*x*y-2*y^2=0','x,y')%解方程组(3)x',y'ans=[2,-1,1,-2]ans=[1,2,-2,-1]023252222yxyxyx在应用MATLAB求解方程组时,应充分发挥其功能。当MATLAB给出无解或未找到所期望的解时,不要认为原方程组就真正无解了,还需要用其他方法试探着求解。如果知道方程组在某点附近有解,不妨用方程组的数值求解函数fsolve试探求解,一般能找到所期望的解。总之,方程组求解是一个古老而又困难的问题,而MATLAB给方程组求解提供了非常有效的手段。符号常微分方程求解在MATLAB中,用大写字母D表示导数。例如,Dy表示y',D2y表示y'',Dy(0)=5表示y'(0)=5。D3y+D2y+Dy-x+5=0表示微分方程y'''+y''+y'-x+5=0。MATLAB的符号运算工具箱中提供了功能强大的求解常微分方程的函数dsolve。该函数的调用格式为:dsolve('eqn1','condition','var')该函数求解微分方程eqn1在初值条件condition下的特解。参数var描述方程中的自变量符号,省略时按缺省原则处理,若没有给出初值条件condition,则求方程的通解。dsolve在求微分方程组时的调用格式为:dsolve('eqn1','eqn2',…,'eqnN','condition1',…,'conditionN','var1',…,'varN')函数求解微分方程组eqn1、…、eqnN在初值条件conditoion1、…、conditionN下的解,若不给出初值条件,则求方程组的通解,var1、…、varN给出求解变量。例求微分方程的通解。(1)求的通解。y=dsolve('Dy-(x^2+y^2)/x^2/2','x')%解(1)。方程的右端为0时可以不写y=x*(-2+log(x)+C1)/(log(x)+C1)2222xyxdxdy(2)求的通解。y=dsolve('Dy*x^2+2*x*y-exp(x)','x')%解(2)y=(exp(x)+C1)/x^2xexydxdyx22(3)求的特解,。y=dsolve('Dy-x^2/(1+y^2)','y(2)=1','x');%解(3)y=(((x^3/2-2)^2+1)^(1/2)+x^3/2-2)^(1/3)-1/(((x^3/2-2)^2+1)^(1/2)+x^3/2-2)^(1/3)221yxdxdy,1)2(y(4)求的通解。[x,y]=dsolve('Dx=4*x-2*y','Dy=2*x-y','t')%解方程组(4)x=C1+C2*exp(3*t)y=1/2*C2*exp(3*t)+2*C1y2xdtdy2y4xdtdx(5)求的通解。[x,y]=dsolve('D2x-y','D2y+x','t');%解方程组(5)x=(2^(1/2)*C20*(i/2+1/2))/exp(2^(1/2)*t*(i/2+1/2))-2^(1/2)*C19*exp(2^(1/2)*t*(i/2-1/2))*(i/2-1/2)-(2^(1/2)*C17*exp(2^(1/2)*t*(i+1))*(i/2+1/2))/exp(2^(1/2)*t*(i/2+1/2))+(2^(1/2)*C18*exp(2^(1/2)*t*(i/2-1/2))*(i/2-1/2))/exp(2^(1/2)*t*(i-1))y=(2^(1/2)*C20*(i/2-1/2))/exp(2^(1/2)*t*(i/2+1/2))-2^(1/2)*C19*exp(2^(1/2)*t*(i/2-1/2))*(i/2+1/2)-(2^(1/2)*C17*exp(2^(1/2)*t*(i+1))*(i/2-1/2))/exp(2^(1/2)*t*(i/2+1/2))+(2^(1/2)*C18*exp(2^(1/2)*t*(i/2-1/2))*(i/2+1/2))/exp(2^(1/2)*t*(i-1))002222xdtydydtxd线性方程组求解线性方程组求解linsolve(A,b):解线性方程组bAx例:解方程组A=[12–1;101;130];b=[2;3;8];x=linsolve(A,b)22338xyzxzxyb是列向量!非线性方程的根Matlab非线性方程的数值求解fzero(f,x0):求方程f=0在x0附近的根。方程可能有多个根,但fzero只给出距离x0最近的一个fzero先找出一个包含x0的区间,使得f在这个区间两个端点上的函数值异号,然后再在这个区间内寻找方程f=0的根;如果找不到这样的区间,则返回NaN。x0是一个标量,不能缺省由于fzero是根据函数是否穿越横轴来决定零点,因此它无法确定函数曲线仅触及横轴但不穿越的零点,如|sin(x)|的所有零点。非线性方程的根fzero的另外一种调用方式fzero(f,[a,b])方程在[a,b]内可能有多个根,但fzero只给出一个求方程f=0在[a,b]区间内的根。参数f可通过以下方式给出:fzero('x^3-3*x+1',2);f=inline('x^3-3*x+1');fzero(f,2)fzero(@(x)x^3-3*x+1,2);f不是方程!也不能使用符号表达式!例:fzero('sin(x)',10)fzero(@sin,10)fzero('x^3-3*x+1',1)fzero('x^3-3*x+1',[1,2])fzero('x^3-3*x+1=0',1)Xfzero('x^3-3*x+1',[-2,0])f=inline('x^3-3*x+1');fzero(f,[-2,0])Matlab符号方程求解器s=solve(f,v):求方程关于指定自变量的解;s=solve(f):求方程关于默认自变量的解。f可以是用字符串表示的方程,或符号表达式;若f中不含等号,则表示解方程f=0。solve例:解方程x^3-3*x+1=0symsx;f=x^3-3*x+1;s=solve(f,x)s=solve('x^3-3*x+1','x')s
本文标题:MATLAB第九讲符号运算(续).
链接地址:https://www.777doc.com/doc-2887732 .html