At Fri, 05 Sep 2003 09:59:50 +0900, Shin-ichiro HARA wrote:

> これで十分みたいですね。
> 
> あと、この関数の逆関数ってどうするんだろう?

精度を気にしなければ1次で補間するのが簡単でしょう。
精度が必要ならスプライン関数で補間するなどの手があります。

def interpol_y(x, y, y0)
  n = [x.size,y.size].min
  (n-1).times do |i|
    if (y0>=y[i] and y0<y[i+1]) or (y0>y[i+1] and y0<=y[i])
      return x[i] + (y0-y[i])/(y[i+1]-y[i])*(x[i+1]-x[i])
    end
  end
  raise "out of y-domain"
end

a = 0.0
c = [a]
(0.005..10.0).step(0.01) do |x|
  a += Math.exp(-x**2/2)
  c << a
end
a *= 2
y = c.collect{|x| 0.5+x/a}
x = (0...y.size).collect{|i| i*0.01}

p interpol_y(x, y, 0.9)


田中昌宏