1

配列、行列、線形代数の計算にnumpyとscipyを使用する有限要素コードをPythonで作成しています。最初に生成されたコードは機能しているようで、必要な結果が得られています。

ただし、他の機能については、分析を複数回実行する関数を呼び出す必要があります。結果を確認すると、両方が同じ入力を使用して呼び出されますが、最初の呼び出しとは完全に異なります。私が考えることができる唯一のことは、ガベージコレクションが機能しておらず、メモリが破損しているということです。

使用する手順は次のとおりです。

  1. セットアップファイルを呼び出してモデルデータベースを生成します:mDB = F0(inputs)
  2. いくつかの変数入力を使用して最初の分析を呼び出します:r1 = F1(mDB、v1)
  3. ステップ2と同じ変数を使用して最初の分析を繰り返します。r2=F1(mDB、v1)

何も変わっていないので、ステップ#2とステップ#3の結果は同じになると思いますが、私のコードは異なる結果を生成します(matplotlibを使用して確認)。

使ってます:

numpy-1.6.2およびscipy-0.11.0を搭載したWindows7上のPython2.7(32ビット)

4

2 に答える 2

2

結果が丸め誤差の影響を受けやすい場合(たとえば、コードにプログラミングエラーがある場合)、一般に浮動小数点の結果は再現できません。これは、最新のコンパイラがコードを最適化する方法が原因ですでに発生しているため、初期化されていないメモリにアクセスする必要はありません。

参照してください: http ://www.nccs.nasa.gov/images/FloatingPoint_consistency.pdf

もう1つの可能性は、計算関数が入力データを変更することです。上記のコメントで言及した点は、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 に答える