Wolfram mathematica 求解波动方程时的不稳定性
我正在尝试使用Wolfram mathematica 求解波动方程时的不稳定性,wolfram-mathematica,Wolfram Mathematica,我正在尝试使用NDSolve求解波动方程,以检查使用它是否比使用旧的特征方程方法更容易和/或更快 我得到了很多用特征线方法得不到的不稳定性,因为这些都是简单的方程,我想知道哪里不对。。。(希望不是问题的物理方面…) 有人能帮我吗 编辑: 我将NDSolve解决方案(在JxB编辑之后)与我的特征解决方案一起放在同一个动画中。除了最初的快速振荡外,它们的匹配足够接近。随着时间的推移,它们往往会开始去同步,但我相信这可能是由于我们在推导特征时不得不承认的一个小简化 红色:NDsolve;蓝色:“手
NDSolve
求解波动方程,以检查使用它是否比使用旧的特征方程方法更容易和/或更快
我得到了很多用特征线方法得不到的不稳定性,因为这些都是简单的方程,我想知道哪里不对。。。(希望不是问题的物理方面…)
有人能帮我吗
编辑:
我将NDSolve
解决方案(在JxB编辑之后)与我的特征解决方案一起放在同一个动画中。除了最初的快速振荡外,它们的匹配足够接近。随着时间的推移,它们往往会开始去同步,但我相信这可能是由于我们在推导特征时不得不承认的一个小简化
红色:NDsolve
;蓝色:“手动”特性方法
按F5(刷新浏览器),从t=0
重新启动动画
(xx比例是我使用“手动”方法的点数,其中每个点代表20个单位的NDSolve
/物理比例)
使用
NDSolve
栅格采样,可呈现完全不同的振荡效果。是否有人拥有或知道确保正确积分的技术?通过将系数更改为无限精度(例如,1/9.8->10/98),并设置工作精度->5(值6太高),我不再收到错误消息:
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}]
我不知道这个方程,所以我不相信解决方案:小规模振荡最初增长,然后衰减。我想你会在数学网站上得到更多答案:@dario谢谢你的建议(我会尝试一下)。但由于这些方程应该是稳定的,我认为这更像是Mathematica的问题,尽管我不是这方面的专家……如果你怀疑,因为我从未使用Mathematica,我所能建议的就是将其更新到最新版本。如果问题是由Mathematica中的错误引起的,那么这可能会解决您的问题。您是否收到任何消息,或者只是注意到插值函数
通过特征相对于您的解决方案有问题?@dario-将“Mathematica问题”理解为“Mathematica相关问题”,而不是“Mathematica相关问题”->,即,不一定是一个错误…它做得更好,在某种程度上,我相信这证明了高振荡效应是NDSolve的某种数值异常。这应该是水波。设定边界条件以模拟水从非水平状态下落后,在封闭的“水池”内的水在墙之间反弹。所以,我也不相信小尺度的振荡。。。另外,因为我的“手动”特征方法没有显示这种行为(它们只显示长的慢波)。如果你添加填充->底部,它会变得更清楚模拟什么…@JxB如果你能解释为什么工作精度应该低(以及为什么6太高),那就好了。
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}]