4

超初心者ですのでお手柔らかにお願いします。

私はいくつかの Python 演習をいじくり回しており、次のようなコードがあります。

def newton(x0, Tol):
    def F(x):
        return (x**3)+898
    def dF(x):
        return 3*x**2
    x=[x0]
    for n in range(400):
        x.append(x[n]-(F(x[n]))/dF(x[n]))
        if abs((x[n+1])-(x[n]))<Tol:
            conv='Converge'
            print n
            break
    if abs((x[n+1])-(x[n]))>=Tol:
        conv='No converge'
    return x[n+1], conv

F(x)関数とその導関数を定義dF(x)し、リストに値を追加しますx

タスクは、シリーズが収束するかどうかを確認することであり、成功したと思います。

しかし、私が持っている質問は、関数を持つことと、関数(x**3)+8983*x**2の引数としてのものNewtonです。

想像したらこんな感じだった

def newton(f, df, x0, Tol):
    def F(x):
        return f
    def dF(x):
        return df
    *calculations*
    return x[n+1], conv

そして、あなたはそれを

newton((x**3)+898, 3*x**2, x0=something, Tol=something)

関数F(x)dF(x)がプロセスで定義されるようにします。

ただし、x定義されていないため、機能しません。

演習では、「newton」のパラメーターとして f と df が必要であることに注意してください。

これを解決するにはどうすればよいでしょうか?

ありがとう。

4

2 に答える 2

6

基本的に単純な関数であるlambdasを使用できます。

次のように呼び出します。

newton(lambda x: (x**3)+898, lambda x: 3*x**2, x0=something, Tol=something)

これは、次のようなことを行うのと同じです。

def f1(x):
    return (x**3)+898
def f2(x):
    return 3*x**2
newton(f1, f2, x0=something, Tol=something)

唯一の違いは、「ラムダに名前を付けない」、つまり変数に代入しないことです。これは、一度だけ使用する必要がある関数、特にsortedや などの関数のキー引数として便利ですmax

于 2013-04-19T10:22:56.833 に答える
3

使用lambda:

newton(lambda x: (x**3)+898, lambda x: 3*x**2, x0=something, Tol=something)
于 2013-04-19T10:22:30.087 に答える