2016-07-28 3 views
1

SciPyから放物線円柱D関数を使用しようとしていますが、複雑な引数に問題があります。エラーを生成するサンプル・コードは次のとおりです。SciPy放物線円柱Dと複合引数

#!/usr/bin/env python 

import numpy 
import scipy.special as special 
# test real numbers 
test = 0.735759 
A = test - special.pbdv(1,2)[0] 
print A 
# test complex numbers. 
test = 9.43487e-16+1j*5.1361 
A = test - special.pbdv(3,-1j)[0] 
print A 

私が手にエラーがある:

---> 19 A = test - special.pbdv(3,-1j)[0] 
    20 print A 
    21 

TypeError: ufunc 'pbdv' not supported for the input types, and the inputs could not be 
safely coerced to any supported types according to the casting rule ''safe'' 

From the documentation関数は単に複雑な引数で動作するように定義されていないように見えます。他のscipy関数(Bessel関数jvのような)は、それらが複雑な引数を受け入れることを明示しているので、私はエラーの読み方に間違っているとは思わない。

私の次の質問:複雑な引数を受け入れるPythonの放物線円柱D関数の実装はありますか?私はAbramowitz and Stegunから自分自身を構築しようとしましたが、Mathematicaに同意することはできません。提案をいただければ幸いです。私のGoogleのスキルは何も明らかにしていない。

編集: Question is similar to the question here

+0

FWIW: 'mpmath'には、複雑な' z'を受け入れる 'pcfd(n、z)'を含むパラボリックな円筒関数のいくつかのフレーバーがあります。それはかなり遅いですが、それは 'mpmath'の一部なので、あなたが好きなほど高い(または忍耐を持って)ように精度を上げることができます。それ以外のものがあれば、それを使って実装をチェックすることができます。 –

答えて

1

私はまだ関数のscipy実装が複雑な引数を受け入れない理由を理解していません。

私はAbramowitz and Stegunで定義された機能を動作させることができました。以前の試みで何が間違っているのか分かりません。私は、関数を記述するためのより良い方法があると確信しているが、ここでは複素数値のためのpythonで放物柱D機能を使用するための私の実装です:

import numpy 
import scipy.special as special 

PI = numpy.pi 

def y1(a,z): 
    return numpy.exp(-0.25*(z**2.0))*special.hyp1f1(0.5*a+0.25,0.5,0.5*(z**2.0)) 

def y2(a,z): 
    return z*numpy.exp(-0.25*(z**2.0))*special.hyp1f1(0.5*a+0.75,1.5,0.5*(z**2.0)) 

def U(a,z): 
    zeta = 0.5*a+0.25 
    return (1/numpy.sqrt(PI))*(1/(2.0**zeta))*(numpy.cos(PI*zeta)*special.gamma(0.5-zeta)*y1(a,z) \ 
    -numpy.sqrt(2)*numpy.sin(PI*zeta)*special.gamma(1-zeta)*y2(a,z)) 


def ParabolicCylinderD(v,z): 
    b = -v-0.5 
    return U(b,z) 

は編集:インデックスが負の場合、これは動作しません。 。なぜダニー?私はウォーレンの上記のMPmathの提案に切り替えました。それは私の必要性のために十分に速いです。

関連する問題