2011-01-27 67 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')