Matlab:强制 Spring 质量阻尼器的 ode45 输出不正确

标签 matlab ode numerical-integration

这是我的 Matlab 代码,用于求解质量 Spring 阻尼器系统的二阶 ODE:

function Spring

clear all;
close all;
options=odeset('RelTol',1e-6); 
p0 = [1 0]; %initial position and velocity
[t,p] = ode45(@SpringFunction, [0 20], p0, options);

plot(t,p(:,1)) %plot the first column (x) vs. time

return

function pdot = SpringFunction(t,p)

c = 5; w = 2;
g = sin(t); % forcing function
pdot = zeros(size(p));
pdot(1) = p(2);
pdot(2) = g-c*p(2)-(w^2)*p(1);

return

我相信我得到的输出是错误的,因为对于这种情况,我认为位移与时间的关系图应该看起来像振幅递减的正弦曲线。相反,它看起来像这样: decreasing function which relaxes to a sinusoid whose amplitude is constant

这对我来说似乎不正确,但如果我错了,请纠正我。我看不出代码中有什么不正确的地方。

最佳答案

您正在对阻尼系统施加正弦曲线,因此您应该期望稳定状态是正弦曲线。这是a nice vibrations tutorial (PDF) – 有关阻尼正弦强制,请参阅第 448–450 页。尝试消除强制或大大降低其幅度。另外,看起来你有很多阻尼。您的damping ratio , z (zeta),似乎是 c/(2*w) = 5/4。这意味着系统的非受力形式过度阻尼 - 在没有受力的情况下,您不会看到振荡。

此外,在振荡系统中使用 ode45 时要小心。如果您的系统碰巧太僵硬,您可能需要调整容差或使用僵硬解算器,例如 ode15s以获得准确的结果。您始终可以尝试使用更严格的容差来检查它们是否产生质量相似的结果(相同的周期、幅度、增长率/衰减率等)。

关于Matlab:强制 Spring 质量阻尼器的 ode45 输出不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22367669/

相关文章:

matlab - 使用反向传播算法进行字符识别测试

performance - 在 Matlab 中加载数据最快的方法是什么

c++ - Valgrind 输出带有地址和问号?

javascript - JS 中的龙格库塔问题

python - 计算两条曲线之间的面积

matlab - MATLAB 中的高斯平滑

matlab - 如何在 Octave 中绘制和显示正方形?

python - scipy.integrate.ode 有两个耦合的 ODE?

matlab - 朗之万方程的 ode45

python - 使用Python进行三重积分的数值计算