高校数学10分プログラミング(数学Ⅱ編 5.微分法と積分法)1日目「数値微分について考える」解説
マガジンリスト > 数学Ⅱ編 5.微分法と積分法 > 1日目 解説
本日の課題、おつかれさまでした。
課題の微分係数の真値と3つの数値微分の結果を比較するためのプログラムを作成することができたでしょうか。
解答例
今回の課題の微分係数の真値と3つの数値微分の結果を比較するためのプログラムの例を示します。
// 数値微分の精度比較
void setup(){
float h = 0.001; // 差分の大きさ
// (1) f'(0)
float a = 0.0;
float exact = f_prime(a);
float front = front_diff(a,h);
float back = back_diff(a,h);
float central = central_diff(a,h);
println("(1):", exact, "前方差分:", front, "後方差分:", back, "中心差分:", central);
// (2) f'(1)
a = 1.0;
exact = f_prime(a);
front = front_diff(a,h);
back = back_diff(a,h);
central = central_diff(a,h);
println("(2):", exact, "前方差分:", front, "後方差分:", back, "中心差分:", central);
// (3) f'(-1)
a = -1.0;
exact = f_prime(a);
front = front_diff(a,h);
back = back_diff(a,h);
central = central_diff(a,h);
println("(3):", exact, "前方差分:", front, "後方差分:", back, "中心差分:", central);
// (4) f'(2)
a = 2.0;
exact = f_prime(a);
front = front_diff(a,h);
back = back_diff(a,h);
central = central_diff(a,h);
println("(4):", exact, "前方差分:", front, "後方差分:", back, "中心差分:", central);
}
// f(x) =3x^2+2x+1
float f(
float x
){
return 3.0*x*x+2.0*x+1.0;
}
// f'(x) = 6x+2
float f_prime(
float x
){
return 6.0*x+2.0;
}
// 前方差分
float front_diff(
float a,
float h // 差分の大きさ
){
return (f(a+h)-f(a))/h;
}
// 後方差分
float back_diff(
float a,
float h // 差分の大きさ
){
return (f(a)-f(a-h))/h;
}
// 中心差分
float central_diff(
float a,
float h // 差分の大きさ
){
return (f(a+h/2.0)-f(a-h/2.0))/h;
}ソースコード2 微分係数の真値と3つの数値微分の結果を比較するためのプログラム(完成版)
ソースコード2を、スケッチ「calcThreeDifferences」のテキストエディタ部分に書いて実行すると、コンソールに
(1): 2.0 前方差分: 2.0029545 後方差分: 1.9969939 中心差分: 2.0000339
(2): 8.0 前方差分: 8.003235 後方差分: 7.9970355 中心差分: 8.000374
(3): -4.0 前方差分: -3.996968 後方差分: -4.0032864 中心差分: -4.0000677
(4): 14.0 前方差分: 14.001845 後方差分: 13.998031 中心差分: 13.999938
と出力されます(図4)。

今回、$${h=0.001}$$として計算した結果、数値微分としては中心差分が一番精度よく近似できていることがわかります。
本日は以上です。
明日は、接線を描くプログラムについて考えていきます。
明日もよろしくお願いします。
読んだ感想などをお寄せください
本記事を読んだ感想や質問などを以下のお問い合せフォームからお寄せください。(お問合せフォームの本文に、本記事のタイトルを入れてください。)
MK’s papa
