2017-06-12 53 views
1

我正在嘗試三重積分功能。三重積分:ValueError:負數不能升到分數

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: negative number cannot be raised to a fractional power

我想要的功能整合(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

誰能告訴我,我做錯了什麼?

回答

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.1251-x-y-z是問題。你要求Python計算負數的分數冪(1-x-y-z)**(x4+b4-1)。在大多數情況下,結果會很複雜。

即使這不是一個問題,它仍然會碰上float -requirement的triplequad(在python-3.x的負數的分數冪是沒有問題的!):

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

因此,你的函數看起來有點根本錯誤(或者邊界不正確)。這是你必須要解決的問題。我只能猜測可以做什麼。

+0

感謝您的更新。我知道'1-x-y-z'不應該是負數,這是計算積分極限時使用的不等式之一。另外兩個不等式是'x> y'和'x> z' – ProgSnob

+0

任何想法這個三重積分的極限應該給出三個方程:'x> y'和'x> z'和'x + y + z <= 1' – ProgSnob