2

以下の定積分を、反復ごとに異なる定数 c の値を考慮するループで解くプログラムを書きたいと思います。

次に、積分の各解を新しい配列に出力したいと思います。

このプログラムを Python で作成するにはどうすればよいですか?

ここに画像の説明を入力

0 から 1 の間の制限があります。

from scipy import integrate

integrate.quad

ここでは受け入れられます。私の主な苦労は、プログラムの構造化です。

これは古い試みです(失敗しました)

# import c
fn = 'cooltemp.dat'
c = loadtxt(fn,unpack=True,usecols=[1])

I=[]
for n in range(len(c)):

    # equation
    eqn = 2*x*c[n]

    # integrate 
    result,error = integrate.quad(lambda x: eqn,0,1)

    I.append(result)

I = array(I)
4

3 に答える 3

5

たとえば、[0, 9] の c の与えられた積分を計算するには、次のようにします。

[scipy.integrate.quadrature(lambda x: 2 * c * x, 0, 1)[0] for c in xrange(10)]

これは、リスト内包表記とラムダ関数を使用しています。

あるいは、与えられた c からの積分をufuncとして返す関数を定義することもできます( vectorizeのおかげです)。これはおそらく numpy の精神に近いものです。

>>> func = lambda c: scipy.integrate.quadrature(lambda x: 2 * c * x, 0, 1)[0]
>>> ndfunc = np.vectorize(func)
>>> ndfunc(np.arange(10))
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.])
于 2012-08-16T12:59:50.930 に答える
3

あなたは本当に近くにいます。

fn = 'cooltemp.dat'
c_values = loadtxt(fn,unpack=True,usecols=[1])

I=[]
for c in c_values: #can iterate over numpy arrays directly.  No need for `range(len(...))`

    # equation
    #eqn = 2*x*c[n] #This doesn't work, x not defined yet.

    # integrate 
    result,error = integrate.quad(lambda x: 2*c*x, 0, 1)

    I.append(result)

I = array(I)

操作方法について少し混乱していると思いますlambda

my_func = lambda x: 2*x

は次と同じです:

def my_func(x):
    return 2*x

それでもラムダが気に入らない場合は、次のようにすることができます。

f(x,c):
   return 2*x*c

#...snip...
integral, error = integrate.quad(f, 0, 1, args=(c,) )
于 2012-08-16T13:03:51.437 に答える
0
constants = [1,2,3]

integrals = []                                  #alternatively {}

from scipy import integrate

def f(x,c):
    2*x*c

for c in constants:
    integral, error = integrate.quad(lambda x: f(x,c),0.,1.)
    integrals.append(integral)                 #alternatively integrals[integral]

これにより、定数のリストが何であれ、ニコラスの回答と同じようにリストが出力されます。

于 2012-08-16T13:03:27.403 に答える