ラグランジュ補間の計算

ラグランジュ補間のコード書いてみた。
3つの点(x,y)=(1,10),(2,15),(10,55)のときに、x=4での値を求める。

example.rb

require "Lagrange.rb"

lag = Lagrange.new([[1,10],[2,15],[10,55]])
y = lag.calc(4)
puts y
$ ruby example.rb
25.0

元の3つの点は関数y=5x+5の値だったりするので、f(4)=5*4+5=25で結果と一致。
sin関数で試したところ若干の誤差*1は出たけど、かなり近い値になった。

Lagrange.rb

class Lagrange
	def initialize(array=[])
		@array = array
	end
	def calc(x)
		y = 0.0
		@array.each_with_index do |i,count|
			a = 1.0
			b = 1.0
			@array.each_with_index do |j,count_|
				if count != count_ then
					a *= (x - j[0])
					b *= (i[0] - j[0])
				end
			end
			y += (i[1] * (a / b))
		end
		return y
	end
end

Lagrange#calc(x)

xに対するyの値を返す。

*1:0.03くらい