ユーザ用ツール

サイト用ツール


numericalipa:ans5

【数値情報処理a】第5回の答え

課題

$f(x)=0$ の解をニュートン法で求めるRのプログラムを第2回のプログラムを元に作って提出しなさい。

ただし、ニュートン法で使う $f(x)$ の微分は $h=0.1$ とした Romberg 1段公式による数値微分を使うこと。

解答例

$f(x)=-x^{4}-x^{3}+10x^{2}+x-2$ の場合(他の場合は 5行目を変えること)

report5.R
  1. # Romberg1段公式を使ったニュートン法
  2.  
  3. # 関数の定義
  4. f <- function(x) {
  5. return(-x ^ 4 - x ^ 3 + 10 * x ^ 2 + x - 2)
  6. }
  7.  
  8. # 中心差分
  9. f2 <- function(x, h) {
  10. return((f(x + h) - f(x - h)) / (2 * h))
  11. }
  12.  
  13. # Romberg1段公式
  14. fr <- function(x, h) {
  15. return((4 * f2(x, h) - f2(x, 2 * h)) / 3)
  16. }
  17.  
  18. # 反復の回数
  19. iter <- 100
  20.  
  21. # δ
  22. delta <- 1e-10
  23.  
  24. # h
  25. h <- 1e-1
  26.  
  27. # 初期値
  28. x0 <- 0.5
  29.  
  30. f0 <- f(x0)
  31.  
  32. # 反復
  33. for (k in 1 : iter) {
  34. x0 <- x0 - f0 / fr(x0, h)
  35. print(sprintf("%d回目 %.20f", k, x0), quote = FALSE)
  36. f0 <- f(x0)
  37. # |f(x)|<δ を満たせば終了
  38. if (abs(f0) < delta) {
  39. }
  40. }

第2回のニュートン法で微分を fp という関数で定義していたが、そこを Romberg 1段公式に変えている(8〜16行目)。

numericalipa/ans5.txt · 最終更新: by yuki