def difference_m(n) if 0.785398163397448-montecarlo(n)>0 0.785398163397448-montecarlo(n)<10**(-3) else montecarlo(n)-0.785398163397448<10**(-3) end endとして、trueが出るか試しました。n=100でも何回もやると、trueが返されたので、1と答えたましたが、適当にやったと先生はおっしゃいました。
何が間違っているのでしょうか?
if 0.785398163397448-montecarlo(n)>0の実行時に montecarlo(n)が0.75を返し,
0.785398163397448-montecarlo(n)<10**(-3)の実行時に,montecarlo(n)が0.80を返した場合は,どちらも誤差が10-3よりも大きい場合でも,trueを返し ます.
irb(main):003:0> load("./simpson.rb") SyntaxError: ./simpson.rb:7: Invalid char `\343' in expression ./simpson.rb:7: Invalid char `\200' in expression ./simpson.rb:7: Invalid char `\200' in expression ....(略) ./simpson.rb:12: Invalid char `\343' in expression ./simpson.rb:12: Invalid char `\200' in expression ./simpson.rb:12: Invalid char `\200' in expression from (irb):3:in `load'エラーの意味が分かりませんでしたorz
SyntaxError: ./simpson.rb:7: Invalid char `\343' in expression ./simpson.rb:7: Invalid char `\200' in expression ./simpson.rb:7: Invalid char `\200' in expressionこの\343, \200, \200は1バイトを8進数で表現したもので,この3バイトの列は日本語入力モードの時に,スペースキーを押して入力される,「いわゆる全角スペース」の文字コードに対応しています.これを普通のスペースに置き換えれば動くはずです.
irb(main):201:0> 01111110 => 299592となってしまったのはなぜでしょうか。
irb(main):005:0> 8**6+8**5+8**4+8**3+8**2+8**1 => 299592と解釈されたのです.間違えやすい仕様ですね.
乱数列の最初のm個は実行した時刻など,滅多に重ならないものを使うことが多いのですが,熱雑音等の物理現象に基づく真の乱数を使うこともあります.
def simpson(xs,xe,n,&func) deltax=(xe-xs)*0.5/n sum=func.call(xs)+func.call(xe)+4*func.call(xs+deltax) for i in 1..(n-1) sum=sum+2*func.call(xs+2*i*deltax)+4*func.call(xs+(2*i+1)*deltax) end sum*deltax/3.0 endのように定義すると,
irb(main):015:0> simpson(0,1,100) {|x| x**2+1} => 1.33333333333333のようにして,関数の部分をその場で与えることができます.
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 + (f(xs+2*deltax*i)*2 + 4*f(xs+(2*i+1)*deltax)) end deltax * sum / 3.0 end
def bool(xs,xe,n) dx = (xe-xs)*0.25/n sum = 7*f(xs) + 32*f(xs+dx) + 12*f(xs+dx*2) + 32*f(xs+dx*3) + 7*f(xe) for i in 1..(n-1) sum=sum+14*f(xs+4*i*dx)+32*f(xs+(4*i+1)*dx)+12*f(xs+(4*i+2)*dx)+32*f(xs+(4*i+3)*dx) end dx * sum / 22.5 end
ruby vote.rb 選択肢番号のように使います.
ruby check.rb ex01.rbと実行すると,関数を与えた時の入力と出力があっていることが確認できます.