首页 > 解决方案 > 如何模拟波动方程

问题描述

我最近一直在尝试在p5.js中模拟波动方程。

(x, y)我的方法是用坐标绘制一堆点。我使用波动方程来获得这些粒子的运动。

这是我的数值积分方法:

var pos     = this.masses[i].pos
var nextPos = this.masses[i + 1].pos
var lastPos = this.masses[i - 1].pos

var vel = this.masses[i].vel, acc = this.masses[i].acc // for simplicity

acc.x = 0
acc.y = c * c * ((nextPos.y - 2*pos.y + lastPos.y)) / d2x

vel.x += acc.x * dt
vel.y += acc.y * dt

pos.x += vel.x * dt
pos.y += vel.y * dt

我的加速度被定义为相对于 x 乘以波的速度平方的二阶导数,如此处所示

所以我从这个转换我的方程:

(d²u/dt²) = c² (d²u/dx²)

变成这样的离散方程(其中u,表示一个粒子的位置和c波的传播速度):

d2u = u(x + 2h, t) - 2*u(x + h, t) + u(x, t)
d2t = 1e-5 // small step
acc = c * c * (d2u / d2t)

但我的结果很奇怪: 我的波

正如你所看到的,当预期的结果是这样的时候,波浪变大了:

预期波

我做错了什么?有人可以帮助我吗?谢谢 :)

标签: javascriptmathsimulation

解决方案


推荐阅读