【问题标题】:Substituting float with decimal causes errors用小数替换浮点数会导致错误
【发布时间】:2013-03-03 17:53:02
【问题描述】:

程序解释了描述连续反应A->B->C->中试剂浓度的方程...

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

该算法是我自己设计的,可以完全忽略求解微分方程以获得浓度函数的需要。它利用了仔细检查这些方程时出现的模式。

有效的代码使用浮点数,但它们处于劣势。当任意两个给定 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() 替换为十进制等效项时出现此错误:

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

在十进制模块上使用谷歌或官方文档没有找到任何东西。

这是未修改的代码供参考:

http://pastebin.com/mfuwVq7B

这是我修改它的尝试:

http://pastebin.com/xde4gvHu

这也可能是我看不到的非常基本的东西。我是化学学院的学生,在编程方面我是新手(没有以前的背景)。非常感谢。

【问题讨论】:

  • 请在问题中包含您的代码;不过,首选可重复的小样本。
  • 代码有 279 行,我认为将它留在 Pastebin 比在我在这里所做的更改之前和之后粘贴代码要好得多。我不认为您可以取出代码示例并期望它能够工作。一切都是相互交织的——用户提供起始条件,算法构建方程,matplotlib 绘制它们。当然我可以添加代码,但这会使我的初始帖子更长。
  • 不,您的问题需要在不依赖外部服务的情况下可用且可回答。 Pastebin.com 可能会关闭或完全消失,但您在这里的问题仍然可以回答。这就是为什么我要求您将其设为可重现的样本。弄清楚如何在简短的 sn-p 中重现您的问题也将帮助您自己找出问题所在。
  • 我可以列出进行更改的行,但是可以通过在代码的第一个版本中查找“float(”和“exp(”)找到这些行。
  • 就像我说的,我认为不可能剪掉任何部分并期望它起作用。这正是我必须通过编程来解决这个问题的原因 - 手动提供这么多的信息(构建方程是最费力的)需要几天时间。

标签: python numpy decimal floating floating-point-conversion


【解决方案1】:

问题是将numpy.exp() 替换为Decimal.decimal.exp()

The former takes an array 并返回一个数组,其中 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)

The latter works on single numbers:

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

(示例取自上面链接的页面)。

【讨论】:

    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多