三重积分:ValueError:负数不能升到分数幂

问题描述 投票:0回答:1

我正在尝试对一个函数进行三重积分。

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 numerical-integration
1个回答
2
投票

我稍微改变了它来调试它:

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

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

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

float
triplequad
要求:

>>> # 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

所以看来你的函数有根本性的错误(或者界限不正确)。这是你必须解决的问题。我只能猜测可以做什么。

© www.soinside.com 2019 - 2024. All rights reserved.