1

プログラムは、連続反応A-> B->C->..における試薬の濃度を時間で表す方程式を解釈します。

http://en.wikipedia.org/wiki/Rate_equation#Consecutive_reactions

アルゴリズムは私自身が考案したものであり、濃度関数を取得するために微分方程式を解く必要性を完全に無視することができます。これらの方程式を綿密に調べると現れるパターンを利用します。

動作するコードは浮動小数点数を使用しますが、欠点があります。任意の2つの与えられたn値の速度定数k_nの値が類似している場合、浮動小数点数の不正確さが始まり、結果はエラー増幅の海に溺れます。

グラフ

float()をdecimal()に置き換えるとこの問題が解決するはずだと思いましたが、残念なことに、この変更により予期しないエラーが発生しました。

float()をdecimal()に置き換えた後:

Traceback (most recent call last):
  File "conreact9.py", line 280, in <module>
    exec(comm)
  File "<string>", line 1, in <module>
  File "conreact9.py", line 256, in graphit
    p += plt.plot(t,eval(c_(i)),label= "c_" + str(i) + "(t)")
  File "<string>", line 1, in <module>
  File "C:\Python27\lib\decimal.py", line 658, in __new__
    raise TypeError("Cannot convert %r to Decimal" % value)
TypeError: Cannot convert array([0, -0.1, -0.2, -0.3, -0.4, -0.5, -0.6, -0.7, -0
.8, -0.9, -1.0, -1.1,
       -1.2, -1.3, -1.4, -1.5, -1.6, -1.7, -1.8, -1.9, -2.0, -2.1, -2.2,
       -2.3, -2.4, -2.5, -2.6, -2.7, -2.8, -2.9, -3.0, -3.1, -3.2, -3.3,
       -3.4, -3.5, -3.6, -3.7, -3.8, -3.9, -4.0, -4.1, -4.2, -4.3, -4.4,
       -4.5, -4.6, -4.7, -4.8, -4.9], dtype=object) to Decimal

そして、NumPy exp()を同等の10進数に置き換えたときのこのエラー:

Traceback (most recent call last):
  File "conreact10.py", line 280, in <module>
    exec(comm)
  File "<string>", line 1, in <module>
  File "conreact10.py", line 256, in graphit
    p += plt.plot(t,eval(c_(i)),label= "c_" + str(i) + "(t)")
  File "<string>", line 1, in <module>
AttributeError: exp

Googleまたはdecimalモジュールの公式ドキュメントを使用して何も見つかりませんでした。

参考のために、手付かずのコードを次に示します。

http://pastebin.com/mfuwVq7B

そして、これを変更する私の試みは次のとおりです。

http://pastebin.com/xde4gvHu

これは私が見ることができない非常に基本的なものかもしれません。私は化学部の学生であり、プログラミングに関しては初心者です(以前の経歴はありません)。どうもありがとうございます。

4

1 に答える 1

1

問題はnumpy.exp()withの置換ですDecimal.decimal.exp()

前者は配列を取り、eを各要素でべき乗した配列を返します。

>>> x = np.linspace(-2*np.pi, 2*np.pi, 100)
>>> xx = x + 1j * x[:, np.newaxis] # a + ib over complex plane
>>> out = np.exp(xx)

後者は単一の数値で動作します:

>>> decimal.Decimal(1).exp()
Decimal('2.718281828459045235360287471')

(上記のリンク先のページからの例)。

于 2013-03-04T06:28:52.287 に答える