DKA 法
概要
高次の代数方程式の重解を含む全ての解を求めるための方法として,DKA 法を紹介する.
これは,Newton 法を代数方程式の解法に発展させた Durand-Kerner の公式を用い,Newton 法適用のための解の初期値を与えるため Aberth の初期値を用いる方法である. 重解の場合の収束性は良くない (4倍精度計算にしないと使い物にならない) が,複素数解を含む全ての解を一発で求めることができ,便利である.
DK 法の理論
以下の方程式を考える.
上式のn個の真の解を $\alpha_j (j=1\sim n)$ とすれば,
これを微分すれば,
ここで,例えば, $z=\alpha_1$ だとすれば,上式右辺第1項を除いて $\alpha_1-\alpha_1=0$ となる項を含むため,
また, $z=\alpha_2$ だとすれば,上式右辺第2項を除いて $\alpha_2-\alpha_2=0$ となる項を含むため,
となり,結局,1項のみしか残らず,微分した値は,
となる.
ここで, $\alpha_i$ の近似値を $z_i$ とし, $f'(z_i)$ を以下のとおり近似する.
以上より,Newton 法の考え方を適用し,以下に示す Durand-Kerner の公式を導くことができる.
ここに $z_i$ は,方程式 $f(z)=0$ の $i$ 番目の解の近似値である.
Aberth の初期値
また,Newton 法を適用するために必要となる初期値は,以下に示す,Aberth の初期値を用いることができる.
上式は,代数方程式の解と係数の関係
より,複素平面において,解の重心 $(-a_1/(n a_0), 0)$ を中心とした半径 $R$ の円の中に解が存在するよう $R$ を設定し,その円弧上に均等に初期値を配置しようとするものである.
方程式の書き換え
ここで解きたい方程式を以下のように書き換える.
上式より Durand-Kerner の公式,Aberth の初期値は以下のとおり現される.
Aberth の初期値での $R$ は,以下の方程式の正の実数解を用いることができる.( $n-1$ 項が無い事に注意)
$c_n\neq 0$ とすれば,上式は $x=0$ で負の値をとるため, $x$ が正の領域で実数解が存在し,これは Newton 法により求めることができる.
参考
Newton 法
上記過程は,Aberth の初期値の $R$ の設定を除いて,全て複素数計算で行う必要があるが,ここでは単純な事例として, 代数方程式の1つの実数解を得るための標準的な Newton 法の手順を示しておく.
代数方程式の1つの実数解を得るための Newton 法の標準手順
xx | 変数x | x0 | 変数の初期値 | |
a(i) | 代数方程式係数a_i | ii | 収束計算用カウンタ | |
ff | 関数値f(x) | iimax | 収束計算最大繰返数 | |
df | 関数微分値f'(x) | eps | 収束判定用の絶対値が小さな数値 |
! main routine xx=x0 do ii=1,iimax ff=a(0) do i=1,n ff=xx*ff+a(i) end do df=n*a(0) do i=1,n-1 df=xx*df+(n-i)*a(i) end do xx=xx-ff/df if(abs(ff/df) < eps)exit end do
複素数の演算
プログラムにおいて複素数タイプを用いずに複素数の演算を行うには,複素数を実数部と虚数部に分けて演算することが必要になる. そのための基本的な演算公式を示す.
複素数 $f$, $z$, $p$ を実数部と虚数部に分けて以下のように定義する.,
複素数の乗算および除算は以下のとおり表現できる.
Programs
Programs
Filename | Description |
---|---|
f90_DKA.txt | program for solution of algebric equations by DKA method |
inp_test10.txt | input data sample (1) equation of the 10th degree |
inp_test30.txt | input data sample (2) equation of the 30th degree |
inp_test70.txt | input data sample (3) equation of the 7th degree |
out_test10.txt | output data sample (1) equation of the 10th degree |
out_test30.txt | output data sample (2) equation of the 30th degree |
out_test70.txt | output data sample (3) equation of the 7th degree |
解の収束状況作図事例 (1)
10次方程式 $f(x)=(x+1)^{10}=0$ の解 | |
---|---|
全体(4倍精度) | 拡大(4倍精度) |
全体(倍精度) | 拡大(倍精度) |
解の収束状況作図事例 (2)
30次方程式 $f(x)=(x-30)(x-29)\dots (x-1)=0$ の解 | |
---|---|
全体(4倍精度) | 拡大(4倍精度) |
7次方程式 $f(x)=7x^6+6x^5+\dots +2x+1=0$ の解(4倍精度) |
---|