2014-03-25 94 views
2

我正在嘗試創建一個SIR模型(求解帶有兩個參數的3個微分方程),並在MATLAB上繪製解決方案,並且不斷收到錯誤'沒有足夠的輸入參數'。我真的不知道自己出錯的地方。下面是代碼:沒有足夠的輸入參數

function dx = sir(t,x) 
dx=[0; 0; 0]; 
beta = .003; 
delta = 1; 
dx(1)= -beta *x(1)*x(2); 
dx(2)=beta*x(1)*x(2)-delta*x(2); 
dx(3)=delta*x(2); 
%options = odeset('RelTol', 1e-4, 'NonNegative', [1 2 3]); 
[t,x] = ode45('sir', [0 10], [1000 1 0], options); 
plot(t,x); 
%legend('S', 'I', 'R'); 
end 
+2

首先,你爲什麼不直接複製問題中的代碼?其次,你能告訴你如何調用函數'sir(t,x);'? – tashuhka

+0

問題中的代碼: –

+0

函數dx = sir(t,x) dx = [0; 0; 0]; beta = .003; delta = 1; (1)= -beta * x(1)* x(2); (2)= beta * x(1)* x(2)-delta * x(2); dx(3)= delta * x(2); %options = odeset('RelTol',1e-4,'NonNegative',[1 2 3]); [t,x] = ode45('sir',[0 10],[1000 1 0],options); (t,x); plot(t,x); %legend('S','I','R'); –

回答

1

我想您對如何函數調用和遞歸工作,或者可能你只是不熟悉編程的一個嚴重的誤解。你需要兩個獨立的東西:

  1. 定義一個函數並將其保存爲sir.m。這定義了你的ODE。它應該包含:
    function dx = sir(t,x) beta = .003; delta = 1; dx(1)= -beta *x(1)*x(2); dx(2)=beta*x(1)*x(2)-delta*x(2); dx(3)=delta*x(2);

  2. 運行代碼來解決您的ODE。這可以直接粘貼到命令窗口只要sir.m在路徑或當前目錄:
    options = odeset('RelTol', 1e-4, 'NonNegative', [1 2 3]); [t,x] = ode45('sir', [0 10], [1000 1 0], options); plot(t,x); legend('S', 'I', 'R');

注意,步驟1 限定sir功能和步驟2 使用它。這需要在兩個單獨的步驟中發生,以防止sir自行調用(或者更確切地說,在您的情況下,調用函數ode45,它再次調用sir)。這被稱爲遞歸,而不是你應該在這裏做什麼。

相關問題