1

我正在使用一个简单的 if 循环来更改我的 ode 脚本中的参数值。这是我编写的一个示例脚本,它表现出同样的问题。所以首先是有效的版本:

function aah = al(t,x)

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

aah = [ab];

这可以使用

t = [0:1:10400];
x0 = [0,0];
[t,x] = ode23tb(@al, t,x0);

并可视化

plot(t,x(:,1))
plot(t,x(:,2))

好的,这是好的版本。现在,如果您所做的只是将 t 更改为

t = [0:1:12000];

整个事情都爆炸了。您可能认为这只是 matlab 对图形进行平均,但这不是因为如果您查看

x(10300,2) 

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

到底是怎么回事?有人有想法吗?

非常感谢您的帮助

4

1 回答 1

3

您的函数是恒定的(除了 10000 < t < 10300),因此内部求解器开始以非常大的时间步长求解系统,默认为总时间的 10%。(在自适应 ODE 求解器中,如果系统是常数,则高阶和低阶解将给出相同的解,并且(估计的)误差为零。因此求解器假设当前时间步长足够好。)您可以看看你是否tspan只给出两个元素,开始时间和结束时间。

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,:)];
于 2012-11-22T03:56:38.970 回答