非線型方程式の解法


概要

方程式 f(x)=0 を解くには関数 y=f(x) の逆関数 x=f−1(y) において y=0 とし,
      x=f−1(0) 
を求めればいいことであるが,一般に逆関数は容易には求まらない。そこで数値的解法では以下のような試行錯誤を行う。
   y=f(x) の値が 2点 x=a,x=b において異符号ならばその間において少なくとも1個の解を持つはずだ(もちろんf(x)はこの区間で連続である)。x=a から x=b までの区間をn等分し
  h=(b−a)/n とする。
x=a+ih (i=0,1,2,・・・n) における関数値 f(x) を計算し f(x)〜0 となる x が得られればそれは解と言える。 f(x)〜0 とはεを任意に小さな正数とし| f(x)|<ε を満足するときである。しかし x を0.001の精度で求めるには h〜0.001すなわち n〜1000 としなければならず計算回数は膨大なものになり非能率である。そこで x=a から x=b までしらみつぶしではなく重点的に調べることにしよう。
  解の近傍のある点(x1,f(x1)) において接線を引き, x軸との交点を x2 とすると     
     x2=x1−f(x1)/f’(x1)
であることは容易にわかる。この式より x1 を与えると x2 が求まりその値を x1 として再度 x2 を計算する・・・・という繰り返しを行っていくと漸近的に解に近づいていくと考えられる。実際,数回の繰り返しで f(x2)〜0.00001 となる。よってこのときのx2が解である。これがNewton法といわれる古くから有名なアルゴリズムである。f’(x1)=0 の近傍ではこの式は使えないが,別の x1 でやり直せばよい.。x1を初期値,ε を収束判定定数と言う。

プログラム]  主要演算部のみ

VBでは
Do  
  If Abs(f(x1)) < eps Then
    Exit Do                     →  x1 を解として書き出し 
  Else
    x2 = x1 - f(x1) / g(x1)              g(x)=f’(x)
    fmx1 = Format(x1, "##0.00000")
    fmx2 = Format(f(x1), "##0.00000")
    List1.AddItem fmx1 & " " & fmx2     →  x1,x2を書き出し
    x1 = x2                     → 次のx1tとして代入 繰り返し
   End If
Loop

Cでは
 while (fabs(f(x1)) > eps ){
   x2 = x1 - f(x1)/g(x1);
   i = i++;
   printf ("%3d  %10.6f  %10.6f\n", i , x2 , f(x2));
   x1 = x2;
  }

サンプル] ビジュアルなVBプログラムはここからダウンロード,安価なHTMLファイルはこちらへ
    Cソースプログラム  繰り返し  階乗  関数値  曜日干支*  Newton法*

入門] 次のプログラムを作れ。

 @ y=xの値を−1≦x≦1の範囲で求める。
 A y= sin(x) (k=1)  の値を−1≦x≦1の範囲で求める。 
     = x   (k=2)                    地味なCプログラムのソースはここ
 B 閏年か平年かを判定する。
 C yy年mm月dd日の曜日を求める。  通日の公式は次ページ参照。   
 D 惑星の軌道要素(理科年表参照)を読み込んで,公転周期・近日点・遠日点距離を計算する。 配列 構造体
 E n! を求める関数を作り e の近似値を求める。

問題] 次の方程式を解け。

 @ x=5
 A x=e sin(x)+M        Kepler の方程式 (eとMは定数)
 B xexp(−x)+2=0
 C x=10
 D Planckの公式を微分してWienの法則を導け。