差分法 前進・後退・中心[Python]
03/12/2020 15/10/2023
こんにちは、さくらえびです。
本稿では、微分を実行するプログラムをご紹介します。
先行で作った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 さくらえび