0

次のことが可能かどうか疑問に思っていました: 関数が関数を引数として取る場合、内部関数の引数をループで変更できるようにすることはできますか?

任意の関数 f を取り、それを a、b で積分する関数があります。問題は、ループ内で cos(1* x) を統合してから cos(2*x) ....cos(N*x) を統合したい場合、最初の関数にそれを理解させる方法がわからないことです。 integrate(f(i),a,b) と言います cos(1) や cos(2) を統合するという意味ではありませんが、cos(1*x) や cos(2*x) などを統合するという意味ではありません。

例えば:

def integrate(f,a,b):
 h = float(b-a)/10;
 I = 0;
 for i in range(10):
   I+= f(h*i);   <----(1)
return I;

A = zeros(N);
for k in range(N):
  A[k] = integrate(cos(k), a,b)   <-----(2)

私が望むのは、(2) の cos(k) が (1) で f(k * h * i) になるように呼び出されることですが、これは意味がありますか? (2)を変更して(1)のパラメータを変更したい。私がやっているフーリエ級数関数にはこれが必要です。現在の動作方法は、括弧内に (k * h* i) を指定して cos() を呼び出す代わりに、単に cos(k) を呼び出すことです。

4

2 に答える 2

2

あなたはこれを行うことができますfunctools.partial

import functools

def cos_(k, x):
    return cos(k * x)

#...
A[k] = integrate(functools.partial(cos_, k), a, b)

また、Python はセミコロンを必要としません。

于 2012-10-05T02:21:24.943 に答える
1

に関数を渡しているのではなくintegrate、 によって返された値を渡していますcos(k)。あなたの目標を正しく理解していれば、これはラムダ (無名関数)を渡すことで修正できるはずです。

def integrate(f, a, b):
    h = float(b-a)/10
    I = 0;
    for i in range(10):
        I += f(h*i)

    return I

A = zeros(N)
for k in range(N):
    A[k] = integrate(lambda x: cos(k*x), a, b)

それが読みにくい場合は、「通常の」defd 関数を使用して同等の目的を達成できkます。

A = zeros(N)
for k in range(N):
    def callback(x):
        return k*x

    A[k] = integrate(callback, a, b)

(コードはテストされていません)

于 2012-10-05T02:16:15.270 に答える