MATLAB微分方程数值解如何精确定位特定一点处的解

问题描述:

MATLAB微分方程数值解如何精确定位特定一点处的解
我想问的问题比较难表示,所以我用下面一个例子来说明我的问题
这是一个用到简单微分方程的物理情景
一个质量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函数求这个微分方程的数值解
先编写函数
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时的位移和速度
那么输入
[T,X]=ode45('fun',[0,15],[0 0]);
返回的X中的最后一列就是我想要的值;
但假如我想知道当竖直向下的位移刚好=100米时的时间和速度,那该怎么办?现在我的做法是先将解一个充分大的时间,然后在里面找位移在100两侧的时间和速度,再通过插值得到位移刚好=100时的时间和速度.但这样很麻烦,也不见得准确,MATLAB有什么自带的语句能实现这个功能吗?或是有什么更好的方法?

在不知道结果时间的时候是需要先设定一个比较大的时间范围计算的但是并不需要将整个范围的结果都算出来再插值这个时候可以设定触发事件函数在一定条件下停止计算用odeset可以为ode45求解器设定触发事件的函数详细的...