スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Ruby][アルゴリズム入門]テイラー展開

第二章「数値計算」 目次

総合目次

2-1 乱数
2-2 数値積分
2-3 テイラー展開
2-4 非線形方程式の解法
2-5 補間
2-6 多桁計算
2-7 長いπ
2-8 連立方程式の解法
2-9 線形計画法
2-10 最小2乗法

e^x

e^xをテイラー展開を用いて計算する。

# encoding: cp932
def myexp(x)
  eps = 1e-08;
  s = 1.0
  e = 1.0
  d = 1.0
  1.upto(200) do |i|
    d = s
    e = e * x / i
    s += e
    return s if (s - d).abs < eps * d.abs
  end
  return 0.0
end

puts "    x       myexp(x)        exp(x)"
0.step(40, 10) do |x|
  printf "%5.1f%14.6g%14.6g\n"%[x, myexp(x), Math.exp(x)]
end


負の値版e^x

e^xのxが負の場合にも対応できるようにする。

# encoding: cp932
def myexp(x)
  eps = 1e-08;
  s = 1.0
  e = 1.0
  d = 1.0
  a = x.abs # xの絶対値を取り、計算にはこれを使う
  1.upto(200) do |i|
    d = s
    e = e * a / i
    s += e
    if (s - d).abs < eps * d.abs
      # 元のxの値が0以上ならそのまま、0以下なら1/sを返す。
      if x > 0
        return s
      else
        return 1.0 / s
      end
    end
  end
  return 0.0
end

puts "    x       myexp(x)        exp(x)"
-40.step(40, 10) do |x|
  printf "%5.1f%14.6g%14.6g\n"%[x, myexp(x), Math.exp(x)]
end


cos x

cos xをテイラー展開により求める

# encoding: cp932
def mycos(x)
  eps = 1e-08
  s = e = d = 1.0
  # xの値を0~2πに収める
  x = x % (2 * 3.14159265358979)
  k = 1
  1.step(200, 2) do |k|
    d = s
    e = -e * x * x / (k * (k + 1))
    s += e
    return s if (s - d).abs < eps * d.abs
  end
  return 9999.0
end

rd = 3.14159 / 180
puts "    x       mycos(x)        cos(x)"
x = 0
0.step(180, 10) do |x|
  printf "%5.1f%14.6g%14.6g\n"%[x, mycos(x * rd), Math.cos(x * rd)]
  x += 10
end

テーマ : プログラミング - ジャンル : コンピュータ

コメント
コメントの投稿
管理者にだけ表示を許可する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。