2013-09-27 60 views
0

我試圖用ODE45求解微分方程,我有一個函數中的參數之一有通過特定的步驟有所不同,這裏是我的功能:MATLAB ODE45如何改變函數內部參數continiously

function f=RSJ(y,t,M1,P,M2,E,current) 

f=(current/P)-(M1/P)*sin(y)+(M2/P)*sin(y+E); 

PM1M2 & E的數字常數,current是我應該可以解決這個微分方程的幾種情況,例如current=0:1:10 參數我該怎麼做這樣的事情?

+1

我寧願建議你要問的數學部分。 –

回答

3

使用閉包(也就是匿名或lambda函數):

% declare t, y, tspan and y0 
% [...] 
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); 
    [t{k}, y{k}] = ode45(f, tspan, y0); 
end 
+0

現在我必須計算∂y/∂t,你有什麼想法嗎? – user2822314

+0

你是什麼意思? ∂y/∂t= y'= f(t,y),你正在解決的問題是找到y(t)。 – Simon

+0

我發現下面的代碼會給我dy/dt:ydot = y(:,2),但是當我嘗試這個時,我得到了1個電流的dy/dt,我怎麼能得到不同電流的dy/dt? – user2822314

0

一個快速和骯髒的解決方案。將current定義爲全局變量(您需要在基本工作空間和函數中執行此操作),並使用for循環(例如,

current_vector=1e-7*(6:0.1:8.5); 
global current 
for k=1:length(current_vector) 
    current = current_vector(k); 
    [t{k},y{k}]=ode45(f,<tspan>,<y0>) 
end 

由相應的值/變量替換<tspan><y0>。我想其他的常量在函數體,在這種情況下,你的函數應該是這個樣子定義:

function f=RSJ(t,y) 
    global current 
    M1 = ... % etc... 
    f=(current/P)-(M1/P)*sin(y)+(M2/P)*sin(y+E); 
end 

BTW,我沒有看到你的功能上的時間t任何明確依賴.. 。

+0

你的解決方案的工作,但如果我想改變這樣的電流:current = 6.00 * 10 ^( - 7):0.1 * 10 ^( - 7):8.5 * 10 ^( - 7),&也是y是時間的功能。 – user2822314

+0

我編輯了我的答案,以適應'current'的新值。 – am304

+1

不需要。不需要使用全局變量。這不是他們想要的。通過在集成函數f中聲明'current'的值應該作爲參數傳遞給'ode45'。 @ user2822314,請參閱@Simon的解決方案。 – horchler

相關問題