首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >matlab微分方程ODE求解器的事件(Event)属性

matlab微分方程ODE求解器的事件(Event)属性

作者头像
用户9925864
发布于 2022-07-27 01:41:29
发布于 2022-07-27 01:41:29
2.6K00
代码可运行
举报
运行总次数:0
代码可运行

在特定的微分方程求解过程中,比如碰撞、车辆刹车,这种特殊运动时间简单的时序求解不够完善,故需要用到一个ode求解器的事件(Event)属性

首先假定一个微分方程

dy1=y2

dy2=y1+1

其中y1不能超过4

求解改微分方程

event时间定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function [value,isterminal,direction] = events1(t,y)
value = y(1)-4;
isterminal= 1;
direction = 0;

求解方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dy = @(t,y) [y(2);y(1) + 1];
options=odeset('events',@events1);
[t,y] = ode45(dy,[0 12],[0 1],options);
figure
plot(t,y)

结果为:

events函数解析:

%function [value,isterminal,direction]=events(t,x)

% 事件检查函数,此时需要做的是过零点检测

% ode45函数自动检查当value=0是否成立

% 如果我们要求检测Y=0的点,设置value=Y

% 这里我们要检测Y=4,那么就设置value=Y-4

% isterminal检测到指定条件时,是否终止ode45函数的运行

% 1表示终止,0表示继续

% 在我们这个问题上,我们只要检测到零点时就停止程序

% direction:value过零点检测的方向

% -1表示由正到负,+1表示由负到正

在用一个例子来说明,选择一个用到简单微分方程的物理情景

一个质量m=100kg的物体从高处竖直落下,加速度会受到空气阻力的影响,这里简单的认为重力加速度g=9.8不变,空气阻力f=k*v^2 ,简单起见,k=1。只考虑竖直方向速度v,且速度,加速度,竖直位移都以向下为正。初速度,初位移都为0;那么有以下微分方程:

dy/dt=v

dv/dt=9.8-1*v^2/m

m=100,v0=y0=0

然后用MATLAB的ode45函数求这个微分方程的数值解

先编写函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function dx=fun(t,x)
% x(1)表示下落的距离y(向下为正),x(2)表示下落速度v(向下为正)
k=1;     % k=1为表示空气阻力的一个常量,这里简化空气阻力f=k*v^2
m=100;% m为质量=100kg
dx=zeros(2,1);
dx(1)=x(2);             % 下落距离对时间的导数=速度
a=9.8-(k*x(2)^2)/m;% a加速度(向下为正)=重力加速度 - 空气阻力产生的加速度
dx(2)=a;                 % 速度对时间的导数=加速度
end

现在想要得到t=15s时的位移和速度

那么输入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[T,X]=ode45('fun',[0,15],[0 0]); 

返回的X中的最后一列就是我想要的值;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X(end)

ans =

   31.2997

但假如我想知道当竖直向下的位移刚好=100米时的时间和速度,那该怎么办?现在我的做法是先将解一个充分大的时间,然后在里面找位移在100两侧的时间和速度,再通过插值得到位移刚好=100时的时间和速度。但这样很麻烦,也不见得准确,MATLAB有什么自带的语句能实现这个功能吗?或是有什么更好的方法?

在不知道结果时间的时候是需要先设定一个比较大的时间范围计算的

但是并不需要将整个范围的结果都算出来再插值

这个时候可以设定触发事件函数在一定条件下停止计算

用odeset可以为ode45求解器设定触发事件的函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function [value,isterminal,direction] = eventfun(t,x)
value=x(1)-100; %触发时间,当其值为0的时候,时间会触发
isterminal=1;   %设为1时会,触发时间会停止求解器,设0时触发不影响工作
direction=1;    %触发方向设1时是上升触发,设-1是下降触发,设0是双向触发
end
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
op=odeset('Events',@eventfun);
[T,X,Tend,Xend,evennum]=ode45(@fun,[0,15],[0 0],op);

这样到达100米时,求解器就停住了,ode45多返回了Tend,Xend,evennum三个参数

第一个Tend是触发事件发生的时间

第二个Xend是触发时间发生时刻的X

第三个evenum是标识触发事件的编号

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法工程师的学习日志 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
matlab中ode45函数解二阶微分方程_matlab求常微分方程组
求解单变量微分方程的解 x ˙ ( t ) = 2 ∗ x ( t ) \dot{x}(t) = 2 * x(t) x˙(t)=2∗x(t)
全栈程序员站长
2022/11/03
4K0
Matlab通过ode系列函数求解微分方程
MATLAB有很多用于求解微分方程的内置函数。MATLAB包含了用于求解常微分方程(ODE)的函数,微分表达式一般如下
用户9925864
2022/07/27
1.3K0
Matlab通过ode系列函数求解微分方程
matlab求解微分方程组(matlab解微分方程的数值解)
其中,ydot为一个列向量,值分别表示y‘(1)、y‘(2)、y‘(3)的取值,t自因变量,y为因变量,一个y就可以表示因变量组了。事实上,说白了,这个函数就是申明一下变量使t和y,以及y一阶导的右端项为那三个。 接着,编写主函数如下:
全栈程序员站长
2022/08/01
1.9K0
matlab求解微分方程组(matlab解微分方程的数值解)
神经网络常微分方程 (Neural ODEs) 解析
在本文中,我将尝试简要介绍一下这篇论文的重要性,但我将强调实际应用,以及我们如何应用这种需要在应用程序中应用各种神经网络。
AI科技评论
2019/08/15
7.5K1
2.数值计算(1) --求解连续微分系统和混沌系统
微分系统在工程项目中很常见,通过物理建模之后,基本都需要求解微分方程得到其结果,混沌系统属于特殊的一类微分系统,在某些项目上也很常见,同时可以引申出分岔图、李雅普诺夫指数谱、相图、庞加莱截面等,本文探讨通过matlab常见的微分求解函数和simulink求解器来实现计算。
用户9925864
2022/07/27
1.2K0
2.数值计算(1) --求解连续微分系统和混沌系统
微分方程与欧拉法
本文介绍了如何利用数值求解方法解决微分方程,包括欧拉法、龙格-库塔方法等,并给出了具体的MATLAB代码示例。
用户1147754
2018/01/03
1.1K0
微分方程与欧拉法
数学建模暑期集训5:matlab求解常微分方程/偏微分方程
功能函数:ode45,ode23,ode113 例:用RK方法(四阶龙格—库塔方法)求解方程 f=-2y+2x^2+2*x
zstar
2022/06/14
1.3K0
数学建模暑期集训5:matlab求解常微分方程/偏微分方程
数值积分法求解常微分方程
Scipy 的 integrate 模块的 odeint 函数可以用来以数值积分法求解常微分方程。
用户6021899
2023/03/03
5800
数值积分法求解常微分方程
Scipy 高级教程——解决偏微分方程
Scipy 提供了强大的数值求解工具,其中包括解决偏微分方程(PDEs)的功能。在本篇博客中,我们将深入介绍 Scipy 中解决偏微分方程的方法,并通过实例演示如何应用这些工具。
Echo_Wish
2024/01/17
6510
Scipy 高级教程——解决偏微分方程
二阶微分方程的matlab解法,以动力学方程为例
过冷水最近有接触一点点动力学的知识。作为动力学入门,当然的会解动力学方程了。于是本期过冷就教大家解动力学微分方程。
巴山学长
2021/05/31
3.3K0
二阶微分方程的matlab解法,以动力学方程为例
matlab解常微分方程组数值解法(二元常微分方程组的解法)
上篇博客介绍了Matlab求解常微分方程组解析解的方法:博客地址 微分方程组复杂时,无法求出解析解时,就需要求其数值解,这里来介绍。 以下内容按照Matlab官方文档提供的方程来展开(提议多看官方文档)
全栈程序员站长
2022/08/01
5.2K0
matlab解常微分方程组数值解法(二元常微分方程组的解法)
matlab求解延迟微分方程_状态依赖时滞微分方程的动力学研究
固定时滞的微分方程:满足下面的形式,也就是微分方程右边包含时滞部分,且时滞为常数。
全栈程序员站长
2022/11/10
9060
matlab求解延迟微分方程_状态依赖时滞微分方程的动力学研究
Matlab求解微分代数方程 (DAE)
周末有位同学请教了一个问题,他要求解一个微分方程组,但微分方程变量之间还有个线性方程组关系,这个就是典型的微分代数方程 ,Matlab里面有专门的求解方法,
用户9925864
2022/07/27
1.5K0
Matlab求解微分代数方程 (DAE)
常微分方程初值问题数值解法MATLAB(泛函微分方程)
高对差分格式的认识和离散化分析问题的技巧,加深对理论课程的学习和理解,为数学专业和信息与计算科学专业其他后继课程的学习打好基础。
全栈程序员站长
2022/07/28
9940
matlab实现RK45(Runge-Kutta45、ode45)求解器算法
RK45求解器,又称为Dormand-Prince求解器。这是比较精确的求解器,可以快速地求解微分方程,但是,需要消耗一些内存。在matlab simulink中默认条件下,系统自动选择RK45求解器。用户可以根据实际问题,选择合适的求解器。
用户9925864
2022/12/16
1.3K0
matlab实现RK45(Runge-Kutta45、ode45)求解器算法
Matlab 刚性问题求解器-ode23s
ode23s(stiff differential equation solver)是MATLAB中的一种求解刚性(stiff)微分方程的数值方法。刚性微分方程通常具有多个时间尺度差异较大的变量,并且其中至少有一个变量具有快速变化的特性。
用户9925864
2023/09/05
8610
Matlab 刚性问题求解器-ode23s
求解微分方程,用seq2seq就够了,性能远超 Mathematica、Matlab
近日,Facebook AI研究院的Guillaume Lample 和Francois Charton两人在arxiv上发表了一篇论文,标题为《Deep Learning for Symbolic Mathematics》。
AI科技评论
2019/12/19
1.2K0
求解微分方程,用seq2seq就够了,性能远超 Mathematica、Matlab
《Experiment with MATLAB》读书笔记(十六)
读书笔记(十六) 这是第十六部分微分方程求解 %% 指数型增长和Logistic型增长 % Logistic曲线是一种常见的S形函数 % 是皮埃尔·弗朗索瓦·韦吕勒 % 在1844或1845年 % 在研究它与人口增长的关系时命名的 % 起初阶段大致是指数增长 % 然后随着开始变得饱和,增加变慢 % 最后,达到成熟时增加停止 close all figure k = 1 eta = 1 mu = 20 t = 0:1/32:8; y = mu*eta*exp(k*
万木逢春
2018/04/18
7610
《Experiment with MATLAB》读书笔记(十六)
matlab求解时滞微分方程
在MATLAB中求解时滞微分方程(DDE),可以使用dde23函数。这个函数是为了解决具有常数时滞的微分方程而设计的。使用dde23求解时滞微分方程的基本步骤:
用户4006703
2025/06/16
1260
数学建模--微分方程
在数学建模中,微分方程模型是一种极其重要的方法,广泛应用于各种实际问题的描述和解决。微分方程模型通过建立变量及其变化率之间的关系,可以预测和分析系统的行为。这些模型在科技、工程、生态、环境、人口、交通、医学、经济管理等各个领域都有广泛应用。
用户11315985
2024/10/16
5880
数学建模--微分方程
推荐阅读
相关推荐
matlab中ode45函数解二阶微分方程_matlab求常微分方程组
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档