标准的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
。有什么建议?
答案 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
解算器返回衍生产品和解决方案。