【问题标题】:Triple Integration: ValueError: negative number cannot be raised to a fractional power三重积分:ValueError:负数不能提高到分数幂
【发布时间】:2017-11-13 19:09:29
【问题描述】:

我正在尝试对一个函数进行三重集成。

from scipy.integrate import tplquad

S = 40
P1 = 0.37
P2 = 0.43
P3V = .05
UND = 1 - (P1+P2+P3V)    

b1 = S*P1
b2 = S*P2
b3 = S*P3
b4 = S*UND

x1 = 48
x2 = 47
x3 = 4
x4 = 1

tp1 = tplquad(lambda x, y, z: ((x**(b1 + x1 - 1))*(y**(b2 + x2 - 1))*(z**(b3 + x3 - 1))*((1-x-y-z)**(x4+b4-1))), 0, 1, lambda z: z, lambda z: (1-z)/2, lambda x,z: 0, lambda x,z: x)

这是投掷:

ValueError: 负数不能乘以分数次方

我正在尝试集成功能(x**(b1 + x1 - 1))*(y**(b2 + x2 - 1))*(z**(b3 + x3 - 1))*((1-x-y-z)**(x4+b4-1))

超出以下限制:

  • 首先,y 从 0 到 x,

  • 那么,x 从 z 变为 (1-z)/2,

  • 然后,z 从 0 变为 1。

谁能告诉我我做错了什么?

【问题讨论】:

    标签: python python-2.7 math scipy integration


    【解决方案1】:

    为了调试,我稍微改了一下:

    def func(x, y, z):
        print(x, y, z)
        print(b1 + x1 - 1)
        print(b2 + x2 - 1)
        print(b3 + x3 - 1)
        print(1-x-y-z)
        print(x4+b4-1)
        return x**(b1 + x1 - 1) * y**(b2 + x2 - 1) * z**(b3 + x3 - 1) * (1-x-y-z)**(x4+b4-1)
    

    所以在运行集成时:

    tp1 = tplquad(func, 0, 1, lambda z: z, lambda z: (1-z)/2, lambda x, z: 0, lambda x,z: x)
    

    我得到以下信息:

    0.25 0.375 0.5
    61.8
    63.2
    5.0
    -0.125
    5.9999999999999964
    

    来自1-x-y-z-0.125 是问题所在。您要求 Python 计算负数 (1-x-y-z)**(x4+b4-1) 的分数幂。在大多数情况下,结果会很复杂。

    即使这不是问题(在 python-3.x 中,负数的小数幂不是问题!)它仍然会遇到floattriplequad 要求:

    >>> # Python-3.x
    >>> tp1 = tplquad(func, 0, 1, lambda z: z, lambda z: (1-z)/2, lambda x, z: 0, lambda x,z: x)
    TypeError: can't convert complex to float
    

    因此,您的函数似乎存在根本问题(或边界不正确)。这是你必须解决的问题。我只能猜测可以做什么。

    【讨论】:

    • 感谢您的更新。我知道1-x-y-z 不应该是负数,这是计算积分极限时使用的不等式之一。另外两个不等式是x>yx>z
    • 任何想法这个三重积分的极限应该给出三个方程:x>yx>zx+y+z<=1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 2016-01-12
    • 2017-11-17
    相关资源
    最近更新 更多