2015-01-04 520 views
0

作爲一個組項目的一部分,我們有一個2個非線性微分方程組,我們必須使用中點法繪製S = S(t),I = I(t)圖形。關於MATLAB中的inlineeval的錯誤

而我得到試圖插入與相應的微分方程的矩陣時以下錯誤:在內嵌表達式==>矩陣([[

「錯誤 - (I S)/ 1000], [(I S)/ 1000 - (3 * I)/ 10]。]),用於類型 '雙重' 的輸入參數在內嵌/的subsref

誤差(第23行) 未定義的函數 '矩陣' INLINE_OUT_ = inlineeval(INLINE_INPUTS_,INLINE_OBJ_.inputExpr,INLINE_OBJ_.expr);「

我做的代碼如下:

syms I S 
u=[S;I]; 
F=[-0.001*S*I;0.001*S*I-0.3*I]; 
F1=inline(char(F),'I','S'); 
h=100; %Valores aleatórios 
T=100000; 
ni=(T/h); 
u0=[799;1]; 
f=zeros(1,2); 
k=zeros(1,2); 
i=1; 

while i<=ni 
f(1)=F1(u0(1)); 
f(2)=F1(u0(2)); 
dx=h*f; 
k(1)=F1((u0(1)+h*(1/2)),(u0(2)+h*(1/2))); 
k(2)=F1((u0(1)+h*(1/2)),(u0(2)+h*(1/2))); 
u1=u0+h*k; 
disp('i:'),disp(i) 
disp('u= '),disp(u1) 
u0=u1; 
i=i+1; 
end 

我是新來這個所以它很可能是錯誤的算法,但如果有人可以幫助我的錯誤我會apreciate它。謝謝!

+0

'F1'是一個內聯函數,它將調用函數'matrix'。函數'matrix'對Matlab來說是可見的,也就是說,它是在你的代碼的本地文件夾還是在路徑中? –

+0

使用「哪個矩陣」它說沒有找到,但我沒有創建任何矩陣函數 –

+0

嗯,經過一些更多的研究,我認爲我以前的評論有點誤導。我對「sym」不是很瞭解,但是你得到的錯誤應該與[this]相關。(http://www.mathworks.com/matlabcentral/answers/25281-error-in-inline-expression-matrix )。我認爲你應該嘗試從那裏出發。祝你好運! –

回答

0

具體產生錯誤的問題是,您將兩個符號函數放入矩陣中,然後調用char(輸出matrix([[-(IS)/1000], [(IS)/1000 - (3*I)/10]])而不是很好地轉換爲字符串)。

第二個問題是您正試圖將兩個函數同時傳遞到inlineinline從一個字符串創建一個函數(並且使用匿名函數而不是inline是首選)。你不能在其中放置多個功能。

這裏你不需要sym。事實上,如果你根本不需要操縱方程式,那就避免它(比它更值得的麻煩)。一種常見的方法是創建一個單元陣列:

F{1} = @(I,S) -0.001*S*I; 
F{2} = @(I,S) 0.001*S*I-0.3*I; 

然後,您可以通過在IS像這樣:

F{1}(500,500) 

注意,您的功能包括IS,所以他們總是必要。當只傳遞一個像這樣的變量時,請重新考慮您期待的內容:f(1)=F1(u0(1));,因爲這也會導致錯誤。

+0

是的,我注意到它不會同時傳遞兩個函數到內聯,所以我決定通過一個1,我也固定f(1)= F1(u0(1))。它已經在工作,只需要修正中點方法本身的算法。非常感謝您的回答! –