我有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?
答案 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)来获取函数句柄...