2016-05-22 10 views
1

Integral(t ** t、(t、0、x))をラムダディーしたいと思います。 これはうまくいきますが、lambdifyによって返された新しい関数はnumberを返さず、sympy.integrals.integrals.Integralクラスのみを返します。 しかし、私はそれが浮動小数点数を返すことを望みません。ここSympy、lambdifyでラムダ関数にハード積分を変換

が私のコードである:

import sympy as sp 
import numpy as np 
f = sp.lambdify(x,sp.integrate(t**t,(t,0,x))) 
print(f(2)) #return Integral(t**t, (t, 0, 2)) 
#but i want 2.83387674524687 

答えて

0

Sympyこの積分の閉じた形の解析解を見つけることができない、したがってそれは未評価sympy積分オブジェクトを返します。それはあなたが数値解と細かい表示されますので、あなたは最後に、私はこのために、次の解決策を見つける

import scipy.integrate 

def f(x): 
    return scipy.integrate.quad(lambda t: t**t, 0,x)[0] 

f(2) 

2.83387674525

+0

はい、どうもありがとうございますが、私はsympyとscipyを一緒に組み合わせたいと思っています。 sympy関数からscipyへの切り替え、そして戻る。 –

1

この目的のためにscipyのダウンロードのquad機能を使用することができます。 私はこれを見て、戻りλが関数であることを確認します。 と番号で呼び出すと、オブジェクト(Integarl)が返されます。

私はこのオブジェクトにevalf()を呼び出すことができ、数値を返します。 このように:

import sympy as sp 
import numpy as np 
x = sp.symbols('x') 
f = sp.lambdify(x,sp.integrate(t**t,(t,0,x))) 
def return_number(z): 
    return f(z).evalf() 
return_number(2) #return 2.83387674524687 

これは機能します。

+0

'evalf'はmpmathを使って積分を計算します。これはscipy.integrate.quadよりも正確ですが、遅くなります。 – asmeurer

2

lambdifyscipy.integrate.quadyetを直接サポートしていませんが、適切な定義を追加することは難しくありません。一つは、単にどのように印刷するIntegrallambdifyを伝える必要があります:

def integral_as_quad(expr, lims): 
    var, a, b = lims 
    return scipy.integrate.quad(lambdify(var, expr), a, b) 

f = lambdify(x, Integral(t**t,(t,0,x)), modules={"Integral": integral_as_quad}) 

結果が

In [42]: f(2) 
Out[42]: (2.8338767452468625, 2.6601787439517466e-10) 
scipy.integrate.quad呼び出しにSymPy Integralを変換する機能 integral_as_quadを、定義している私たちはここでやっている

あり、再帰的に被積分関数を弱めます(より複雑または象徴的な積分の制限がある場合は、それらを再帰的に浪費することも望ましいでしょう)。