数值求解微分方程,域很长,[0, +10^6),所以计算时间很长

计算科学 数学
2021-12-23 05:56:39

有什么方法可以解决这个问题吗?我正在使用 Mathematica 来求解微分方程,但是由于域很大,计算时间很长。事实上,我不需要 x=0,0.01,0.02,0.03 处的 y 阀门……我只需要 x=0,1000,2000 处的值……甚至更少稀释。但是要获得 x=1000 的值,程序必须经过 x=0.01,0.02 ......这就是为什么要花费这么多时间的原因。我想知道这个聪明的方法是否可以促进这个过程(比如,计算机不需要将值存储在 x=0.01,0.02...,而只是使用这些数字作为计算以下几点的桥梁)。x[0,106)

非常感谢!

2个回答

实际上,您可以将问题的变量缩放到不同的区间。通过公式 where ( ) 转换为\x[0,a]a=106ξ[0,1]ξ=xa

因此,使用链式法则我​​们有因此,将替换为,您可以求解 a 中的新问题更短的持续时间,比如dydx=dydξdξdx=1adydξdydx1adydξy=y(ξ)[0,1]

@tqviet 已经以某种方式表达了这一点,但让我换一种说法:106本身并不是一个大的结束时间。这似乎是一个很大的数字,因为它最后有 6 个零,但这完全取决于 (i) 你计算它的单位,(ii) 你试图建模的效果有多快。

举个例子:如果我告诉你你必须计算到106皮秒,你可能不会认为那是很长的时间——毕竟,它只是106秒。但真正重要的是与你试图描述的事物相关的时间甚至106如果你试图模拟一个星系的演化,年并不是很长——这些事情发生在数十亿年的时间尺度上,所以106可以在一个或几个时间步骤内完成。另一方面,如果你试图模拟天气——它在小时的时间尺度上起作用——那么106岁月显然是一个非常非常长的时间。事实上,如果你的目标是模拟半导体中电子的运动——它在纳秒甚至更短的时间尺度上工作——那么106年是一个更长的时间间隔。换句话说,这真的取决于你在看什么。

这导致了最后一个观察:您正在使用大小的时间步长0.01. 但为什么?因为您认为时间步长需要很小(无论您使用什么单位,都明显小于 1),或者因为您的系统动态发生在 0.01 个时间单位的时间尺度上?在后一种情况下,选择显然是有效的。但是如果你的系统的动态发生在 ~100 或 ~1000 甚至更多时间单位的时间尺度上,那么就不需要这么小的时间步长:你应该能够使用Δt=10,100,甚至更多。在那种情况下,你确实会很快到达你的末日。