Matlab ode解算器中与时间相关的参数值的for循环仅适用于t的某些值

Matlab ode解算器中与时间相关的参数值的for循环仅适用于t的某些值,matlab,ode,Matlab,Ode,我使用一个简单的if循环来更改ode脚本中的参数值。下面是我编写的一个示例脚本,它显示了相同的问题。首先是有效的版本: function aah = al(t,x) if (t>10000 && t<10300) ab = [0; 150]; else ab = [150; 0]; end aah = [ab]; 并以 plot(t,x(:,1)) plot(t,x(:,2)) 好的,这是个好版本。现在如果你所做的就是把t改成 t = [0:1

我使用一个简单的if循环来更改ode脚本中的参数值。下面是我编写的一个示例脚本,它显示了相同的问题。首先是有效的版本:

function aah = al(t,x)

if (t>10000 && t<10300)
    ab = [0; 150];
else
    ab = [150; 0];
end

aah = [ab];
并以

plot(t,x(:,1))
plot(t,x(:,2))
好的,这是个好版本。现在如果你所做的就是把t改成

t = [0:1:12000];
整个事情都爆炸了。你可能会认为这只是matlab对图表的平均值,但这不是因为如果你看

x(10300,2) 
在这两种情况下,答案应该是相同的,因为代码没有改变。但是第二个版本输出0,这是错误的

到底发生了什么事?有人有主意吗

非常感谢您的帮助

您的函数是常量(10000tspan

t = [0 12000];
通常
tspan
不会影响解算器的内部时间步长。解算器使用其内部时间步长求解系统,然后在用户给定的
tspan
处进行插值。因此,如果内部时间步长不幸“跳过”间隔[10000,10300],解算器将不知道该间隔

所以最好设置最大步长,相对小于300

options = odeset('MaxStep', 10);
[t, x] = ode23tb(@al, t, x0, options);
如果您不想在整个时间内使用小步长进行求解(如果您“知道”函数何时不是常数),则应单独求解

t1 = [0 9990];
t2 = [9990 10310];
t3 = [10310 12000];

[T1, x1] = ode23tb(@al, t1, x0);
[T2, x2] = ode23tb(@al, t2, x1(end,:));
[T3, x3] = ode23tb(@al, t3, x2(end,:));

T = [T1; T2(2:end); T3(2:end)];
x = [x1; x2(2:end,:); x3(2:end,:)];

实际上,您可以将步长设置为300。大多数ode算法都会“回到过去”,以纠正可能错过的快速变化。只要一步踏入敏感区,你就会非常棒。很有道理,非常感谢。
t1 = [0 9990];
t2 = [9990 10310];
t3 = [10310 12000];

[T1, x1] = ode23tb(@al, t1, x0);
[T2, x2] = ode23tb(@al, t2, x1(end,:));
[T3, x3] = ode23tb(@al, t3, x2(end,:));

T = [T1; T2(2:end); T3(2:end)];
x = [x1; x2(2:end,:); x3(2:end,:)];