スポンサーサイト 

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

Bisexual method 

嘘.そんなものはない.

数値計算で,非線型方程式を解く際に使われるbisection methodというのがある.
ニュートン法を使う場合には,初期値を見つけるのが非常に大変.
しかし,bisection methodの場合には,それほど大変にはならない.

f(x)=0
となる解を見つけるのに,
f(a)>0(またはf(a)<0)

f(b)<0(またはf(b)>0)
となるような適当なaこうすれば,かならず,aとbの間に,f(x)=0となる解が存在する.

xtemp=(a+b)/2と置き,d=(b-a)/2とおく.
まず,d=d/2とする.
・f(xtemp)>0(またはf(xtemp)<0)なら,xtemp=xtemp+dと定義しなおす.
・f(xtemp)<0(またはf(xtemp)>0)なら,xtemp=xtemp-dと定義しなおす.

このアルゴリズムで,解を求めることができる.

たとえばmatlabでプログラムをかけば,a,bを適当に決めたあと,

s=sign(f(a));
xtemp=(a+b)/2;
d=(b-a)/2;
while abs(f(xtemp))>tol;
  d=d/2;
  if s==sign(f(xtemp));
    xtemp=xtemp+d;
  elseif
    xtemp=xtemp-d;
  end
end

でみつけることができる.
ただし,aとbがうまく設定できないと,解がでてこない.
そこで,だいたい解がありそうな領域を広めに決め,細かいグリッドにする.各グリッドの両端をaとbの差として,逐次解がでるかを探っていく.この場合だと,仮に解が複数あってもうまく見つけることができる.

たとえばmatlabでかけば,
適当な定義域の最大値をmax,最小値をminとして,
while b<max;
  a=b;
  b=a+0.01;
  s=sign(f(a));
  xtemp=(a+b)/2;
  d=(b-a)/2;
  while abs(f(xtemp))>tol;
    d=d/2;
    if s==sign(f(xtemp));
      xtemp=xtemp+d;
    elseif
      xtemp=xtemp-d;
    end
    if d      break;
    end
  end
end

で,うまくいくと思う.
実際にまわしたプログラムでないので,うまく動くかは不明.
ただし,解は一元のみ.
スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。