ruby check.rb ex06.rbを実行すると関数fが定義されていないというエラーが出てチェックが通らなかった.
load("./trapezoid.rb") def f(x) x/((x+1.0)*(x+2.0)) endとしているので,simpson.rb にこの行を加えればチェックが通ります.
sum = sum + 2*f(xs+2*i*deltax)+4*f(xs+(2*i+1)*deltax)とした場合は、0.11778303563894311
sum = sum + (2*f(xs+2*i*deltax)+4*f(xs+(2*i+1)*deltax))とした場合は、0.11778303563894317 となり、値がわずかに違うのですが、なぜでしょうか? nを様々な値にして試してみましたが、常にわずかに後者の方が大きい値をとりました。
sum = (sum + 2*f(xs+2*i*deltax))+4*f(xs+(2*i+1)*deltax)のように解釈されます.第6章の今日の講義などで出ますが,実数計算で大きな数と小さな数の加減算をおこなうと誤差が発生するので,それが影響している可能性が高いですね.
def simpson(xs,xe,n) deltax = (xe-xs)*0.5/n sum = f(xs)+f(xe)+4*f(xs+deltax) for i in 1..(n-1) sum = sum + 2*f(xs+2*i*deltax) + 4 * f(xs+(2*i+1)*deltax) end deltax * sum / 3.0 end
ruby vote.rb 選択肢番号のように使います.