matlab第2 数值数组及其运算(续)_第1页
matlab第2 数值数组及其运算(续)_第2页
matlab第2 数值数组及其运算(续)_第3页
matlab第2 数值数组及其运算(续)_第4页
matlab第2 数值数组及其运算(续)_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二讲数值数组及其运算

(续)一、多项式运算1、多项式的创建(1)多项式系数向量的直接输入法(2)利用指令:P=poly(AR)产生多项式系数向量若AR是方阵,则多项式P就是该方阵的特征多项式若AR=[ar1ar2ar3……arn],则AR的元素被认为是多项式P的根【例7】求3阶方阵A的特征多项式。A=[111213;141516;171819];PA=poly(A)PPA=poly2str(PA,'s')PA=1.0000-45.0000-18.00000.0000PPA=s^3-45s^2-18s+1.8303e-0142、多项式运算函数指令含义p=conv(p1,p2)P是多项式p1和p2的乘积多项式[q,r]=deconv(p1,p2)多项式p1被p2除的商多项式为q,而余多项式为rp=ploy(AR)求方阵AR的特征多项式p;或求向量AR指定根所对应的多项式dp=polyder(p)求多项式p的导数多项式dpdp=polyder(p1,p2)求多项式p1,p2乘积的导数多项式dp[Num,Den]=ployder(p1,p2)对有理分式(p1/p2)求导数所得的有理分式为(Num/Den)P=polyfit(x,y,n)求x,y向量给定的数据的n阶拟合多项式ppA=polyval(p,S)按数组运算规则计算多项式值;p为多项式,S为矩阵PM=polyvalm(p,S)按矩阵运算规则计算多项式值;p为多项式,S为矩阵[r,p,k]=residue(b,a)部分分式展开,b,a分别是分子、分母多项式系数向量;r、p、k分别是留数、极点和直项r=roots(p)求多项式p的根【例1】求的“商”及“余”多项式。p1=conv([1,0,2],conv([1,4],[1,1]));

%计算分子多项式 p2=[1011];

%注意缺项补零[q,r]=deconv(p1,p2);cq='商多项式为';cr='余多项式为';disp([cq,poly2str(q,'s')]),disp([cr,poly2str(r,'s')])商多项式为s+5余多项式为5s^2+4s+3【例2】

求多项式的微分polyder(p)

polyder(a,b):求多项式a,b乘积的微分[p,q]=polyder(a,b):求多项式a,b商的微分a=[12345];poly2str(a,'x')ans=x^4+2x^3+3x^2+4x+5b=polyder(a)b=4664poly2str(b,'x')ans=4x^3+6x^2+6x+43.代数多项式求值polyval函数用来求代数多项式的值,其调用格式为:Y=polyval(P,x)若x为一数值,则求多项式在该点的值;若x为向量或矩阵,则对向量或矩阵中的每个元素求其多项式的值。【例3】已知多项式x4+8x3-10,分别取x=1.2和一个2×3矩阵为自变量计算该多项式的值。A=[1,8,0,0,-10];%4次多项式系数x=1.2;%取自变量为一数值y1=polyval(A,x)y1=5.8976x=[-1,1.2,-1.4;2,-1.8,1.6];%给出一个矩阵xy2=polyval(A,x)y2=-17.00005.8976-28.110470.0000-46.158429.32164.矩阵多项式求值polyvalm函数用来求矩阵多项式的值,其调用格式与polyval相同,但含义不同。polyvalm函数要求x为方阵,它以方阵为自变量求多项式的值。设A为方阵,P代表多项式x3-5x2+8,那么polyvalm(P,A)的含义是:A*A*A-5*A*A+8*eye(size(A))而polyval(P,A)的含义是:A.*A.*A-5*A.*A+8*ones(size(A))【例4】仍以多项式x4+8x3-10为例,取一个2×2矩阵为自变量分别用polyval和polyvalm计算该多项式的值。A=[1,8,0,0,-10];%多项式系数x=[-1,1.2;2,-1.8];%给出一个矩阵xy1=polyval(A,x)%计算代数多项式的值y1=-17.00005.897670.0000-46.1584y2=polyvalm(A,x)%计算矩阵多项式的值y2=-60.584050.649684.4160-94.35045多项式求根n次多项式具有n个根,当然这些根可能是实根,也可能含有若干对共轭复根。MATLAB提供的roots函数用于求多项式的全部根,其调用格式为:x=roots(P)其中P为多项式的系数向量,求得的根赋给向量x,即x(1),x(2),…,x(n)分别代表多项式的n个根。【例5】求多项式x4+8x3-10的根。命令如下:A=[1,8,0,0,-10];x=roots(A)x=-8.01941.0344-0.5075+0.9736i-0.5075-0.9736i二、数据统计处理(一)最大值和最小值

MATLAB提供的求数据序列的最大值和最小值的函数分别为max和min,两个函数的调用格式和操作过程类似。1.求向量的最大值和最小值求一个向量X的最大值的函数有两种调用格式,分别是:(1)y=max(X):返回向量X的最大值存入y,如果X中包含复数元素,则按模取最大值。(2)[y,I]=max(X):返回向量X的最大值存入y,最大值的序号存入I,如果X中包含复数元素,则按模取最大值。2.求矩阵的最大值和最小值

求矩阵A的最大值的函数有3种调用格式,分别是:(1)max(A):返回一个行向量,向量的第i个元素是矩阵A的第i列上的最大值。(2)[Y,U]=max(A):返回行向量Y和U,Y向量记录A的每列的最大值,U向量记录每列最大值的行号。(3)max(A,[],dim):dim取1或2。dim取1时,该函数和max(A)完全相同;dim取2时,该函数返回一个列向量,其第i个元素是A矩阵的第i行上的最大值。3.两个向量或矩阵对应元素的比较函数max和min还能对两个同型的向量或矩阵进行比较,调用格式为:(1)U=max(A,B):A,B是两个同型的向量或矩阵,结果U是与A,B同型的向量或矩阵,U的每个元素等于A,B对应元素的较大者。(2)U=max(A,n):n是一个标量,结果U是与A同型的向量或矩阵,U的每个元素等于A对应元素和n中的较大者。min函数的用法和max完全相同。(二)求和与求积数据序列求和与求积的函数是sum和prod,其使用方法类似。设X是一个向量,A是一个矩阵,函数的调用格式为:sum(X):返回向量X各元素的和。prod(X):返回向量X各元素的乘积。sum(A):返回一个行向量,第i个元素是A的第i列的元素和。prod(A):返回一个行向量,第i个元素是A的第i列的元素乘积。sum(A,dim):dim=1时,该函数等同于sum(A);dim=2时,返回一个列向量,其第i个元素是A的第i行的各元素之和。prod(A,dim):dim=1时,该函数等同于prod(A);dim=2时,返回一个列向量,其第i个元素是A的第i行的各元素乘积。(三)平均值和中值求数据序列平均值的函数是mean,求数据序列中值的函数是median。两个函数的调用格式为:mean(X):返回向量X的算术平均值。median(X):返回向量X的中值。mean(A):返回一个行向量,其第i个元素是A的第i列的算术平均值。median(A):返回一个行向量,其第i个元素是A的第i列的中值。mean(A,dim):dim=1时,该函数等同于mean(A);dim=2时,返回一个列向量,其第i个元素是A的第i行的算术平均值。median(A,dim):dim=1时,该函数等同于median(A);dim=2时,返回一个列向量,其第i个元素是A的第i行的中值。(四)累加和与累乘积

在MATLAB中,使用cumsum和cumprod函数能方便地求得向量和矩阵元素的累加和与累乘积向量,函数的调用格式为:cumsum(X):返回向量X累加和向量。cumprod(X):返回向量X累乘积向量。cumsum(A):返回一个矩阵,其第i列是A的第i列的累加和向量。cumprod(A):返回一个矩阵,其第i列是A的第i列的累乘积向量。cumsum(A,dim):dim=1时,函数等同于cumsum(A);dim=2时,返回一个矩阵,其第i行是A的第i行的累加和向量。cumprod(A,dim):dim=1时,函数等同于cumprod(A);dim=2时,返回一个向量,其第i行是A的第i行的累乘积向量。(五)标准方差与相关系数1.求标准方差

在MATLAB中,提供了计算数据序列的标准方差的函数std。

std(X):返回一个标准方差。

std(A):返回一个行向量,每个元素是矩阵A各列或各行的标准方差。

Y=std(A,flag,dim)

缺省flag=0,dim=1当dim=1时,求各列元素的标准方差;当dim=2时,则求各行元素的标准方差。当flag=0时,按S1所列公式计算标准方差;当flag=1时,按S2所列公式计算标准方差。

【例6】对二维矩阵x,从不同维方向求出其标准方差。命令如下:x=[4,5,6;1,4,8];y1=std(x,0,1)y2=std(x,1,1)y3=std(x,0,2)y4=std(x,1,2)2.相关系数

MATLAB提供了corrcoef函数,可以求出数据的相关系数矩阵。corrcoef函数的调用格式为:corrcoef(X):返回从矩阵X形成的一个相关系数矩阵。此相关系数矩阵的大小与矩阵X一样。它把矩阵X的每列作为一个变量,然后求它们的相关系数。corrcoef(X,Y):在这里,X,Y是向量,它们与corrcoef([X,Y])的作用一样。【例7】生成满足正态分布的10000×5随机矩阵,然后求各列元素的均值和标准方差,再求这5列随机数据的相关系数矩阵。命令如下:X=randn(10000,5);M=mean(X)D=std(X)R=corrcoef(X)(六)排序

MATLAB中对向量X是排序函数是sort(X),函数返回一个对X中的元素按升序排列的新向量。

[Y,I]=sort(A,dim):对矩阵A的各列或各行重新排序若dim=1,则按列排;若dim=2,则按行排。

Y是排序后的矩阵,而I记录Y中的元素在A中位置。【例8】对下列矩阵做各种排序。A=[1,-8,5;4,12,6;13,7,-13];sort(A)%对A的每列按升序排序-sort(-A,2)%对A的每行按降序排序[X,I]=sort(A)

%对A按列排序,并将每个元素所在的行号送矩阵I(一)一维数据插值数据插值的任务是根据采集到的离散数据构造一个函数g(x),既与真实函数f(x)接近,又有很好的性质。Y1=interp1(X,Y,X1,'method')

一维插值函数根据X,Y的值,计算函数在X1处的值。X,Y是两个等长的已知向量,分别描述采样点和样本值,X1是一个向量或标量,描述欲插值的点,Y1是与X1等长的插值结果。method是插值方法,例如:‘linear’线性插值‘nearest’最近点插值‘cubic’三次多项式插值‘spline’三次样条插值或Y1=spline(X,Y,X1)计算三次样条插值的专门函数三、数据插值注意:X1的取值范围不能超出X的给定范围,否则,会给出“NaN”错误。【例9】某观测站测得某日6:00时至18:00时之间每隔2小时的室内外温度(℃),用3次样条插值分别求得该日室内外6:30至17:30时之间每隔2小时各点的近似温度(℃)。解:设时间变量h为一行向量,温度变量t为一个两列矩阵,其中第一列存放室内温度,第二列储存室外温度。命令如下:h=6:2:18;t=[18,20,22,25,30,28,24;15,19,24,28,34,32,30]';XI=6.5:2:17.5YI=interp1(h,t,XI,'spline')%用3次样条插值计算(二)二维数据插值

在MATLAB中,提供了解决二维插值问题的函数interp2,其调用格式为:Z1=interp2(X,Y,Z,X1,Y1,'method')

其中X,Y是两个向量,分别描述两个参数的采样点,Z是与参数采样点对应的函数值,X1,Y1是两个向量或标量,描述欲插值的点。Z1是根据相应的插值方法得到的插值结果。method的取值与一维插值函数相同。X,Y,Z也可以是矩阵形式。同样,X1,Y1的取值范围不能超出X,Y的给定范围,否则,会给出“NaN”错误。【例10】设z=x2+y2,对z函数在[0,1]×[0,2]区域内进行插值。x=0:0.1:1;y=0:0.2:2;[X,Y]=meshgrid(x,y);%产生自变量网格坐标Z=X.^2+Y.^2;

%求对应的函数值interp2(x,y,Z,0.5,0.5)

%在(0.5,0.5)点插值【例11】某实验对一根长10米的钢轨进行热源的温度传播测试。用x表示测量点0:2.5:10(米),用h表示测量时间0:30:60(秒),用T表示测试所得各点的温度(℃)。试用线性插值求出在一分钟内每隔20秒、钢轨每隔1米处的温度TI。x=0:2.5:10;h=[0:30:60]';T=[95,14,0,0,0;88,48,32,12,6;67,64,54,48,41];xi=[0:10];hi=[0:20:60]';TI=interp2(x,h,T,xi,hi);mesh(xi,hi,TI)在MATLAB中,用polyfit函数来求得最小二乘拟合多项式的系数,再用polyval函数按所得的多项式计算所给出的点上的函数近似值。

[P,S]=polyfit(X,Y,m)函数根据采样点X和采样点函数值Y,产生一个m次多项式P及其在采样点的误差向量S。其中X,Y是两个等长的向量,P是一个长度为m+1的向量,P的元素为多项式系数。

polyval函数的功能是按多项式的系数计算x点多项式的值。四、曲线拟合【例12】用一个三次多项式在区间[0,2π]内逼近函数sin(x)。X=linspace(0,2*pi,50);Y=sin(X);[P,S]=polyfit(X,Y,3)%得到3次多项式的系数和误差五、数值积分与微分(一)数值积分1、变步长辛普生法基本思想都是将整个积分区间[a,b]分成n个子区间[xi,xi+1],i=1,2,…,n,其中x1=a,xn+1=b。这样求定积分问题就分解为求和问题。MATLAB给出了quad和quadl函数来求定积分。[I,n]=quad('filename',a,b,tol,trace)[I,n]=quadl('filename',a,b,tol,trace)其中filename是被积函数名。a和b分别是定积分的下限和上限。tol用来控制积分精度,缺省时取tol=10-6。trace控制是否展现积分过程,若取非0则展现积分过程,取0则不展现,缺省时取trace=0。返回参数I即定积分值,n为被积函数的调用次数。【例13】求定积分解:(1)建立被积函数文件fesin.m:functionf=fesin(x)f=exp(-0.5*x).*sin(x+pi/6);(2)调用数值积分函数quad求定积分:[S,n]=quad(‘fesin’,0,3*pi)或[S,n]=quadl(‘fesin’,0,3*pi)或[S,n]=quad(@fesin,0,3*pi)S=0.9008n=77quad函数采用自适应变步长方法求取定积分quadl函数则采用Lobbato方法求取定积分,计算精度和速度要高于quad函数方法。利用quadgk函数求解广义积分问题。2.被积函数由一个表格定义在MATLAB中,对由表格形式定义的函数关系的求定积分问题用trapz(X,Y)函数。其中向量X,Y定义函数关系Y=f(X)。【例14】用trapz函数计算定积分命令如下:X=1:0.01:2.5;Y=exp(-X);%生成函数关系数据向量trapz(X,Y)ans=0.28583、二重积分的数值求解使用MATLAB提供的dblquad函数就可以直接求出二重定积分的数值解。该函数的调用格式为:I=dblquad('f(x,y)',a,b,c,d,tol,trace)该函数求f(x,y)在[a,b]×[c,d]区域上的二重定积分。参数tol,trace的用法与函数quad完全相同。【例15】计算二重定积分解:(1)建立一个函数文件fxy.m:functionf=fxy(x,y)globalki;ki=ki+1;%ki用于统计被积函数的调用次数f=exp(-x.^2/2).*sin(x.^2+y);(2)调用dblquad函数globalki;ki=0;I=dblquad('fxy',-2,2,-1,1)I=1.57454、一般二重积分的数值求解MATLAB中没有提供求解一般的双重积分问题的函数在Mathworks公司的网站上有一个数值积分工具箱NIT(NumericalIntegrationToolbox)可以解决此问题。利用工具箱中的函数quad2dggen()可以直接求解此类问题。J=quad2dggen(Fun,Flower,Fupper,xm,xM,tol)默认tol=10-3,Fun描述二元被积函数,需要注意是:该函数指定的积分顺序是先x后y,若要求先y后x的积分,需要交换被积函数中x和y的顺序。【例16】计算二重定积分解:fh=@(x)sqrt(1-x.^2/2);fl=@(x)-sqrt(1-x.^2/2);f=@(y,x)exp(-x.^2/2).*sin(x.^2+y);y=quad2dggen(f,fl,fh,-1/2,1,eps)y=0.41195、三重及多重积分的数值求解长方体区域的三重积分问题的函数采用triplequad()函数可以求解此类问题。J=triplequad(Fun,xm,xM,ym,yM,zm,zM,tol,@quadl)默认tol=10-6。NIT工具箱也可以解决多重超长方体边界的定积分问题。使用quadndg()函数。该问题的求解语句为:J=quadndg(Fun[x1m,x2m,…,xpm],[x1M,x2M,…,xpM],tol)【例17】计算三重定积分解:f=@(x,y,z)4*x.*z.*exp(-x.*x.*y-z.*z);triplequad(f,0,2,0,pi,0,pi,1e-7,@equadl)ans=3.1081该工具箱中还有单重积分函数quadg()的调用格式同quad(),其效率也高于quadl()。(二)数值微分1、数值差分与差商高等数学关心的是导函数的形式和性质,而数值分析关心的问题是怎样计算导函数:

f'(x)=g(x)

在一串离散点X=(x1,x2,…,xn)的近似值G=(g1,g2,…,gn)以及所计算的近似值有多大误差。引进记号:称分别为函数在x点处以h(h>0)为步长的向前差分、向后差分和中心差分。称分别为函数在x点处以h(h>0)为步长的向前差商、向后差商和中心差商。当步长h(h>0)充分小时,函数f在点x的微分接近于函数在该点的任意种差分。f在点x的导数接近于函数在该点的任意种差商。2、数值微分的实现在MATLAB中,没有直接提供求数值导数的函数,只有计算向前差分的函数diff,其调用格式为:

DX=diff(X):计算X的向前差分计算向量X的向前差分,DX(i)=X(i+1)-X(i),i=1,2,…,n-1。

DX=diff(X,n):计算向量X的向前n阶差分计算X的n阶向前差分。例如,diff(X,2)=diff(diff(X))。DX=diff(A,n,dim)计算矩阵A的n阶差分,dim=1时(缺省状态),按列计算差分;dim=2,按行计算差分。【例18】设用不同的方法求函数f(x)的数值导数,并在同一个坐标系中做出f'(x)的图像。可以考虑用三种方法:1、用一个5次多项式p(x)拟合函数f(x),并对p(x)求一般意义下的导数dp(x),求出dp(x)在假设点的值;2、直接求f(x)在假设点的数值导数;3、求出g(x)=f‘(x)的表达式,然后求f’(x)在假设点的数值导数。程序如下:f=inline('sqrt(x.^3+2*x.^2-x+12)+(x+5).^(1/6)+5*x+2');g=inline('(3*x.^2+4*x-1)./sqrt(x.^3+2*x.^2-x+12)/2+1/6./(x+5).^(5/6)+5');x=-3:0.01:3;p=polyfit(x,f(x),5);%1。用5次多项式p拟合f(x)dp=polyder(p);%对拟合多项式p求导数dpdpx=polyval(dp,x);%求dp在假设点的函数值dx=diff(f([x,3.01]))/0.01;%2。直接对f(x)求数值导数gx=g(x);%3。求函数f的导函数g在假设点的导数plot(x,dpx,x,dx,'.',x,gx,'-');%作图六、方程组求解(一)线性方程组求解1、直接求解法利用左除运算符的直接解法对于线性方程组Ax=b,可以利用左除运算符“\”求解:x=A\b2、利用矩阵的分解求解线性方程组矩阵分解是指根据一定的原理用某种算法将一个矩阵分解成若干个矩阵的乘积。常见的矩阵分解有LU分解、QR分解、Cholesky分解,以及Schur分解、Hessenberg分解、奇异分解等。【例19】用直接求解法求解下列线性方程组命令如下:A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];b=[13,-9,6,0]';x=A\b(1)LU分解矩阵的LU分解就是将一个矩阵表示为一个下三角矩阵L和一个上三角矩阵U的乘积形式。线性代数中已经证明,只要方阵A是非奇异的,LU分解总是可以进行的。

MATLAB提供的lu函数用于对矩阵进行LU分解,其调用格式为:

[L,U]=lu(A):产生一个上三角阵U和一个变换形式的下三角阵L(行交换),使之满足A=LU。注意,这里的矩阵A必须是方阵。

[L,U,P]=lu(A):产生一个上三角阵U和一个下三角阵L以及一个置换矩阵P,使之满足PA=LU。当然矩阵A同样必须是方阵。实现LU分解后,线性方程组Ax=b的解x=U\(L\b)或x=U\(L\P*b),这样可以大大提高运算速度。

(2)QR分解对矩阵A进行QR分解,就是把A分解为一个正交矩阵Q和一个上三角矩阵R的乘积形式。QR分解只能对方阵进行。MATLAB的qr函数可用于对矩阵进行QR分解,其调用格式为:

[Q,R]=qr(A):产生一个一个正交矩阵Q和一个上三角矩阵R,使之满足A=QR。

[Q,R,E]=qr(A):产生一个一个正交矩阵Q、一个上三角矩阵R以及一个置换矩阵E,使之满足AE=QR。实现QR分解后,线性方程组Ax=b的解x=R\(Q\b)或x=E(R\(Q\b))。

(3)Cholesky分解如果矩阵A是对称正定的,则Cholesky分解将矩阵A分解成一个下三角矩阵和上三角矩阵的乘积。设上三角矩阵为R,则下三角矩阵为其转置,即A=R'R。MATLABchol函数用于对矩阵A进行Cholesky分解,其调用格式为:

R=chol(A):产生一个上三角阵R,使R'R=A。若X为非对称正定,则输出一个出错信息。

[R,p]=chol(A):这个命令格式将不输出出错信息。当A为对称正定的,则p=0,R与上述格式得到的结果相同;否则p为一个正整数。如果A为满秩矩阵,则R为一个阶数为q=p-1的上三角阵,且满足R'R=A(1:q,1:q)。实现Cholesky分解后,线性方程组Ax=b变成R'Rx=b,所以x=R\(R'\b)。(二)非线性方程数值求解1、单变量非线性方程求解

在MATLAB中提供了一个fzero函数,可以用来求单变量非线性方程的根。该函数的调用格式为:

z=fzero('fname',x0,tol,trace)

其中fname是待求根的函数文件名,x0为搜索的起点。一个函数可能有多个根,但fzero函数只给出离x0最近的那个根。tol控制结果的相对精度,缺省时取tol=eps,trace指定迭代信息是否在运算中显示,为1时显示,为0时不显示,缺省时取trace=0。【例20】求f(x)=x-10x+2=0在x0=0.5附近的根。步骤如下:

(1)建立函数文件funx.m。

functionfx=funx(x)

fx=x-10.^x+2;(2)调用fzero函数求根。

z=fzero(‘funx’,0.5)或z=fzero(@funx,0.5)z=0.37582、非线性方程组的求解

对于非线性方程组F(X)=0,用fsolve函数求其数值解。fsolve函数的调用格式为:

X=fsolve('fun',X0,option)

其中X为返回的解,fun是用于定义需求解的非线性方程组的函数文件名,X0是求根过程的初值,option为最优化工具箱的选项设定。最优化工具箱提供了20多个选项,用户可以使用optimset命令将它们显示出来。如果想改变其中某个选项,则可以调用optimset()函数来完成。例如,‘Display’选项决定函数调用时中间结果的显示方式,其中‘off’为不显示,‘iter’表示每步都显示,‘final’只显示最终结果。optimset('Display','off')将设定Display选项为‘off’。【例21】求下列非线性方程组在(0.5,0.5)附近的数值解。

(1)建立函数文件myfun.m。functionq=myfun(p)x=p(1);y=p(2);q(1)=x-0.6*sin(x)-0.3*cos(y);q(2)=y-0.6*cos(x)+0.3*sin(y);(2)在给定的初值x0=0.5,y0=0.5下,调用fsolve函数求方程的根。x=fsolve('myfun',[0.5,0.5]',optimset('Display','off'))x=0.63540.3734

将求得的解代回原方程,可以检验结果是否正确,命令如下:q=myfun(x)q=1.0e-009*0.23750.2957

可见得到了较高精度的结果。(三)

微分方程

MATLAB能够求解的微分方程类型包括:常微分方程初值问题常微分方程边值问题时滞微分方程初值问题偏微分方程任何高阶常微分方程都可以变换成一阶微分方程,即表示成右函数形式,这是利用龙格-库塔法求解微分方程的前提。

1.常微分方程初值问题的求解格式:[T,Y]=ode45(‘odefun’,tspan,y0)功能:返回由文件‘odefun’所定义的具有初始条件为y0、时间t变化范围为[t0,tfinal]的微分方程y‘=f(t,y)的解,其中tspan=[t0,tfinal]。向量T中的每一列对应着矩阵Y的每一列。ode45:此方法被推荐为首选方法ode23:这是一个比ode45低阶的方法ode113:用于更高阶或大的标量计算ode23t:用于解决难度适中的问题ode23s:用于解决难度较大的微分方程组ode15s:与ode23相同,但要求的精度更高ode23tb:用于解决难度较大的问题

【例22】设有初值问题

求其数值解,并与精确解比较(精确解为)。

(1)建立函数文件funt.m。functionyp=funt(t,y)yp=(y^2-t-2)/4/(t+1);(2)求解微分方程。t0=0;tf=10;y0=2;[t,y]=ode23('funt',[t0,tf],y0);%求数值解y1=sqrt(t+1)+1;%求精确解plot(t,y,'b.',t,y1,'r-');%通过图形来比较2.常微分方程边值条件的求解对于如下的微分方程:

用于边界条件的常微分方程求解问题:函数bvp4c格式:sol=bvp4c(‘odefun’,bcfun,solinit)其中‘odefun’为常微分方程函数,bcfun为边界条件函数,solinit为求解的初始值。输出sol是一个结构,它有4个属性。·sil.x

bvp4v选择的网格节点·sil.y

网格点sil.x处y(x)的近似值·sil.yp

网格点sil.x处y’(x)的近似值·sil.parameters

未知参数的值。如果存在未知参数,则求解函数会自动求得。【例23】求某微分方程初值问题在[1,3]区间内的数值解,并将结果与解析解进行比较。先建立一个该函数的m文件fxy1.m:functionf=f(x,y)f=-2.*y./x+4*x%注意使用点运算符return再输入命令:[X,Y]=ode45('fxy1',[1,3],2);X'%显示自变量的一组采样点Y'%显示求解函数与采样点对应的一组数值解(X.^2+1./X.^2)'%显示求解函数与采样点对应的一组解析解3.常微分方程的解析解(即符号计算解微分方程)该函数的具体调用格式为r=dsolve(‘eq1,eq2,...’,‘cond1,cond2,...’,‘v’)r=dsolve('eq1','eq2',...,'cond1','cond2',...,'v')其中eq1、eq2等表示待求解的方程,默认的自变量为x,也可以自己规定如v,y等。微分方程中用D表示各阶导数项,如Dy表示或;如果在D后面带有数字,则表示多阶导数,如D2y表示或。cond1、cond2等表示初始值,通常表示为y(a)=b或者Dy(a)=b。如果不指定初始值,或者初始值方程的个数少于因变量的个数,则最后得到的结果中会包含常数项,表示为C1、C2等。dsolve

函数最多接受12个输入参数。例:某一阶微分方程dsolve('Dx=y','Dy=x','x(0)=0','y(0)=1')ans=x(t)=sin(t),y(t)=cos(t)例:某二阶微分方程dsolve('D2y=-a^2*y','y(0)=1','Dy(pi/a)=0')ans=cos(a*x)例y=dsolve('D2y+2*Dy+2*y=0','y(0)=1','Dy(0)=0')ans=exp(-x)*cos(x)+exp(-x)*sin(x)ezplot(y)——方程解y(t)的时间曲线图求该方程的解MATLAB可以求解一般的偏微分方程,也可以利用偏微分方程工具箱(PDE

Toolbox)中给出的相当函数求解一些偏微分方程。1、偏微分方程组的求解考虑如下的偏微分方程:(四)

偏微分方程该偏微分方程可以编写下面的函数表示,其入口为:其中pdefun为函数名。由给定的输入变量即可计算出c,f,s这三个函数。边界条件可以用以下函数描述:边值函数可以编写为一个MATLAB函数:初始条件函数可以表示为:即:MATLAB提供了pdepe()函数来求解该问题的数值解。其基本调用格式为:sol=pdepe(m,@pdefun,@pdeic,@pdebc,x,t)其中有t0<t<tf

,a<x<b,,m=0、1或2。如果m>0,则必须a>0。【例24】试求解下面的偏微分方程。其中:初始条件:边界条件:原方程改写为:由此可见m=0,且:描述偏微分方程的函数:function[c,f,s]=c7mpde(x,t,u,du)c=[1;1];y=u(1)-u(2);F=exp(5.73*y)-exp(-11.46*y);s=F*[-1;1];f=[0.024*du(1);0.17*du(2)];写出边值方程:左边界:右边界:描述边界条件的MATLAB函数:function[pa,qa,pb,qb]=c7mpbc(xa,ua,xb,ub,t)pa=[0;ua(2)];qa=[1;0];pb=[ub(1)-1;0];qb=[0;1];描述初值的MATLAB函数:u0=@(x)[1;0];求解此微分方程,并得出解.x=0:.05:1;t=0:.05:2;m=0;sol=pdepe(m,@c7mpde,u0,@c7mpbc,x,t);surf(x,t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论