差分法 前進・後退・中心[Python]

こんにちは、さくらえびです。
本稿では、微分を実行するプログラムをご紹介します。
先行で作ったC言語、Fortranに加えて、Pythonで「関数を引数とする関数」を作成するお話も含め、ご紹介します。

f(x)という関数を引数に持つ微分関数を下記のように定義します。

def f(x):
    ans = x*x;
    return ans;

実際にプログラムとして、使用する際は、下記のように使います。

print(f(x));

Pythonでの微分プログラムのソースは以下のとおり

# 中心差分プログラム
def DIFC(f,x,dx):
    ans = (f(x+0.5*dx)-f(x-0.5*dx))/dx;
    return ans;
# 前進差分プログラム
def DIFF(f,x,dx):
    ans = (f(x+dx)-f(x))/dx;
    return ans;
#後退差分プログラム
def DIFB(f,x,dx):
    ans = (f(x)-f(x-dx))/dx;
    return ans;

実際に実行してみます。実行するソースコードは以下のとおりです。

# 2次関数
def f(x):
    ans = x*x;
    return ans;
# 中心差分プログラム
def DIFC(f,x,dx):
    ans = (f(x+0.5*dx)-f(x-0.5*dx))/dx;
    return ans;
# 前進差分プログラム
def DIFF(f,x,dx):
    ans = (f(x+dx)-f(x))/dx;
    return ans;
#後退差分プログラム
def DIFB(f,x,dx):
    ans = (f(x)-f(x-dx))/dx;
    return ans;
x  = 1
dx = 0.000001
print("==Result==");
print("input=", x);
print("result of f/dx(centre)=" ,DIFC(f,x,dx));
print("result of f/dx(forward)=" ,DIFF(f,x,dx));
print("result of f/dx(backward)=" ,DIFB(f,x,dx));
print("==Error Value==");
v1 = 2-DIFC(f,x,dx);
v2 = 2-DIFF(f,x,dx);
v3 = 2-DIFB(f,x,dx);
print("result of centre different=" ,v1);
print("result of forward different=" ,v2);
print("result of backward different=" ,v3);
実行結果

中心差分法の方が計算精度がよいことがわかります。
学校で履修するプログラムは前進差分法ですが、多様な微分プログラムがあることを知り、ご活用ください。

by さくらえび

リンク:
微分プログラム[C言語]
微分プログラム[Fortran]
差分法 前進・後退・中心[fortran]

  • さくらえび
  • さくらえびと申します
    企業勤め系研究者です。理論物理が専門分野。
    エンジニア・営業・コンサルを経験し、今はデータサイエンティストとしてお仕事をさせていただいております。