1、matlab在函数的求解方法 1 MatLab & 数学建模 第四讲 数值计算符号数学工具箱符号表达式的运算numeric符号到数值的转换pretty显示悦目的符号输出subs替代子表达式sym建立符号矩阵或表达式symadd符号加法symdiv符号除法symmul符号乘法symop符号运算sympow符号表达式的幂运算symrat有理近似symsub符号减法symvar求符号变量符号表达式的简化collect合并同类项expand展开factor因式simple求解最简形式simplify简化symsum和级数符号多项式charpoly特征多项式horner嵌套多项式表示numden分子或分
2、母的提取poly2sym多项式向量到符号的转换sym2poly符号到多项式向量的转换符号微积分diff微分int积分jordan约当标准形taylor泰勒级数展开符号可变精度算术digits设置可变精度vpa可变精度计算求解符号方程compose函数的复合dsolve微分方程的求解finverse函数逆linsolve齐次线性方程组的求解solve代数方程的求解符号线性代数charploy特征多项式determ矩阵行列式的值eigensys特征值和特征向量inverse矩阵逆jordan约当标准形linsolve齐次线性方程组的解transpose矩阵的转置一、方程求解 求解单个代数方程MAT
3、LAB具有求解符号表达式的工具,如果表达式不是一个方程式(不含等号),则在求解之前函数solve将表达式置成等于0。 solve( a*x2+b*x+c ) % solve for the roots of the equtionans= 1/2/a*(-b+(b2-4*a*c)1/2) 1/2/a*(-b-(b2-4*a*c)1/2)结果是符号向量,其元素是方程的2个解。如果想对非缺省x变量求解,solve必须指定变量。 solve( a*x2+b*x+c , b ) % solve for bans= -(a*x2+c)/x带有等号的符号方程也可以求解。 f=solve( cos(x)=s
4、in(x) ) % solve for xf= 1/4*pi t=solve( tan(2*x)=sin(x) )t= 0 acos(1/2+1/2*3(1/2) acos(1/2=1/2*3(1/2)并得到数值解。 numeric(f)ans= 0.7854 numeric(t)ans= 0 0 + 0.8314i 1.9455注意在求解周期函数方程时,有无穷多的解。在这种情况下,solve对解的搜索范围限制在接近于零的有限范围,并返回非唯一的解的子集。如果不能求得符号解,就计算可变精度解。 x=solve( exp(x)=tan(x) )x= 1.306326940423079代数方程组求
5、解可以同时求解若干代数方程,语句solve(s1,s2,.,sn)对缺省变量求解n个方程,语句solve(s1,s2,.,sn, v1,v2,.,vn )对n个 v1,v2,.vn 的未知数求解n个方程。solve(f) 解符号方程式f。 solve(f1,fn) 解由f1,fn组成的联立方程式。 我们先定义以下的方程式: eq1 = x-3=4; % 注意也可写成eq1=x-7 eq2 = x*2-x-6=0; % 注意也可写成eq2=x*2-x-6 eq3 = x2+2*x+4=0; eq4 = 3*x+2*y-z=10; eq5 = -x+3*y+2*z=5; eq6 = x-y-z=-
6、1; solve(eq1) ans= 7 solve(eq2) ans= 3,-2 % 原方程式有二个根3, -2 solve(eq3) ans= -1+i*3(1/2),-1-i*3(1/2) % 注意实根和虚根的表示式 solve(eq4,eq5,eq6) % 解三个联立方程式 ans= x = -2, y = 5, z = -6如何处理中小学典型的代数问题?黛安娜(Diane)想去看电影,她从小猪存钱罐倒出硬币并清点,她发现: 10美分的硬币数加上5美分的硬币总数的一半等于25美分的硬币数。 1美分的硬币数比5美分、10美分以及25美分的硬币总数多10。 25美分和10美分的硬币总数等于
7、1美分的硬币数加上1/4的5美分的硬币数 25美分的硬币数和1美分的硬币数比5美分的硬币数加上8倍的10美分的硬币数多1。如果电影票价为3.00美元,爆米花为1.00美元,糖棒为50美分,她有足够的钱去买这三样东西?首先,根据以上给出的信息列出一组线性方程,假如p,n,d和q分别表示1美分,5美分,10美分,和25美分的硬币数然后,建立MATLAB符号方程并对变量求解。 eq1= d+(n+p)/2=q ; eq2= p=n+d+q-10 ; eq3= q+d=p+n/4 ; eq4= q+p=n+8*d-1 ;pennies,nickles,dimes,quarters=solve(equ1
8、,equ2,equ3,equ4, p,n,d,q )pennies= 16nickles= 8dimes= 3quarters= 15所以,黛安娜有16枚1美分的硬币,8枚5美分的硬币,3枚10美分的硬币,15枚25美分的硬币,这就意味着 money=.01*16+.05*8+.10*3+.25*15money= 4.6100她就有足够的钱去买电影票,爆米花和糖棒并剩余11美分。【例】求解二元函数方程组的零点。(0)从三维坐标初步观察两函数图形相交情况x=-2:0.05:2;y=x;X,Y=meshgrid(x,y); %产生x-y平面上网点坐标F1=sin(X-Y);F2=cos(X+Y);
9、F0=zeros(size(X);surf(X,Y,F1),xlabel(x),ylabel(y),view(-31,62),hold on,surf(X,Y,F2),surf(X,Y,F0),shading interp, %(间隔补齐)hold off 图 5.6.3-0 两函数的三维相交图(1)在某区域观察两函数0等位线的交点情况clear;x=-2:0.5:2;y=x;X,Y=meshgrid(x,y); %产生x-y平面上网点坐标F1=sin(X-Y);F2=cos(X+Y);v=-0.2, 0, 0.2; %指定三个等位值,是为了更可靠地判断0等位线的存在。contour(X,Y,
10、F1,v) %画F1的三条等位线。hold on,contour(X,Y,F2,v),hold off %画F2的三条等位线。 图 5.6.3-1 两个二元函数0等位线的交点图(2)从图形获取零点的初始近似值 在图5.6.3-1中,用ginput获取两个函数0等位线(即三线组中间那条线)交点的坐标。x0,y0=ginput(2); %在图上取两个点的坐标disp(x0,y0) -0.7926 -0.7843 0.7926 0.7843 (3)利用fsolve求精确解。以求(0.7926,7843)附近的解为例。 本例直接用字符串表达被解函数。注意:在此,自变量必须写成x(1), x(2)。假如
11、写成xy(1), xy(2),指令运行将出错。fun=sin(x(1)-x(2),cos(x(1)+x(2); %xy=fsolve(fun,x0(2),y0(2) % xy = 0.7854 0.7854 (4)检验fxy1=sin(xy(1)-xy(2);fxy2=cos(xy(1)+xy(2);disp(fxy1,fxy2) 1.0e-006 * -0.0994 0.2019 说明指令可用以下任何一组指令取代。(A)内联函数形式指令fun=inline(sin(x(1)-x(2), cos(x(1)+x(2), x); %项x必须有。xy=fsolve(fun,x0(2), y0(2);
12、(B)M函数文件形式及指令 先用如下fun.m表示被解函数(并在搜索路径上)fun.mfunction ff=fun(x)ff(1)=sin(x(1)-x(2);ff(2)=cos(x(1)+x(2);然后运行指令xy=fsolve(fun,x0(2),y0(2) 。第四步检验中的结果表明:所找零点处的函数值小于,是一个十分接近零的小数。该精度由options.TolFun控制。 options.TolFun的缺省值是1.0000e-006。它可以用下列指令看到options=optimset(fsolve); options.TolFun ans = 1.0000e-006 线性方程求解a=
13、 7 2 1 -2 9 15 3 -2 -2 -2 11 5 1 3 2 13b=4 7 -1 0x=abx = 0.4979 0.1445 0.0629 -0.0813单个微分方程常微分方程有时很难求解,MATLAB提供了功能强大的工具,可以帮助求解微分方程。函数dsovle计算常微分方程的符号解。因为我们要求解微分方程,就需要用一种方法将微分包含在表达式中。所以,dsovle句法与大多数其它函数有一些不同,用字母D来表示求微分,D2,D3等等表示重复求微分,并以此来设定方程。任何D后所跟的字母为因变量。MATLAB解常微分方程式的语法是dsolve(equation,condition),
14、其中equation代表常微分方程式即y=g(x,y),且须 以Dy代表一阶微分项yD2y代表二阶微分项y,condition则为初始条件。方程=0用符号表达式D2y=0来表示。独立变量可以指定或由symvar规则选定为缺省。例如,一阶方程dy/dx=1+y2的通解为: dsolve( Dy=1+y2 ) % find the general solutionans= -tan(-x+C1)其中,C1是积分常数。求解初值y(0)=1的同一个方程就可产生: dsolve( Dy=1+y2 , y(0)=1 ) % add an initial conditiony= tan(x+1/4*pi)独
15、立变量可用如下形式指定: dsolve( Dy=1+y2 , y(0)=1 , v ) % find solution to dy/dvans= tan(v+1/4*pi)让我们举一个二阶微分方程的例子,该方程有两个初始条件: =cos(2x)-y (0)=0 y(0)=1 y=dsolve( D2y=cos(2*x)-y , Dy(0)=0 , y(0)=1 )y= -2/3*cos(x)2+1/3+4/3*cos(x) y=simple(y) % y looks like it can be simplifiedy= -1/3*cos(2*x)+4/3*cos(x)通常,要求解的微分方程含
16、有一阶以上的项,并以下述的形式表示:-2-3y=0通解为: y=solve( D2y-2Dy-3*y=0 )y= C1*exp(-x)+C2*exp(3*x)加上初始条件:y(0)=0和y(1)=1可得到: y=solve( D2y-2Dy-3*y=0 , y(0)=0,y(1)=1 )y= 1/(exp(-1)-exp(3)*exp(-x)-1/(exp(-1)-exp(3)*exp(3*x) y=simple(y) % this looks like a candidate for simplificationy= -(exp(-x)-exp(3*x)/(exp(3)-exp(-1) pr
17、etty(y) % pretty it up exp(-x)-exp(3 x) - - exp(3) -exp(-1)现在来绘制感兴趣的区域内的结果。 ezplot(y,-6 2)例:假设有以下三个一阶常微分方程式和其初始条件 y=3x2, y(2)=0.5 y=2.x.cos(y)2, y(0)=0.25 y=3y+exp(2x), y(0)=3 对应上述常微分方程式的符号运算式为: soln_1 = dsolve(Dy = 3*x2,y(2)=0.5) ans= x3-7.500000000000000 ezplot(soln_1,2,4) % 看看这个函数的长相 soln_2 = dso
18、lve(Dy = 2*x*cos(y)2,y(0) = pi/4) ans= atan(x2+1) soln_3 = dsolve(Dy = 3*y + exp(2*x), y(0) = 3) ans= -exp(2*x)+4*exp(3*x)微分方程组函数dsolve也可同时处理若干个微分方程式,下面有两个线性一阶方程。 =3f+4g =-4f+3g 通解为: f,g=dsolve( Df=3*f+4*g , Dg=-4*f+3*g )f= C1*exp(3*x)*sin(4*x)+C2*exp(3*x)*cos(4*x)g= -C2*exp(3*x)*sin(4*x)+C1*exp(3*x
19、)*cos(4*x)加上初始条件:f(0)=0和g(0)=1,我们可以得到: f,g=dsolve( Df=3*f+4*g , Dg=-4*f+3*g , f(0)=0,g(0)=1 )f= exp(3*x)*sin(4*x)g= exp(3*x)*cos(4*x)微分和积分微分和积分是微积分学研究和应用的核心,并广泛地用在许多工程学科。MATLAB符号工具能帮助解决许多这类问题。微分符号表达式的微分以四种形式利用函数diff: f= a*x3+x2-b*x-c % define a symbolic expressionf= a*x3+x2-b*x-c diff(f) % different
20、iate with respect to the default variable xans= 3*a*x2+2*x-b diff(f,a ) % differentiate with respect to aans= x3 diff(f,2) % differentiate twice with respect to xans= 6*a*x+2 diff(f, a ,2) % differentiate twice with respect to aans= 0函数diff也可对数组进行运算。如果F是符号向量或数组,diff(F)对数组内的各个元素进行微分。 F=sym( a*x, b*x2
21、; c*x3, d*s ) % create a symbolic arrayF= a*x, b*x2 c*x3, d*s diff(F) % differentiate the element with respect to xans= a,2*b*x 3*c*x2, 0注意函数diff也用在MATLAB,计算数值向量或矩阵的数值差分。对于一个数值向量或矩阵M,diff(M)计算M(2: m,: )-M(1: m-1,: )的数值差分,如下所示: m=(1: 8).2) % create a vectorM= 1 4 9 16 25 36 49 64 diff(M) % find the d
22、ifferences between elementsans= 3 5 7 9 11 13 15 如果diff的表达式或可变参量是数值,MATLAB就非常巧妙地计算其数值差分;如果参量是符号字符串或变量,MATLAB就对其表达式进行微分。积分积分函数int(f),其中f是一符号表达式,它力图求出另一符号表达式F使diff(F)=f。正如从研究微分学所了解的,积分比微分复杂得多。积分或逆求导不一定是以封闭形式存在,或许存在但软件也许找不到,或者软件可明显地求解,但超过内存或时间限制。当MATLAB不能找到逆导数时,它将返回未经计算的命令。 int( log(x)/exp(x2) ) % atte
23、mpt to integrateans= log(x)/exp(x2)同微分一样,积分函数有多种形式。形式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) % crate a symbolic functionf= sin(s+2*x) int(f) % integrate with respect to
24、 xans= -1/2*cos(s+2*x) int(f, s ) % integrate with respect to sans= -cos(s+2*x) int(f,pi/2,pi) % integrate with respect to x from /2 to ans= -cos(x) int(f, s ,pi/2,pi) % integrate with respect to s from /2 to ans= cos(2*x)-sin(2*x) int(f, m , n ) % integrate with respect to x from m to nans= -1/2*co
25、s(s+2*n)+1/2*cos(s+2*m)正如函数diff一样,积分函数int对符号数组的每一个元素进行运算。 F=sym( a*x,b*x2;c*x3,d*s ) % create a symbolic arrayF= a*x,b*x2 c*x3, d*s diff(F) % ubtegrate the array elements with respect to xans= 1/2*a*x2,1/3*b*x3 1/4*c*x4, d*s*xdiff函数用以演算一函数的微分项,相关的函数语法有下列4个: diff(f) 传回f对预设独立变数的一次微分值 diff(f,t) 传回f对独立变
26、数t的一次微分值 diff(f,n) 传回f对预设独立变数的n次微分值 diff(f,t,n) 传回f对独立变数t的n次微分值 先定义下列三个方程式,接著再演算其微分项: S1 = 6*x3-4*x2+b*x-5; S2 = sin(a); S3 = (1 - t3)/(1 + t4); diff(S1) ans= 18*x2-8*x+b diff(S1,2) ans= 36*x-8 diff(S1,b) ans= x diff(S2) ans= cos(a) diff(S3) ans= -3*t2/(1+t4)-4*(1-t3)/(1+t4)2*t3 simplify(diff(S3) an
27、s= t2*(-3+t4-4*t)/(1+t4)2int函数用以演算一函数的积分项, 这个函数要找出一符号式 F 使得diff(F)=f。如果积分式的解析式 (analytical form, closed form) 不存在的话或是MATLAB无法找到,则 int 传回原输入的符号式。相关的函数语法有下列 4个: int(f) 传回f对预设独立变数的积分值 int(f,t) 传回f对独立变数t的积分值 int(f,a,b) 传回f对预设独立变数的积分值,积分区间为a,b,a和b为数值式 int(f,t,a,b) 传回f对独立变数t的积分值,积分区间为a,b,a和b为数值式 int(f,m,n) 传回f对预设变数的积分值,积分区间为m,n,m和n为符号式 我们示范几个例子: S1 = 6*x3-4*x2+b*x-5; S2 = sin(a); S3 = sqrt(x); int(S1) ans= 3/2*x4-4/3*x3+1/2*b*x2-5*x int(S2) ans= -cos(a) int(S3) ans= 2/3*x(3/2) int(S3,a,b) ans= 2/3*b(3/2)- 2/3*a(3/2) int(S3,0.5,0.6) ans= 2/25*15(1/2)-1/6*2(1/2)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1