欧拉方法 - MatLab中的弹簧振荡

时间:2011-01-27 16:20:28

标签: matlab

如果我有一个描述质量弹簧阻尼系统的一阶微分方程的二阶微分方程,那么当我不知道第一个时,我如何使用欧拉方法绘制这个方程? - 阶差?我想在MatLab中这样做。这是一个家庭作业问题,所以我没有发布任何代码。我只想简要介绍一下你是如何做到这一点的。

二阶导数是d2(t + 1)=( - 1 / m)*(c * d1 + k * y)其中c,m,k是常数,y最初是1,d1是第一个-order差分从0开始,t是时间。

有什么想法吗?

谢谢:)。

4 个答案:

答案 0 :(得分:3)

将二阶方程重写为一阶方程组。未知数对应于位置和速度。

答案 1 :(得分:3)

二阶方程可以转换为一阶微分方程组。

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)

答案 2 :(得分:2)

一阶微分方程组可能看起来像y1 = y'用于表示时间导数。

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

答案 3 :(得分: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 / m -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')