2013-07-06 69 views
0

我需要繪製一個微分方程的幫助......它不斷出現所有的時髦和圖形不是它應該看起來像。Matlab微分方程歐拉方法

function [dydt] = diff(y,t) 

dydt = (-3*y)+(t*(exp(-3*t))); 

end 

tI = 0; 
yI = -0.1; 
tEnd = 5; 
dt = 0.5; 

t = tI:dt:tEnd; 
y = zeros(size(t)); 
y(1) = yI; 

for k = 2:numel(y) 
    yPrime = diff(t(k-1),y(k-1)); 
    y(k) = y(k-1) + dt*yPrime; 
end 

plot(t,y) 
grid on 
title('Engr') 
xlabel('Time') 
ylabel('y(t)') 
legend(['dt = ' num2str(dt)]) 

這是我的代碼,但圖形與它應該看起來不一樣。我是否錯過了for陳述的索引?

編輯

我得到一個錯誤:

Error using diff 
Difference order N must be a positive integer scalar. 

Error in diff3 (line 12) 
    yPrime = diff(t(k-1),y(k-1)); 
+1

你有問題的函數名稱:matlab已經有內置函數'差異',並嘗試調用這個函數,而不是你自己的函數。嘗試爲您的函數'diff'使用不同的名稱。 –

+0

你的另一個問題是你的ODE函數被定義爲'diff(y,t)',但是你正在調用參數翻轉:'diff(t(k-1),y(k-1))'。我建議遵循Matlab的ODE求解器(例如'ode45'),並將ODE函數的參數定義爲't',然後''y。你還會發現,即使對於這個簡單的函數,你的時間步長dt也太大了。嘗試0.1或更少。 – horchler

+0

你也希望你的ODE函數是一個子函數(或者一個單獨的M文件函數),而不是你在這裏顯示的代碼的開始部分。 – horchler

回答

0

修復錯誤後在評論中指出DANIL Asotsky和horchler:

  1. 避免名稱衝突,內置-in函數'diff'
  2. 將參數的順序更改爲t,y
  3. 減少時間步dt至0.1
  4. ODE右手側轉換爲匿名函數

(和在函數定義刪除不必要的括號),您的代碼看起來是這樣的:

F = @(t,y) -3*y+t*exp(-3*t); 

tI = 0; 
yI = -0.1; 
tEnd = 5; 
dt = 0.1; 

t = tI:dt:tEnd; 
y = zeros(size(t)); 
y(1) = yI; 

for k = 2:numel(y) 
    yPrime = F(t(k-1),y(k-1)); 
    y(k) = y(k-1) + dt*yPrime; 
end 

plot(t,y) 
grid on 
title('Engr') 
xlabel('Time') 
ylabel('y(t)') 
legend(['dt = ' num2str(dt)]) 

按預期執行:

output