1
我试图模拟由ODE系统控制的物理过程的时间行为。当我将输入脉冲的width
从20
切换到19
时,没有耗尽y(1)
状态,这在物理上没有意义。我究竟做错了什么?我错误地使用了ode45
吗?在Matlab中使用ode45
function test
width = 20;
center = 100;
tspan = 0:0.1:center+50*(width/2);
[t,y] = ode45(@ODEsystem,tspan,[1 0 0 0]);
plot(t,y(:,1),'k*',t,y(:,2),'k:',t,y(:,3),'k--',t,y(:,4),'k');
hold on;
axis([center-3*(width/2) center+50*(width/2) -0.1 1.1])
xlabel('Time')
ylabel('Relative values')
legend({'y1','y2','y3','y4'});
function dy = ODEsystem(t,y)
k1 = 0.1;
k2 = 0.000333;
k3 = 0.1;
dy = zeros(size(y));
% rectangular pulse
I = rectpuls(t-center,width);
% ODE system
dy(1) = -k1*I*y(1);
dy(2) = k1*I*y(1) - k2*y(2);
dy(3) = k2*y(2) - k3*I*y(3);
dy(4) = k3*I*y(3);
end
end
谢谢!既然它很僵硬,不应该使用不同的颂歌求解器,或者当你将它分解时它变得不僵硬?另外,还有其他方法可以做到这一点,因为如果我尝试模拟消失的小宽度(delta函数),它会给我一个错误? – user4038089
不,僵硬的求解器可能稍微可靠一些,但当系统出现这种不连续性时,不能保证不会遇到同样的问题。 ODE从根本上需要一定程度的平滑度,所以它在数学上也是错误的。这个答案中的方法有什么问题?我不知道你的意思是“消失的小宽度”。您正在处理离散浮点值,因此宽度必须是某个有限值。 – horchler