如何在ode45 matlab中获取dy / dt

时间:2013-09-29 17:48:39

标签: matlab

我有2个关系:

y=y0+V*t+sin(w*t)    #relation1
dy/dt=(current/P)-(M1/P)*sin(y)+(M2/P)*sin(y+E)+U*cos(y)*sin(w*t)    #relation2

(M1,P,M2,E,w& U是数值常数) 我的目标是找到不同电流的V(电压)。为了做到这一点,我必须在数字上解决不同电流的关系2,并得到dy / dt,然后使用y和V之间的关系,即<∂y/∂t> = V(&... 。>表示时间平均值),我必须找到V. 考虑到我不知道dy / dt的值。 我试过这个

current = 6e-7 : 1e-8 : 8.5e-7;
for k=1:length(current)
f = @(y, t, M1, P, M2, E) (current(k)/P)-(M1/P)*sin(y)+(M2/P)*sin(y+E)+U*cos(y)*sin(w*t);
[t{k}, y{k}] = ode45(f,tspan,y0);
end

这给了我一个细胞中不同的电流。

我发现下面的代码会给我dy / dt:

ydot=y(:,2)   #if I use 1 instead of 2 it will give me y)

但现在,我的问题改为: 当我使用这个代码时,它会给我dy / dt只有1个电流,我怎么能得到不同电流的dy / dt?

2 个答案:

答案 0 :(得分:1)

尝试将输出设为矢量,其中第一个元素是您感兴趣的状态(y),第二个元素是它相对于时间的导数(dy/dt);所以y0 = [0;0];或者你的起始条件是什么。然后为你的ODE创建一个单独的文件,我们称之为“myFcn”:

function dydt = myFcn(~, y, M1, P, M2, E, current)      % the ~ is because we are not explicitly dependent on tspan

% Initialize the d/dt vector of our states, y
dydt = zeros(size(y));

% Update the d/dt vector of our states
dydt(1) = y(2);                                         % because (d/dt)y(1) = y(2) = dydt
dydt(2) = current/P - (M1/P)*sin(y) + (M2/P)*sin(y+E);  % your update equation

现在只需用以下内容替换上面的句柄和ode45调用:

f = @(y, M1, P, M2, E, current(k))myFunc(y, M1, P, M2, E, current(k));
[t{k}, y{k}] = ode45(f, tspan, y0);

您的输出将是向量y,它将为您提供“位置”状态y(1)和“速度”状态y(2)。这些将像以前一样存储在您的单元格数组中。

编辑:

更新了包含current(k)的代码,与OP的代码保持一致。

答案 1 :(得分:-1)

如果你想简单区分,可以使用f2 = jacobian(f,[dt])和matlabfunction(f2)来获取函数句柄...