MATLAB求解微分方程
matlab function求解微分方程

Matlab Function求解微分方程引言微分方程是描述自然和社会现象中的变化规律的数学工具,它在许多领域中都具有重要的应用价值。
在数值计算中,利用计算机求解微分方程成为一种常用的方法。
Matlab是一款强大的科学计算软件,它提供了丰富的函数库和工具箱,可以方便地求解各种类型的微分方程。
本文将介绍如何使用Matlab Function来求解微分方程,并通过实例说明其具体应用。
Matlab Function概述Matlab Function是Matlab中用于定义函数的关键字。
函数是一段完成特定任务的代码,可以接受输入参数并返回输出结果。
在求解微分方程中,可以通过定义一个函数来描述微分方程的数学形式,并使用Matlab内置的数值求解器来求解该微分方程。
通过封装微分方程的求解过程为一个函数,可以提高代码的复用性和可读性。
求解一阶微分方程定义微分方程函数首先需要定义微分方程的函数形式。
以一阶常微分方程dy/dx=f(x, y)为例,其中f(x, y)为已知函数。
在Matlab中,可以通过以下方式定义函数:function dy = f(x, y)dy = % 根据微分方程形式计算dy/dx的表达式end在函数中,输入参数 x 和 y 表示自变量和因变量,输出参数 dy 表示微分方程的导数值。
实际使用时,需要根据具体问题自行定义 f(x, y) 的表达式。
求解微分方程定义好微分方程函数后,可以使用Matlab内置的数值求解器来求解微分方程。
以求解某一点上的导数为例,可以使用以下代码:y0 = % 指定求解点的因变量值dydx = f(x0, y0); % 调用微分方程函数求解导数值通过以上代码,可以获得求解点上的导数值。
需要注意的是,求解点的自变量值和因变量值需要根据具体问题进行设定。
求解二阶微分方程转化为一阶微分方程组对于二阶常微分方程d2y/dx2=f(x, y, dy/dx),可以通过引入新的变量z=dy/dx,将其转化为一阶微分方程组。
用Matlab解微分方程

用Matlab 软件求解微分方程1.解析解(1)一阶微分方程 求21y dxdy +=的通解:dsolve('Dy=1+y^2','x') 求y x dxdy -+=21的通解:dsolve('Dy=1+x^2-y','x') 求⎪⎩⎪⎨⎧=+=1)0(12y y dx dy 的特解:dsolve('Dy=1+y^2',’y(0)=1’,'x')(2)高阶微分方程 求解⎩⎨⎧-='==-+'+''.2)2(,2)2(,0)(222πππy y y n x y x y x 其中,21=n ,命令为: dsolve('x^2*D2y+x*Dy+(x^2-0.5^2)*y=0','y(pi/2)=2,Dy(pi/2)=-2/pi','x') 求042=-+'-'''x y y y 的通解,命令为:dsolve('D3y-2*Dy+y-4*x=0','x')输出为:ans=8+4*x+C1*exp(x)+C2*exp(-1/2*(5^(1/2)+1)*x)+C3*exp(1/2*(5^(1/2)-1)*x)(3)一阶微分方程组求⎩⎨⎧+-='+=').(3)(4)(),(4)(3)(x g x f x g x g x f x f 的通解:[f,g]=dsolve('Df=3*f+4*g','Dg=-4*f+3*g','x') 输出为: f =exp(3*x)*(cos(4*x)*C1+sin(4*x)*C2)g =-exp(3*x)*(sin(4*x)*C1-cos(4*x)*C2)若再加上初始条件1)0(,0)0(==g f ,则求特解:[f,g]=dsolve('Df=3*f+4*g','Dg=-4*f+3*g','f(0)=0,g(0)=1','x')输出为: f =exp(3*x)*sin(4*x)g =exp(3*x)*cos(4*x)2.数值解(1)一阶微分方程⎪⎩⎪⎨⎧=≤≤-=.1)0(,10,2y x y x y dxdy 现以步长h=0.1用“4阶龙格—库塔公式”求数值解: 先建立“函数M —文件”:function f=eqs1(x,y)f=y-2*x/y;再命令: 格式为:[自变量,因变量]=ode45(‘函数文件名’,节点数组,初始值) 命令为: [x,y]=ode45('eqs1',0:0.1:1,1)若还要画图,就继续命令: plot(x,y)(2)一阶微分方程组⎪⎩⎪⎨⎧==+-='≤≤-+='.3.0)0(,2.0)0(,2sin ,10,2cos 21212211y y y y x y x y y x y 只须向量化,即可用前面方法: function f=eqs2(x,y)f=[cos(x)+2*y(1)-y(2);sin(x)-y(1)+2*y(2)];将此函数文件,以文件名eqs2保存后,再下命令:[x,y]=ode45('eqs2',0:0.1:1,[0.2;0.3])(注:输出的y 是矩阵,第i 列为函数i y 的数值解)要画图,继续命令:hold on,plot(x,y(:,1)),plot(x,y(:,2)),hold off(3)高阶微分方程先化成一阶微分方程组,再用前面方法。
用Matlab求解微分方程

解微分⽅程有两种解,⼀种是解析解,⼀种是数值解,这两种分别对应不同的解法利⽤dsolve 函数进⾏求解syms x;s = dsolve('eq1,eq2,...', ’cond1,cond2,...', 'v');%eq :微分⽅程%cond :条件%v :独⽴变量%形如:⽅程:y'= f(t,y),初值:y(t0) = y0dsolve('Du = 1+ u^2','t')ans =tan(C2 + t)1i-1i求的解析解s = dsolve('D2y=3*y+2*x','x');% D2y ⽤以表⽰y 的⼆阶导数,默认是以t 为⾃变量的,所以最好指明⾃变量为x.syms y(x);s = dsolve([diff(y,x,2) == 3*y+2*x], [y(0) == 5])% diff 内依次是函数、⾃变量、微分阶数,⽅程⽤==表⽰相等⽽不是赋值求初值问题s = dsolve('Dy = y - 2*t / y','y(0) =1');求边界问题s = dsolve('x*D2y - 3*Dy =x^2','y(1)=0','y(5) = 0','x');求解⽅程s=dsolve('D2y =cos(2*x) - y','y(0) =1','Dy(0) = 0','x');simplify(s);(eqn,cond,‘IgnoreAnalyticConstraints’,false) %设置不化简结果求解⽅程组[f,g]= dsolve('Df = f + g','Dg = -f + g','f(0)=1','g(0) = 2','x');⽤Matlab 求解微分⽅程⽤Matlab 求解微分⽅程解析解1.求解析解2.初值问题3.边界问题4.⾼阶⽅程5.⽅程组问题⼀些例⼦dsolve('D2y+4*Dy+29*y = 0','y(0) = 0','Dy(0)= 15 ','x')ans =3*sin(5*x)*exp(-2*x)[x y z] = dsolve('Dx = 2*x-3*y+3*z','Dy = 4*x-5*y+3*z','Dz = 4*x-4*y+2*z')x =C7*exp(2*t) + C8*exp(-t)y =C7*exp(2*t) + C8*exp(-t) + C9*exp(-2*t)z =C7*exp(2*t) + C9*exp(-2*t)%可以对其进⾏简化操作x = simplify(x)x = C7*exp(2*t) + C8*exp(-t)y = simplify(y)y =exp(-2*t)*(C9 + C8*exp(t) + C7*exp(4*t))%龙格库塔法(Runge-Kutta 法)xfun=@(t,x)0.3.*x.*(1-x/8); %定义赋值函数r=0.3,k=8[tout,xout]=ode45(fun,[0,40],0.1) %⽅程数值解,四五阶RK 法[tout,xout]=ode23(xfun,[t0,tfinal],x0) %⼆三阶RK 法%%ode 系列数值求解形如 / = ( , )的微分⽅程组, 并绘图。
matlab 求解微分方程

matlab 求解微分方程
在 MATLAB中可以使用 ode45 或者 ode15s 函数来求解常微分方程。
如果想要求解初值问题,可以使用 ode45 函数,语法如下:
```
tspan = [t0, tf]; % t0为初始时刻,tf为结束时刻
y0 = [y1, y2, ..., yn]; % y1, y2, ..., yn为初始条件
[t, y] = ode45(@(t, y) diffeq(t, y), tspan, y0);
```
其中,`diffeq` 是一个用户定义的函数,用来表示微分方程的右端,它的输入参数为时间 t 和状态变量 y,输出为微分方程的右端的值。
`t` 是时间向量,`y` 是状态变量的解。
如果想要求解延迟微分方程或者刚性微分方程,可以使用ode15s 函数,语法和 ode45 函数类似:
```
[t, y] = ode15s(@(t, y) diffeq(t, y), tspan, y0);
```
需要注意的是,求解微分方程之前,需要先定义好微分方程的右端函数 `diffeq` 。
第三章-matlab求解微积分

第三章 微积分的数学实验3.1极限与一元微积分3.1.1 初等运算1.定义单个或多个符号变量:syms x y z t ;定义单个符号变量或者符号函数还可以用单引号定义,如x=’x ’,f=’sin(x^2)+2*x-1’。
符号表达式的反函数运算g=finverse(f),g 是返回函数f 的反函数。
例1 求sin(1)y x =-的反函数>>syms x>>y=sin(x-1); g=finverse(y),结果为 g=1+asin(t)2. f actor(f) 因式分解函数f3.Collect(f) 对函数f 合并同类项4. expand(f) 将函数f 表达式展开5. simple(f) 找出表达式的最简短形式(有时需要用2次)6. roots (p )对多项式p 求根函数。
7. solve(F) 一般方程的求根函数例2 解方程2510x x +-=解 >>syms x>>solve(x^2+5*x-1)结果为x =[ -5/2+1/2*29^(1/2) -5/2-1/2*29^(1/2)]8.fzero(f,x0)或fzero(f,[a,b]) 在初始点x0处开始或在区间[a,b]上搜索函数的零点,f(a)与f(b)需要符号相反。
3.1.2 Matlab计算函数的极限函数形式:1)limit(F,x,a),求函数F在 x ->a时的极限。
2)limit(F,a),默认其中的变量为极限变量.3)limit (F),默认其中的变量为极限变量且趋向于0.4)limit(F,x,a,'right')或limit(F,x,a,’left') 求函数F在x->a时的右、左极限.例3 >>syms x a t h; %syms作用是申明x,a,t,h是符号变量,不需先赋值再调用。
>>limit(sin(x)/x) %结果为 1>>limit((x-2)/(x^2-4),2) %结果为 1/4>>limit((1+2*t/x)^(3*x),x,inf) %结果为 exp(6*t)>>limit(1/x,x,0,'right') %结果为 inf>>limit(1/x,x,0,'left') %结果为 -inf>>limit((sin(x+h)-sin(x))/h,h,0) %结果为 cos(x)>>v = [(1 + a/x)^x, exp(-x)];limit(v,x,inf,'left') %结果为[exp(a),0]3.1.3 Matlab计算导数与微分1.一元导数和微分diff函数用以计算函数的微分和导数,相关的函数语法有下列4个:diff(f) 返回f对预设独立变量的一次导数值diff(f,'t')或diff(f,t) 返回f对独立变量t的一次导数(值)diff(f,n) 返回f对预设独立变量的n阶导数(值)diff(f,'t',n) 或diff(f,t,n)返回f对独立变量t的n阶导数(值)这里尽管自变量已经作为符号变量,可以不用syms说明,但是在具体执行diff(f)、diff(f,'t')和diff(f,t)会出现差异,有的能够执行,有的不能够,有的执行符号微分,有的执行数值微分,所以比较麻烦。
matlab解带参数的微分方程

matlab解带参数的微分方程微分方程是描述物理和数学问题的重要方程之一。
它通常用于描述系统随时间的变化,并且在工程、物理、生物和经济等领域中都有广泛的应用。
MATLAB是一种强大的数值计算软件,可以用于解决微分方程的数值近似解。
在MATLAB中,可以使用ode45函数来求解带参数的微分方程。
ode45函数是一种常用的数值求解微分方程的方法,它使用了龙格-库塔(Runge-Kutta)方法,并具有自适应步长控制和误差控制的功能,因此能够较准确地求解微分方程。
首先,我们需要定义一个匿名函数来表示微分方程。
假设我们要求解的微分方程是dy/dt = f(t, y, p),其中y是未知函数的值,t 是自变量的值,p是参数。
可以使用如下方式定义这个函数:```MATLABfunction dydt = myODE(t, y, p)dydt = f(t, y, p); % f是一个给定的函数,用于计算dy/dtend```然后,我们可以使用ode45函数来求解微分方程。
其中,tspan表示求解的时间区间,y0表示初始条件,p表示参数。
可以使用如下方式调用ode45函数:```MATLAB[t, y] = ode45(@(t, y) myODE(t, y, p), tspan, y0);```在这个例子中,@(t, y) myODE(t, y, p)是一个匿名函数,它将t 和y作为输入,调用myODE函数来计算dy/dt,然后返回结果。
ode45函数将返回一个时间向量t和一个与t对应的解向量y。
在解得微分方程后,可以使用plot函数将结果可视化。
例如,如果要绘制y关于t的图像,可以使用如下方式:```MATLABplot(t, y);xlabel('t');ylabel('y');title('Solution of the differential equation');```以上代码将绘制出y关于t的图像,并添加了合适的坐标轴标签和标题。
Matlab微分方程的解法

-0.5
-0.55
-0.6
-0.65
-0.7
-0.75
-0.8
-0.85
-0.9
-0.95
-1
0
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
1
time t0=0,tt=1
图3 给定新的初始数据,由函数xprim2定义的ODE解的图形
(d) 求解下面方程组并不难:
x x x x ì ' = - 0.1
在下面的初值问题中,有两个未知函数:x1(t)和x2(t),并用以下式子表达其微... 页码,1/11
Matlab关于微分方程的解法
MATLAB使用龙格-库塔-芬尔格(Runge-Kutta-Fehlberg)方法来解ODE问题。在有限点内计算求解。而 这些点的间距有解的本身来决定。当解比较平滑时,区间内使用的点数少一些,在解变化很快时,区间内应使 用较多的点。 为了得到更多的有关何时使用哪种解法和算法的信息,推荐使用helpdesk。所有求解方程通用的语法或句法在 命令集中头两行给出。时间间隔将以向量t=[t0,tt]给出。 命令ode23可以求解(2,3)阶的常微分方程组,函数ode45使用(4,5)阶的龙格-库塔-芬尔格方法。注意,在这种情 况下x’是x的微分不是x的转置。 在命令集中solver将被诸如ode45函数所取代。
0.6
0.55
0.5
0
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
1
time t0=0,tt=1
图1 由函数xprim1定义的ODE解的图形
(b) 解下面的ODE过程是等价的:
ïíìx' = x2
ïîx(0) = 1
matlab微分方程的求解

Matlab 程序设计:微分方程求解主讲人:王佐才1.引言Matlab能够求解的微分方程包括:常微分方程的初值问题,常微分方程的边值问题,时变常微分方程的初值问题,以及偏微分方程。
2.常微分方程的初值问题Matlab可以求解的常微分方程包括:显示常微分方程:y′=f(t, y)线性隐式常微分方程:M(t,y)y′=f(t, y), 其中,M(t,y)为矩阵。
全隐式常微分方程:f(t, y, y′)=03.利用Matlab编程时需要用的主要命令ode45: 基于显示Runge-Kutta(4,5)方法求解。
对于多数方程来讲,ode45是最佳的尝试函数命令。
ode23:基于显示Runge-Kutta(2,3)方法求解。
ode113:利用变阶Adams-Bashforth-Moulton 算法求解。
与ode45函数相比,该方程对于精密度步长及方程难于估计时效更好,但是该方法是多步算法,需要用到前面几个节点的信息来求解当前节点,效率较低。
4.ode45调用格式[t, x]=ode45(@myode, [t0:dt:t1], initial_condition)从调用格式来看,首先必须生成函数文件“myode”。
function dydt=myode(t,y)dydt=[fun1; fun2;…;funn];end5.应用实例一:求解微分方程:(1+y2)y′−2y=0,初值y(0)=1时, t从0至10时刻的解。
function dydt=myode(t,y)dydt=[y(1)*2./(1+y(1).^2)];end[t, y]=ode45(@myode, [0:0.01:10], [1])求解范德蒙方程y′′−(1−y2)y′+y=0的解。
时间0至20,初值y(0)=2, y’(0)=0。
function dydt=myode(t,y)dydt=[y(2);(1-y(1)^2)*y(2)-y(1)];end[t, y]=ode45(@myode, [0:0.01:20], [2; 0])7.应用实例三:一质点在空中飞行,所受的空气阻力方向始终与速度方向相反,大小与速度平方成正比。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
20 15 10 5 0 -5 -10 -15 -20 -10
0
10
20
30
40
50
30
20
10
0
-10
-20
-30 -10
0
10
20
30
40
50
30
20
10
0
-10
-20
-30 -20
-15
-10
-5
0
5
10
15
20
求微分方程的解析解
dsolve(‘方程1’, ‘方程2’,…‘方程n’, ‘初始条件’, ‘自变量’) 记号: 在表达微分方程时,用字母D表示求微分,D2、D3 等表示求高阶微分. 任何D后所跟的字母为因变量, 自变量可以指定或由系统规则选定为确省
例1
dx 2 1 x dt
MATLAB命令:dsolve(‘Dx=1+x*x’)
•
2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2.5
1.5
1
0.5
0 1 0 -1
0 10 20 30 40 50 60 70 80 90 100
1 -2 -3 -2 0 -1
微分方程求解时参数传递方法一
• 假设上例中参数a,b,c的值在运行时确定,我们可 以这样建立函数文件rosslersolve.m • function rosslersolve(a,b,c) • rossler1=@(t,y,a,b,c)[-y(2)-y(3),y(1)+a*y(2),b+(y(1)c)*y(3)]'; • rossler2=@(t,y)rossler1(t,y,a,b,c); • ts=[0 100];x0=[0 0 0]; • [t,y]=ode45(rossler2,ts,x0); • plot3(y(:,1),y(:,2),y(:,3))
• Matlab命令行输入>>rosslersolve(0.2,2,3) • 求解参数a,b,c的值为0.2,2,3时的rossler方程
参数传递方法二
• • • • • • • • Lorenz=@(t,y,beta,rho,sigma)... [-beta*y(1)+y(2)*y(3) -rho*(y(2)-y(3)) -y(1)*y(2)+sigma*y(2)-y(3)]; ts=[0,100];x0=[0 0 1e-10]; [t,y]=ode45(Lorenz,ts,x0,[],8/3,10,28); plot(y(:,1),y(:,2));figure;plot(y(:,1),y(:,3)); figure;plot(y(:,2),y(:,3));
化为一阶微分方程组:
• STEP2 建立M文件 • function dy=vdp(t,y) dy=[y(2); 1000*(1-y(1)^2)*y(2)-y(1);]
STEP3 调用MATLAB 函数ODE15S [T,Y]=ode15s('vdp',[0 3000],[2 0]); plot(T,Y(:,1))
图形结果
2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2.5
0
500
1000
1500
2000
2500
3000
使用匿名函数,STEP2 和STEP3 可以合并为 • vdp2=@(t,y)[y(2),1000*(1-y(1)^2)*y(2)-y(1)]'; • % vdp2为匿名函数 [T,Y]=ode15s(vdp2,[0,3000],[2 ,0]); plot(T,Y(:,1))
结果:x=tan(t+C1)
d 2x t 2 x x 2 y e dt 2 例2 d y 4 x 3 y 4e t dt
MATLAB命令: [x,y]=dsolve('D2x+2*Dx=x+2*y-exp(-t)',... 'Dy=4*x+3*y+4*exp(-t)'); 结果:x=-6*t*exp(-t)+C1*exp(-t)+C2*exp((1+6^(1/2))*t)+ C3*exp((1-6^(1/2))*t) y=6*t*exp(-t)-C1*exp(-t)+4*C2*exp((1+6^(1/2))*t)+ 2*C2*exp((1+6^(1/2))*t)*6^(1/2)+4*C3*exp((1-6^(1/2))*t)2*C3*exp((1-6^(1/2))*t)*6^(1/2)+1/2*exp(-t)
d 2x 2 dx 2 1000(1 x ) x 0 例3 dt dt x(0) 2; x' (0) 0
STEP1
令 y1=x,y2=y1’
y1 ' y2 2 (1 y1 ) y2 y1 y2 ' 1000 y (0) 2, y (0) 0 1 2
dx y z dt dy 例( 4 Rossler方程) x ay dt dz dt b ( x c) z
选定a=0.3,b=2,c=3 初值x(0)=0,y(0)=0,z(0)=0
• a=0.3;b=2;c=3; • rossler=@(t,y)[-y(2)-y(3),y(1)+a*y(2),b+(y(1)c)*y(3)]'; • ts=[0 100];x0=[0 0 0]; • [t,y]=ode45(rossler,ts,x0); • plot(t,y(:,1),'r',t,y(:,2),'b',t,y(:,3),'g'); • figure • plot3(y(:,1),y(:,2),y(:,3))
用Matlab求微分方ห้องสมุดไป่ตู้的数值解
[t,x]=solver(’f’,ts,x0,options)
自变 量值 函数 值 ode45 ode23 ode113 ode15s ode23s 由待解 方程写 成的m文件名 ts=[t0,tf], t0、tf为自 变量的初 值和终值 函数的 初值
用于设定误差限(缺省时设定相对误差10-3, 绝对误差10-6), 命令为:options=odeset(’reltol’,rt,’abstol’,at), rt,at:分别为设定的相对误差和绝对误差.