0

導関数の定義を使用して、関数 (x)(x - 1) の導関数を見つけたいです。増分を にしたい1e-2。そのため、ゼロになる限界をシミュレートします。Range for Floatsで、ユーザー定義関数を使用して、float 変数を取る範囲関数を作成できることを確認しました。

def frange(x, y, jump):
    while x < y:
        yield x
        x += jump

    def drange(start, stop, step):
     r = start
     while r < stop:
        yield r
        r += step

i = frange(1e-14,1e-2,2)

for k in i:
    set  = []
    x = 1
    dvt = ((x + k ) * (x + k - 1) - x*(x - 1))/k

    set.append(dvt)
    print(set)

プログラムを実行すると、

[0.9992007221626509]

リストに複数の派生物が追加されないのはなぜですか?

4

2 に答える 2

1

あなたが言っているセット

x += jump

これは x の値を 2 + 1e-14 に設定します。これは 1e-2 より大きくなります。

コードを読むと、

myjump = pow(10, jump) #outside the loop

x *= myjump # inside the loop

これにより、この例では各ループが 100 倍され、1e-14、1e-12、1e-10 ... 1e-2 が処理されます。

または、追加するつもりなら、次のように言うべきでした

x += myjump # inside the loop

または、ジャンプが実際に処理するのに十分小さい分数であることをテストする必要があります。

于 2016-01-27T21:19:21.977 に答える
0

Here is a cleaned-up version:

def fn(x):
    return x * (x - 1)

def numerical_diff(fn, x, delta):
    return (fn(x + delta) - fn(x)) / delta

def geometric_series(a, r, n):
    value = a
    for i in range(n):
        yield value     # a * r ** i
        value *= r

def main():
    x = 1.
    for delta in geometric_series(0.01, 0.01, 7):
        print(
            "x = {:5.3f}  f(x) = {:5.3f}  delta = {:16.14f}  f'(x) = {:16.14f}"
            .format(x, fn(x), delta, numerical_diff(fn, x, delta))
        )

if __name__ == "__main__":
    main()

which produces

x = 1.000  f(x) = 0.000  delta = 0.01000000000000  f'(x) = 1.01000000000000
x = 1.000  f(x) = 0.000  delta = 0.00010000000000  f'(x) = 1.00009999999989
x = 1.000  f(x) = 0.000  delta = 0.00000100000000  f'(x) = 1.00000099991773
x = 1.000  f(x) = 0.000  delta = 0.00000001000000  f'(x) = 1.00000000392253
x = 1.000  f(x) = 0.000  delta = 0.00000000010000  f'(x) = 1.00000008284037
x = 1.000  f(x) = 0.000  delta = 0.00000000000100  f'(x) = 1.00008890058334
x = 1.000  f(x) = 0.000  delta = 0.00000000000001  f'(x) = 0.99920072216265
于 2016-01-27T22:28:15.453 に答える