1

我正在 Python 中创建有限元代码,它依赖于 numpy 和 scipy 进行数组、矩阵和线性代数计算。最初生成的代码似乎正在工作,我得到了我需要的结果。

但是,对于其他一些功能,我需要调用一个多次执行分析的函数,当我查看结果时,它们与第一次调用完全不同,尽管两者都是使用相同的输入调用的。我唯一能想到的是垃圾收集不起作用,内存被破坏了。

这是使用的程序:

  1. 调用设置文件生成模型数据库:mDB = F0(inputs)
  2. 使用一些变量输入调用第一个分析:r1 = F1(mDB, v1)
  3. 使用 step2 中的相同变量重复第一次分析:r2 = F1(mDB, v1)

由于没有任何改变,我希望步骤#2 和步骤#3 的结果是相同的,但是,我的代码会产生不同的结果(使用 matplotlib 验证)。

我在用:

带有 numpy-1.6.2 和 scipy-0.11.0 的 Windows 7 上的 Python 2.7(32 位)

4

2 回答 2

2

如果您的结果对舍入错误很敏感(例如,您的代码中有一些编程错误),那么通常浮点结果是不可重现的。这已经由于现代编译器优化代码的方式而发生,因此它不需要例如访问未初始化的内存。

请参阅: http ://www.nccs.nasa.gov/images/FloatingPoint_consistency.pdf

另一种可能的可能性是您的计算函数修改了输入数据。您在上面的评论中提到的这一点并不排除这种可能性,因为 Python 是通过引用传递的。

于 2012-12-14T10:28:50.487 回答
0

好的,根据上面的建议,我发现了问题。

我的代码依赖于字典(哈希表)。我将原始输入字典的内容称为 mDB 并对其进行修改,我认为原始内容不会在单独的函数中发生更改,但确实如此。我来自 Fortran 和 Matlab,这些都不会改变。

答案是深度复制我原来字典的内容,而不是简单的分配。请注意,我尝试了简单的复制,如下所示:

A = mDB['A'].copy()

但这也不起作用。我不得不使用:

import copy
A = copy.deepcopy(mDB['A'])

我知道有些人会说我应该阅读手册“Python 中的赋值语句不会复制对象,它们会在目标和对象之间创建绑定”(文档),但这对我来说仍然是新的和奇怪的行为。

对于使用字典以外的方式存储我的原始数据有什么建议吗?

于 2012-12-14T16:07:25.277 回答