用Matlab求解微分方程

解微分方程有两种解,一种是解析解,一种是数值解,这两种分别对应不同的解法

解析解

利用dsolve函数进行求解

syms  x;
s = dsolve('eq1,eq2,...', ’cond1,cond2,...', 'v');
%eq:微分方程
%cond:条件
%v:独立变量
%形如:方程:y'= f(t,y),初值:y(t0) = y0

1.求解析解

 dsolve('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内依次是函数、自变量、微分阶数,方程用==表示相等而不是赋值

2.初值问题

求初值问题

s = dsolve('Dy = y - 2*t / y','y(0) =1');

3.边界问题

求边界问题

s = dsolve('x*D2y - 3*Dy =x^2','y(1)=0','y(5) = 0','x');

4.高阶方程

求解方程

s=dsolve('D2y =cos(2*x) - y','y(0) =1','Dy(0) = 0','x');
simplify(s);
(eqn,cond,‘IgnoreAnalyticConstraints’,false) %设置不化简结果

5.方程组问题

求解方程组

[f,g]= dsolve('Df = f + g','Dg = -f + g','f(0)=1','g(0) = 2','x');

一些例子

 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系列数值求解形如 / = ( , )的微分方程组, 并绘图。
xfun: 输入参数,函数必须恰有t,x两个变量,用函数文件定义的fun.m则用@fun或‘fun’调用。
t0:输入参数,t的初始值。
tfinal:输入参数,t的终值。
x0:输入参数,x的初始值。
tout: 离散的自变量值, xout: 离散的函数值。
%%

同时也有一些其他的求解语句和输出语句

%%
其他的求解语句
ode45 ode113 ode15s
ode23s ode23t ode23tb
其他的输出语句
odeplot odeprint
odephas2 odephas3
%%

一个例子

求的数值解

首先对该方程进行换元然后建立m文件

function fyy=rhf(t,x)
fyy=[y(1).*(1-y(2).^2)+y(2);y(1)];
end

最后计算数值解

y0=[0.25,0]’;
[t,y]=ode23(‘rhf’,[0,0.25],y0);
plot(t,y)

一些例子

%vdp1000.m

function dy = vdp1000(t,y)
dy = zeros(2,1);
dy(1) = y(2);
dy(2) = 1000*(1-y^2)*y2-y1;
end
%命令行输入
[T,Y] = ode15s('vdp1000',[0 3000],[2 0]);%第一个参数是文件名,第二个参数是初始时间和终止时间第三个参数是y1和y2的初值
plot(T,Y(:,1),'-');
%结果是T时间

plot(T,Y(:,1),'-k');,画Y数组中的第一列数随着T的变化曲线,‘-k’表示颜色黑色实线,




%定义函数
function dy=eq1(x,y)
dy=zeros(2,1);
dy(1)=y(2);
dy(2)=1/5*sqrt(1+y(1)^2)/(1-x);
end 调用
x0=0;
xf=0.9999;
[x,y]=ode15s('eq1',[x0 xf],[0 0]);
plot(x,y(:,1),'-')
hold on
y=0:0.01:2;
plot(1,y,'*')

微分方程模型

1.种群增长Logistic模型

  • N(t)表示在时刻 t时刻种群数量
  • r 表示种群的内禀增长率,即在没有资源限制下的种群增长率
  • K表示环境载量,反映资源环境对种群增长的制约作用

2.生物种群竞争模型

  • 用 N1(t)和N2(t) 分别表示在时刻 甲、乙两个种群数量。
  • a11 表示种群甲自身的被抑制的情况
  • a12 表示种群乙对种群甲的竞争力

参考: https://zhuanlan.zhihu.com/p/162296418

用Matlab求解微分方程的更多相关文章

  1. MATLAB求解代数方程、微分方程的一些常用指令

    MATLAB版本:R2015b 1.求解符号矩阵的行列式.逆.特征值.特征向量 A = sym('[a11, a12; a21, a22]');deltaA = det(A)invA = inv(A) ...

  2. 龙哥库塔法or欧拉法求解微分方程matlab实现

    举例:分别用欧拉法和龙哥库塔法求解下面的微分方程 我们知道的欧拉法(Euler)"思想是用先前的差商近似代替倒数",直白一些的编程说法即:f(i+1)=f(i)+h*f(x,y)其 ...

  3. Matlab学习——求解微分方程(组)

    介绍: 1.在 Matlab 中,用大写字母 D 表示导数,Dy 表示 y 关于自变量的一阶导数,D2y 表示 y 关于自变量的二阶导数,依此类推.函数 dsolve 用来解决常微分方程(组)的求解问 ...

  4. matlab 求解线性规划问题

    线性规划 LP(Linear programming,线性规划)是一种优化方法,在优化问题中目标函数和约束函数均为向量变量的线性函数,LP问题可描述为: minf(x):待最小化的目标函数(如果问题本 ...

  5. fslove - Matlab求解多元多次方程组

    fslove - Matlab求解多元多次方程组 简介: 之前看到网上的一些资料良莠不齐,各种转载之类的,根本无法解决实际问题,所以我打算把自己的学到的总结一下,以实例出发讲解fsolve. 示例如下 ...

  6. ode45求解微分方程(MATLAB)

    首先介绍一下ode45的格式: [t,y] = ode45(odefun,tspan,y0) [t,y] = ode45(odefun,tspan,y0,options) [t,y,te,ye,ie] ...

  7. MATLAB求解二重积分案例

    凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 定积分解决的是一维连续量求和的问题,而解决多维连续量的求和问题就要用到重积分了.重积分是建立在定积分的基础上的 ...

  8. yalmip + lpsolve + matlab 求解混合整数线性规划问题(MIP/MILP)

    最近建立了一个网络流模型,是一个混合整数线性规划问题(模型中既有连续变量,又有整型变量).当要求解此模型的时候,发现matlab优化工具箱竟没有自带的可以求解这类问题的算法(只有bintprog求解器 ...

  9. MATLAB求解非线性方程组

    matlab中有专门的solve函数来解决方程组的(a-x)^2+(b-y)^2=e^2(C-x)^2+(D-y)^2=v^2已知a,b,c,d,e,v 值求解 X,Y 请问用 matlab 如何写, ...

随机推荐

  1. Centos7搭建k8s集群

    一.部署环境 操作系统:CentOS Linux release 7.6.1810 (Core) 安装软件: docker:18.06.3-ce kubernetes:v1.15.4 二.部署架构: ...

  2. 查看JVM中的线程名

    实例说明 在Java虚拟机中(JVM):除了用户创建的线程,还有服务于用户线程的其他线程.它们根据不同的用途被分到不同的组中进行管理.本实例将演示JVM中线程的名字及其所在组的名称. 关键技术 线程组 ...

  3. Linux:linux网路路由命令

    查看路由 #查看所有路由信息 route -n 删除路由 #删除路由 route del default 修改路由 #修改路由 #先删除路由 route del default #在新建 route ...

  4. angular小记

    declarations:包装组件或指令等 providers:依赖注入 imports:导入其他模块 bootstrap:设置根组件 exports:导出组件或指令等 app.component.t ...

  5. C语言相关知识

    1.指针:在程序中定义了一个变量,在进行编译时就会给该变量再内存中分配一个地址,通过访问这个地址可以找到所需变量,这个变量的地址成为该变量的指针.指针看作是内存中的一个地址,多数情况下,这个地址是内存 ...

  6. QT从入门到入土(三)——文件的读写操作

     引言 文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处 理而开发的,所以文件读写是应用程序开发的一个基本功能. Qt 提供了两种读写纯文本文件的基本方法: 用 QFi ...

  7. 二、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Modules的几种加载方式

    这一篇梳理Prism中07示例Module的几种加载方式. 07示例分为了5个,有5种不同的Module加载方式. 我们开始学习加载Modules 观察07-Modules-Appconfig示例 分 ...

  8. C语言:随机数

    在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌.在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随机 ...

  9. 根据序列号查IP

    def getIP():#得到当前电脑IP import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(( ...

  10. ffmpeg入门篇-滤镜的基本使用

    转发自白狼栈:查看原文 滤镜 什么是滤镜?百度百科介绍说"滤镜主要是用来实现图像的各种特殊效果......". 我们最早在ffmpeg是如何转码的一文中了解过滤镜,来回顾下当时的转 ...