2017-01-24 9 views
-1

私はJoel GrusによってData Science Scratchを読んでおり、単純な差分商関数がどのようにPythonを使って動作するか理解しています。ここ
コードである:Pythonを使用した関数の差異の発見

fは、hは0

def difference_quotient(f, x, h): 
    return (f(x + h) - f(x))/h 

に近づくように、私はこれが限界を見つけるためだけの式であることを理解し、xに依存し、1つの変数関数の関数です。この場合は派生ですが、スクリプトの仕組みはわかりません。 f*(something)ではなく、f(something)のreturn文を使用できるようにするには、どのような引数を関数に入れますか。これまでのところ、私は 'float'/'dict'オブジェクトが呼び出し可能でないなどのエラーを受けています。

+0

明らかに 'f'はあなたが' difference_quotient'に渡して呼び出す関数であるはずです。だから、 'f(x + h)'と 'f(x)'はあなたが渡した関数を別々の引数で呼んでいます。 – khelwood

+0

FWIW、Joel GrusはSOメンバーのhttp:// stackoverflowです。co.jp /ユーザー/ 1076346/joel –

答えて

0

「誰かが」あなたの質問に答えましたが、あなた(と将来の読者が)、この補足情報が役立つことがあります。

は、このコードを試してみてください。

微分の正確な近似を得るには、hをかなり小さくする必要があります。しかし、小さすぎると、Pythonの浮動小数点数の精度が限られているため、実際には正確さが失われます。 decimalモジュールを使用すると、精度が向上します。しかし、そのモジュールは単純な算術演算子と平方根関数しかサポートしていません。三角関数や指数関数などの優れた関数が必要な場合は、mpmathなどの第三者パッケージの任意精度の数学パッケージを使用できますが、mpmathを使用する場合はnumerical derivative functionsを使用します。

FWIWの場合、xを中間にすることで、微分近似をより正確にすることができます(与えられたhの場合)。ここでは、短いデモだ:ここでは

def dfa(f, x, h): 
    return (f(x + h) - f(x))/h 

def dfb(f, x, h): 
    hh = 0.5 * h 
    return (f(x + hh) - f(x - hh))/h 

# The function 
def func(x): return x**3 + x*x + x + 1 

# Its exact derivative 
def dfunc(x): return 3*x*x + 2*x + 1 

h = 0.001 
for i in range(10): 
    x = 1 + 0.1 * i 
    print(x, dfunc(x), dfb(func, x, h), dfa(func, x, h)) 

出力

1.0 6.0 6.00000024999936 6.004000999999093 
1.1 6.830000000000001 6.830000249999024 6.8343009999995985 
1.2 7.719999999999999 7.72000024999997 7.724600999999609 
1.3 8.67 8.670000249998644 8.674900999999124 
1.4 9.68 9.680000249999487 9.685200999998145 
1.5 10.75 10.750000249998948 10.755500999998446 
1.6 11.880000000000003 11.880000249998801 11.885800999996476 
1.7000000000000002 13.070000000000002 13.07000024999816 13.07610099999934 
1.8 14.32 14.320000249997022 14.326400999998157 
1.9 15.629999999999999 15.630000249997167 15.636700999996478 

は、指数関数の結果です。あなたが含まれるように間隔をずらし、極または不連続の近くだx値の微分を見つけようとしている場合:dfbは絶対確実ではないことを

from math import exp 

def dfa(f, x, h): 
    return (f(x + h) - f(x))/h 

def dfb(f, x, h): 
    hh = 0.5 * h 
    return (f(x + hh) - f(x - hh))/h 

func = dfunc = exp 

h = 0.001 
for i in range(10): 
    x = 1 + 0.1 * i 
    print(x, dfunc(x), dfb(func, x, h), dfa(func, x, h)) 

出力

1.0 2.718281828459045 2.718281941720413 2.7196414225332255 
1.1 3.0041660239464334 3.0041661491195804 3.005668607777512 
1.2 3.3201169227365472 3.320117061074157 3.3217775346887635 
1.3 3.6692966676192444 3.669296820505874 3.6711319276547805 
1.4 4.0551999668446745 4.0552001358102885 4.057228242863253 
1.5 4.4816890703380645 4.481689257074706 4.483930662008362 
1.6 4.953032424395115 4.953032630771403 4.955509766318755 
1.7000000000000002 5.473947391727201 5.473947619807795 5.476685277975513 
1.8 6.0496474644129465 6.049647716480422 6.0526732966712515 
1.9 6.6858944422792685 6.685894720857455 6.689238504094419 

注意ポールまたは不連続が誤った結果をもたらすことがあります。もちろん、同じ問題をdfaとすることができます。例えば、f(x) = 1/xxが負の数である場合、x+hが正の場合です。

2

fは、xの微分商を見つけるための関数です。 (のpython 3)

def difference_quotient(f, x, h): 
    return (f(x + h) - f(x))/h 

def func(x): 
    # this is f of x, the function you are taking the derivative of 
    return x * x 

print(difference_quotient(func, 2, 0.001)) 
+0

ありがとう、それはトリックでした。 – Mwspencer

+0

@Mwspencer問題はありませんでしたが、そのトリックを行った場合は、質問を閉じるようにしてください:https://i.stack.imgur.com/QpogP.png –

関連する問題