如何模拟由给定信号驱动的谐振子(而不是正弦波驱动)

4

我有一个数值表格,告诉我信号水平如何随时间变化,并且我想模拟由此信号驱动的谐振子。即使模拟不是100%准确也没关系。 我知道振荡器的频率。 我找到了很多公式,但它们都使用正弦波作为驱动。

3个回答

3
我猜你想进行一些时间离散模拟。众所周知的公式需要解析输入(请参见Green's function)。如果你有一张某个时间点上的力表,典型的解析公式对你也没什么帮助。
思路是这样的:对于每个时间点t0,振荡器都有一定的加速度、速度等。现在一个力作用于它——根据你得到的表格——这将改变它的加速度(F = m * a)。对于下一个时间步t1,我们假设加速度保持不变,因此我们可以为这个时间段应用简单的牛顿方程(v = a * dt),其中dt = (t1-t0)。重复这个过程,直到模拟所需的时间范围。
这个模拟中最重要的参数是dt,即计算的细粒度。例如,你可能想每秒有10个步骤,但这完全取决于你的输入参数。我们在这里做的本质上是方程的欧拉积分
当然,这并不是全部 - 这种模拟可能非常复杂,尤其是在行为不太良好的情况下,例如极端加速等。在这些情况下,您需要在框架内执行数字稳定性检查,因为某些“极端”事件发生在单个帧中。此外,可能需要进行一些数值积分,例如龙格-库塔算法。不过,我想这已经足够了。
编辑:就在我发布这篇文章后,有人在原始问题的评论中指向了“Verlet算法”,这基本上是我上面描述的实现。

是的,这就是为什么我把它拿下来了。但是与MIT页面上的问题有关,我找不到合适的变体。也许应该坚持使用速度Verlet算法,但我找不到代码。http://en.wikipedia.org/wiki/Verlet_integration#Velocity_Verlet - Incognito
我想这就是OP的任务所在 - 研究数值上出现的缺陷并尝试实现模拟。我们不要把所有的乐趣都剥夺掉;)老实说,我自己也不知道是否有一个实现,但我想问题已经得到了回答。实施应该是一个单独的问题。 - mnemosyn
+1 - 确实是一个非常好的答案。如果可以的话,我会给它更多的赞。 - duffymo

0

好的,我终于弄清楚了,并编写了一个GUI应用程序来测试它,直到它正常工作。但是我的电脑不太喜欢每秒执行1000 * 44100次,即使没有GUI^^

无论如何:这是我的测试代码(运行得相当不错):

double lastTime;  
const double deltaT = 1 / 44100.0;//length of a frame in seconds  
double rFreq;  
private void InitPendulum()  
{  
double freq = 2;//frequency in herz  
rFreq = FToRSpeed(freq);  
damp = Math.Pow(0.8, freq * deltaT);  
}  

private static double FToRSpeed(double p)  
{  
p *= 2;  
p = Math.PI * p;  
return p * p;  
}  
double damp;  
double bHeight;  
double bSpeed;  
double lastchange;  
private void timer1_Tick(object sender, EventArgs e)  
{  
  double now=sw.ElapsedTicks/(double)Stopwatch.Frequency;  
  while (lastTime+deltaT <= now)  
  {  
    bHeight += bSpeed * deltaT;  
    double prevSpeed=bSpeed;  
    bSpeed += (mouseY - bHeight) * (rFreq*deltaT);  
    bSpeed *= damp;  
    if ((bSpeed > 0) != (prevSpeed > 0))  
    {  
      Console.WriteLine(lastTime - lastchange);  
      lastchange = lastTime;  
    }  
    lastTime += deltaT;  
  }  
  Invalidate();//No, i am not using gdi^^  
}

模拟可以是非常计算密集型的。所有世界超级计算机所做的几乎都是某种形式的模拟。 - Donal Fellows
我曾经遇到了一些错误和瓶颈。现在,使用512个振荡器 * 44100帧/秒,CPU使用率为40%,但是出于设计目的分析有点不够清晰。(与FFT相同,但是FFT在低频下不太准确) - Zotta


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接