2017-10-26 8 views
0

x = 0で関数の1次導関数を計算するためにPythonを使用しました。私は何をすべきかを検討するための助けが必要です。私の正確な仕事は、私の近似のエラーがどのようにステップサイズSが10の累乗で減少するかをプロットすることです。hを少なくとも10E-8に減らす必要があります。ここに私のコードは私の関数を作成する次のとおりです。Pythonを使用して近似の誤差を計算すると、ステップサイズが小さくなるにつれて減少します

私の機能とxの値を取得する:

from numpy import * 
from matplotlib.pyplot import * 
def f1(x): 
    g = sin(math.pi*e**-x) 
    return g 
n = 1000 
x = zeros(n+1,dtype=float) 
step = 2.0/float(n) 
f = zeros(n+1,dtype=float) 
df = zeros(n+1,dtype=float) 
dfdx= zeros(n+1,dtype=float) 
for i in range(0,n+1): 

    x[i] = -1.0 + float(i)*step 

    f[i] = f1(x[i]) 
    dfdx[i] = - math.pi*e**(-x[i])*cos(math.pi*e**-(x[i])) 
for i in range(0,n): 

    df[i] = (f[i+1]-f[i])/step 

df[n] = (f[n] - f[n-1])/step 


df2[0]=(f[1]-f[0])/step 
df2[n]=(f[n] - f[n-1])/step 
for i in range(1,n): 

    df2[i] = (f[i+1]-f[i-1])/(2.0*step) 

これはべきだったとして、パイを出力し、私はdfdx[x==0]を計算するのに必要なすべての値を、保存されました。私は、これは私の講義を参照して作られたまともなビットですが、私は何が起こっているのほとんどを知っている。私のエラーをプロットするために、ステップの値の配列hxを作成することにしました。私の推測ではdf[n/2]-dfdx[n/2]です。ここで、nはグリッドポイントの数です。私はこの中で、直接私の可変ステップを使用する必要があると感じ、私は以下の混乱を持っているよう

def f2(x): 
    l = df[n/2]-dfdx[n/2] 
hx = zeros(9,dtype=float) 
er = zeros(9,dtype=float) 

for i in range(0,n+1): 
    hx[i]= df[hx/2]-dfdx[hx/2] + 10**-[i] 
    g[i] = l(hx[i]) 

私は、この内の任意の自信を持っていない(明らかと一緒に - ?私は何をしますか) :

  • 10の累乗でステップサイズを小さくする必要があるアレイを適切に作成するにはどうすればよいですか?コード内でそれを試行する私の方法は動作しません。

  • 私のエラー機能は有効ですか?そうでない場合、なぜですか?

  • ステップサイズが小さくなるにつれて、適切に値を保存するにはどうすればよいですか?次のようなものが動作するはず

+0

あなたが特定のサイズの配列を初期化する必要があるので、あなたが、配列が必要です。しかし、リストを使用すると、 'my_list.append(value) 'を使って要素を簡単に追加することができます – DavidG

+0

私は講師がしたことだけではありません。 – sangstar

答えて

0

import numpy as np 
from matplotlib import pyplot as pl 

# define function 
def f1(x): 
    return np.sin(np.pi*np.exp(-x)) 

# define analytical derivative of function 
def df1dx(x): 
    return -np.pi*np.exp(-x)*np.cos(np.pi*np.exp(-x)) 

# get step size values for approximation logarithmically spaced between 0.1 and 1e-8 
dxv = np.logspace(-1, -8, 7) 

# get true derivative at zero 
dfdx = df1dx(0.0) 
print('Derivative at zero is {} (cf. pi is {})'.format(dfdx, np.pi)) 

# get absolute error between approximation with different step sizes 
errs = [] 
for dh in dxv: 
    dfdxapprox = np.diff(f1(np.array([-dh, dh])/2.))/dh # compute approximation to the differential about zero 
    errs.append(np.fabs(dfdx-dfdxapprox)[0]) # get error 

# plot errors as a function of step size 
pl.loglog(dxv, errs) 
+0

ありがとうございます。いくつかのプロセスに関するちょっとした質問です:(a)logspaceコマンドは何をしますか?あなたは本質的にその行で何をしましたか? (b)errs = []は何をするのですか? "dxvのdhは次の2つの行に何をしますか?dfdxapproxを正確に定義するコマンドは何ですか?私はdiffが何であるかはわかりませんが、私が推測していることは、 dfdx - dfdxapproxの要素を追加して、実際の配列を見つけるのに使われるx = 0についての導関数の近似。 – sangstar

+0

a) logspace'のドキュメントは[here](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.logspace.html)です; b) 'errs = []'は空のリストを作成します; c)dxvのdhの値は、dxvの値を超えてdhvの値をインクリメントしてforループを開始します; d) 'diff'のドキュメンテーションは[ここ](https: /docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.diff.html) - 私は基本的に '-dh/2'と' dh/2'で関数を評価しています。それらの2つの評価の差と 'dh 'で割ってグラディエントを得ます。 pend() 'はリストに追加するだけです。 –

+0

さらにいくつか:a)diff部分について - それはfor-loopにステップ値以上の点がありますか?そしてdiff部分では、作成したステップの値にdhの値が変化するので、最初のループではdh = 0.1と-1で評価していますか? b)0ビットについての差分を評価する際に-iのポイントは何ですか?c)また、dfdx-dfdxapprox)[0]は1つの値を返します。複数の値のエラーのリストをどうやって取得しましたか?それは2つの定義された値の減算です。 – sangstar

関連する問題