从离散随机动力系统的模拟中获取输出的“平均值”的数值稳定性

计算科学 数字 模拟 稳定 随机
2021-12-04 02:06:43

我正在为离散随机动力系统编写模拟。由于模拟是随机的,我需要多次运行模拟,然后平均每个时间步的值。我在下面有一些简单的 julia 代码来演示这个过程。

我的问题实际上是关于对来自 100、1000、10000 次模拟的数据进行平均时的数值稳定性。模拟是离散的而不是连续的,所以我不需要太担心细粒度的离散化,因为误差累积真的很重要。但是,我不确定是否存在随着时间的推移累积的舍入误差问题,即使是简单的平均值?

在下面的代码中,我保留了一些模拟输出的运行平均值v所以对于每次模拟运行,我只取运行平均值和新值的平均值——在这种情况下是一个随机数rand()这是一种数值稳定的方法,还是我需要将每个模拟分配并保存到一些大数组或文件中,然后在最后平均它们?

n2 = 5
v = 0.0
for i in 1:n2
    v = mean([v, rand()])
end

任何建议将不胜感激。我试图在数值稳定性与限制不必要的内存分配之间找到正确的平衡。谢谢。

1个回答

事实证明,数字的稳定求和是今天仍在研究的主题——但您可以通过查找“Kahan 求和算法”来获得基础知识。

也就是说,如果您的数字大小差异很大,那么确实只有稳定性问题。在这种情况下,您需要按特定顺序进行求和 - 直观地从小到大 - 以避免在将少量数字添加到已经很大的部分总和时发生灾难性的取消。但这似乎对您来说实际上不是问题:如果您将随机数相加,可能是这样,但有人可能会怀疑您从模拟中得到的数字都大致相同的数量级,并且在那个如果你可以一个接一个地添加它们。这样做的好处是您不必存储任何数字,而只需存储当前运行总和或当前运行平均值。