情報通信工学科 コンピュータ数値解析(学内専用) 担当:中川朋子
よくある間違い!
「前の値と同じになったから、誤差は0で、このときの値は正しい」 は間違いです。
プログラムが間違っているために刻み数を変えても積分値が変わらなかった場合だって
「前の値と同じ」になります。これじゃだめです。
「前の値との差が最も小さくなったので、このときの値が最も精度が良い」 も間違いです。
大事なのは規則性です。
台形公式なら、誤差は、刻み幅の2乗に比例します。
区間数を倍、倍、、にしたら、「誤差」や「前の値との差」が 1/4、1/4、、になっていきます。
この規則性が最初から崩れている場合は、プログラムが間違っているか、刻みが粗すぎです。
最も多いのは、開始・終了の回数が間違っている場合です。
s = f(a)/2; これが i = 0 番目ですから、
for loop は i = 1 から始めないといけないのに、
i = 0から始めてしまうと、i = 0 番目でがダブります。
for loop の終了条件の間違いも多いです
i =1 番目から i = n-1 番目まで
s = s + f(x); を足していかないといけないのに、
(n-1番めも入る)
for loop の終了条件が
for (i=1; i < n-1; i++){ となっていたのでは、
i は n-1
より小さい
時
(つまりi = n-2 ) までしか加算されません。
i < n-1 でなく、
i <= n-1 か
i < n でないといけません。
端の1本くらいどうってことない?いえいえ、
「長方形の短冊で近似」(0次近似)と
「台形で近似」(1次近似)だって、端の1本分しか違わないのですよ。
for loop の中に台形の面積の公式(上底+下底)/2 をベタに書いた場合は
s=0;で始めて、i < nまでで
そのまま終わらないといけません。
s=f(a)/2 とかs =s+f(b)/2;とかをつけたら誤りです。
s=f(a)/2 とかs =s+f(b)/2;とかをつけるのは、
高速化のためにループ内をs=s+f(x) にしたバージョンです。
プログラムが中途半端に混ざってると、かえって精度度が悪くなり、
区間数を倍、倍、、にしたとき、
「誤差」や「前の値との差」が 1/4、1/4、、にならないで 1/2, 1/2, ...にしかなりません。
そういう間違いは全部チェックしたのに「前の値との差」が 1/4、1/4、、にならない
台形公式の課題のページに戻る