2011-01-27 114 views
1

如果我用描述質量彈簧阻尼系統的一階微分方法得到二階微分方程,那麼如何使用歐拉方法來繪製這個方程時我不知道一階差分?我想在MatLab中做到這一點。這是一個家庭作業問題,所以我沒有發佈任何代碼..我只想簡要介紹一下你是如何做到的。二階導數爲d2(t + 1)=(-1/m)*(c * d1 + k * y)其中c,m,k是常數,y初始爲1,d1爲一階微分,從0開始,t是時間。歐拉方法 - MatLab中的彈簧振盪

任何想法?

謝謝:)。

回答

3

二階eqn可以轉換爲一階微分方程組。

function dy = ex(y) 
dy = zeros(2,1); 
dy(1) = y(2); 
dy(2) = -c/m*y(2) - k/m*y(1); 

從這裏你可以使用Matlab的內置解算器。 ode23s會工作得很好:

[t,y] = ode23s(@ex, y0, tspan) 
3

將二階方程改寫爲一階方程組。未知數對應於位置和速度。

2

一階微分方程組可能看起來像這樣,而y1 = y。用'表示時間導數。

y1' = y2 
y2' = -c/m*y2 - k/m*y1 
+0

謝謝。 y2如何首先定義?我想把這些方程放在一個循環中,當我完成迭代時繪製它們::) – ale 2011-01-27 17:50:08

1

有以下形式的解析解(X(t)中,x '(t))的= EXP(A T)*(X(0)中,x'(0 )),其中A是2×2矩陣。如果您不需要使用matlab的ODE解算器,這是找到系統時間演變的正確方法。

爲了找到A,寫系統以這種形式

  • X =(X,X')
  • DX = A * X
  • X = expm(A T)X(0) %注意要取一個矩陣的指數,你需要使用expm,否則你只需得到每個元素的指數分別爲

所以這裏A = [0 1; -k /米-c/m]的

設定K/M = 1,並且C/M = 0.1,我們可以寫

t = linspace(0,20, 1000); 
A = [0 1; -1 -0.1]; 
for j = 1:length(t); x(j,:) = expm([0 1; -1 -0.1]*t(j))*[1;0]; end 
plot (t,x) 
legend ('position', 'velocity'); 
title ('underdamped spring starting at y = 1; y'' = 0')