1.2.2 Newton 法を用いた初等的な計算


\begin{jexample}
% latex2html id marker 240 [平方根]
$a>0$ に対して、$...
...おいては、
丸め誤差の観点から不利である。\qed
\end{jexample}


\begin{jexample}[平方根の逆数]
$1/\sqrt{a}$ を $f(x)=1/x^2-a=0$ の根...
...なしで、乗算 $3$ 回だけで
計算可能である。\qed
\end{jexample}


\begin{jexample}[立方根]
$\sqrt[3]{a}$ を $f(x)=x^3-a=0$ の根と考え...
...(x_{k})^3+2 a\;}{2(x_{k})^3+a}
\end{displaymath}となる。 \qed
\end{jexample}


\begin{jexample}[逆数]
$1/a$ を $f(x)=a-1/x=0$ の根と見なすと
\begi...
...math}
x_{k+1}=x_{k}(2-a x_{k})
\end{displaymath}となる。\qed
\end{jexample}


/*
 * newton.c -- Newton 法で方程式 f(x)=0 を解く
 *  コンパイル gcc -o newton newton.c -lm
 *  いずれも実行可能ファイルの名前は newton で、実行は ./newton
 */

#include <stdio.h>
#include <math.h>

int main ()
{
  int i, maxitr = 100;
  double f(double), dfdx(double), x, dx, eps;

  printf(" 初期値 x0, 許容精度ε=");
  scanf("%lf%lf", &x, &eps);

  for (i = 0; i < maxitr; i++) {
    dx = - f(x) / dfdx(x);
    x += dx;
    printf("f(%20.15f)=%9.2e\n", x, f(x));
    if (fabs(dx) <= eps)
      break;
  }
  return 0;
}

double f(double x)
{
  return cos(x) - x;
}

/* 関数 f の導関数 (df/dx のつもりで名前をつけた) */
double dfdx(double x)
{
  return - sin(x) - 1.0;
}



桂田 祐史