我正在尝试使用NDSolve
来解决波动方程,以检查是否更容易和/或更快地使用它而不是我的旧特征eq。方法实施。
我得到了很多不稳定的东西,我没有得到特征方法,因为这些是简单的方程式,我想知道出了什么问题......(希望,不是问题的物理方面...... )
ans = Flatten@NDSolve[{
u[t, x]*D[d[t, x], x] + d[t, x]*D[u[t, x], x] + D[d[t, x], t] == 0,
D[d[t, x], x] + u[t, x]/9.8*D[u[t, x], x] +
1/9.8*D[u[t, x], t] + 0.0001 u[t, x]*Abs[u[t, x]] == 0,
u[0, x] == 0,
d[0, x] == 3 + x/1000*1,
u[t, 0] == 0,
u[t, 1000] == 0
},
d, {t, 0, 1000}, {x, 0, 1000}, DependentVariables -> {u, d}
]
Animate[Plot[(d /. ans)[t, x], {x, 0, 1000},
PlotRange -> {{0, 1000}, {0, 6}}], {t, 0, 1000}
]
有人可以帮助我吗?
修改
我已将NDSolve
解决方案(遵循JxB编辑)与我的特征解决方案一起放在同一动画上。除了最初的快速振荡外,它们的匹配足够接近。随着时间的推移他们开始做不同步,但我相信这可能是由于在推断特征时我们不得不承认的一点点简化。
红色:NDsolve
;蓝色:“手动”特征方法;
按F5(刷新浏览器),从t=0
重启动画。
(xx scale是我用“手动”方法使用的点数,其中每个点代表NDSolve
/物理量表的20个单位
使用NDSolve
网格采样,呈现完全不同的振荡效果。有没有人知道或知道确保正确整合的技术?
答案 0 :(得分:4)
通过将系数更改为无限精度(例如,1 / 9.8-> 10/98),并设置WorkingPrecision->5
(值为6太高),我不再收到错误消息:< / p>
ans = Flatten@
NDSolve[{D[u[t, x] d[t, x], x] + D[d[t, x], t] == 0,
D[d[t, x], x] + u[t, x] 10/98*D[u[t, x], x] +
10/98*D[u[t, x], t] + 1/10000 u[t, x]*Abs[u[t, x]] == 0,
u[0, x] == 0, d[0, x] == 3 + x/1000, u[t, 0] == 0,
u[t, 1000] == 0}, d, {t, 0, 1000}, {x, 0, 1000},
DependentVariables -> {u, d}, WorkingPrecision -> 5]
Animate[
Plot[(d /. ans)[t, x], {x, 0, 1000},
PlotRange -> {{0, 1000}, {0, 6}}], {t, 0, 1000}]
我不知道这个等式,所以我不相信解决方案:小规模振荡最初会增长,然后会被抑制。