mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby - ニュートン補間!

[ プログラミング, 数学 ] [ Ruby ]

こんばんは。

前回は、C++ による「ニュートン補間」のアルゴリズムを紹介しました。

今日は、同じアルゴリズムを Ruby で実現してみました。 アルゴリズムについては、上記リンクの記事を参照してください。

実際、ほとんど同じです。

以下、Ruby によるサンプルスクリプトです。

記録

0. 前提条件

  • Linux Mint 14 Nadia (64bit) での作業を想定。
  • Ruby 2.0.0-p0 を使用。
  • ニュートン補間そのものについての詳細は割愛。

1. Ruby スクリプト作成

今回作成した Ruby ソースは以下の通りです。

interpolate_newton.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#*********************************************
# ニュートン補間
#*********************************************
#
# あらかじめ与える点
X = [0.0, 2.0, 3.0, 5.0, 8.0]
Y = [0.8, 3.2, 2.8, 4.5, 1.9]

class InterpolateNewton
  def initialize
    @n = X.size  # 点の数
  end

  # 計算・結果出力
  def calc
    puts "      x      y"
    X[0].step(X[@n - 1], 0.5) do |t|
        printf("%7.2f%7.2f\n", t, interpolate_newton(t))
    end
  end

  # ニュートン補間
  def interpolate_newton(t)
    c = Array.new  # 係数配列
    w = Array.new  # 作業用配列

    # 差分商
    0.upto(@n - 1) do |i|
      w[i] = Y[i]
      (i - 1).downto(0) {|j| w[j] = (w[j + 1] - w[j]) / (X[i] - X[j])}
      c[i] = w[0]
    end

    # 総和
    s = c[@n - 1]
    (@n - 2).downto(0) {|i| s = s * (t - X[i]) + c[i]}

    return s
  end
end

# メイン処理
begin
  # 計算クラスインスタンス化
  obj_calc = InterpolateNewton.new

  # ニュートン補間計算
  obj_calc.calc
rescue => e
  # エラーメッセージ
  puts "[例外発生] #{e}"
end

2. 実行

実際に実行して検証してみる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ ruby interpolate_newton.rb
      x      y
   0.00   0.80
   0.50   2.49
   1.00   3.23
   1.50   3.37
   2.00   3.20
   2.50   2.95
   3.00   2.80
   3.50   2.85
   4.00   3.17
   4.50   3.74
   5.00   4.50
   5.50   5.32
   6.00   6.03
   6.50   6.37
   7.00   6.05
   7.50   4.70
   8.00   1.90

C++ 版と同じ結果が得られました。

3. グラフ

参考までに、 R でグラフを作成してみた。

INTERPOLATE_GRAPH


以上。

Comments