在Matlab中的每个解决方案点自动返回ode求解器的导数?

时间:2014-10-10 10:58:57

标签: matlab numerical-methods ode

标准的Matlab ode45调用是:

[T,Y] = solver(odefun,tspan,y0,options);

但我也希望每个状态向量odefun都有Y的值。似乎应该有一个选项来返回像

这样的东西
[T,Y, DYDT] = solver(odefun,tspan,y0,options);

因为这是最有效的方法,因为例程已经在内部评估每个点的导数。显而易见的工作是

DYDT = odefun(T,Y);

然而,我需要编写odefun的修改版本,因为传递给solver的版本应该是表示单个状态的列向量。显然,我希望在DYDT返回的所有状态Y中计算solver。有什么建议?

2 个答案:

答案 0 :(得分:1)

我认为没有直接获得衍生物。

可能你会尝试这样的事情:

tspan = 0:0.001:5; % choose a time-interval
x0 = 5 % and an initial condition

运行ode45代码

[~,xt_solution]=ode45('odefun',tspan,x0);

然后对您的解决方案进行区分:

tdiff=diff(tspan);
xdiff=diff(xt_solution);
dxdt=xdiff1./tdiff1;

你去吧。您将获得导数的值及其对应的tspan值!请记住,你的'dddt'数组会有一个小于xt_solution的元素。这是因为我们区分xt_solution

的方式

如果你必须拥有相同dim的两个数组,你可以去:

if size(xt_solution,1) > size(dxdt,1)
    xt_solution = xt_solution(1:size(dxdt,1),:);
end

所以诀窍是从之前预定义你的tspan,然后用它来找到衍生物!

答案 1 :(得分:0)

我认为如果您编写odefun来处理标量和向量(例如使用.*),您应该能够按照您的建议(dydt = odefun(t,y);)进行操作。除此之外,您可以使用for循环来遍历ode求解器返回的时间向量(可能效率不高,但非常强大)。

我认为有一种方法可以让ode解算器返回衍生产品和解决方案。