|
|
◆ rpzero2()
| function rpzero2 |
( |
n::Integer |
, |
|
|
a::Array{Float64} |
, |
|
|
rr::Array{Float64} |
, |
|
|
ri::Array{Float64} |
, |
|
|
s::Array{Float64} |
, |
|
|
iflag::Integer |
= 0, |
|
|
maxiter::Integer(keyword argument) |
= 100 |
|
) |
| |
高次代数方程式 (実数係数, 複素解) (ニュートン法) (複素数型不使用)
- 目的
- rpzero2は実数係数の多項式p(z)のすべてのゼロ点をニュートン法により求める.
p(z) = a0*z^n + a1*z^(n-1) + ... + an
得られた解は, 実数部と虚数部が別々の実数型変数に出力される.
- 戻り値
- (iter, info)
iter (Int32):
収束に要した反復回数.
info (Int32):
= 0: 正常終了
= -1: 入力パラメータ n の誤り (n < 1)
= -2: 入力パラメータ a の誤り (a[0] = 0 など)
= -3: 入力パラメータ rr の誤り
= -4: 入力パラメータ ri の誤り
= -5: 入力パラメータ s の誤り
= -7: 入力パラメータ maxiter の誤り (maxiter <= 0)
= 1: maxiter回の反復で収束しなかった. ゼロ点の最終推定値がrrおよびriに入る. 誤差限界sは計算されない.
- 引数
-
| [in] | n | 方程式の次数. (n >= 1) |
| [in] | a | 1次元配列 (Float64, n + 1)
p(z)の実数係数ベクトル (a0 〜 an). |
| [in,out] | rr | 1次元配列 (Float64, n)
[in] 方程式の解の初期推定値の実数部. 不明であれば, iflag = 0 として推定値を設定しなくてもよい.
注 - 初期推定値はすべて異なった値であること.
[out] 求められた解の実数部. |
| [in,out] | ri | 1次元配列 (Float64, n)
[in] 方程式の解の初期推定値の虚数部. 不明であれば, iflag = 0 として推定値を設定しなくてもよい.
注 - 初期推定値はすべて異なった値であること.
[out] 求められた解の虚数部. |
| [out] | s[] | 1次元配列 (Float64, n)
求められた解の誤差限界. |
| [in] | iflag | (省略可)
方程式の解の初期推定値の入力フラグ. (省略時 = 0)
= 0: 初期推定値は与えられていない.
!= 0: rrおよびriに初期推定値が与えられている. |
| [in] | maxiter | (省略可(キーワード引数))
最大反復回数. (maxitr >= 1) (省略時 = 100) |
- 出典
- SLATEC
- 使用例
- 次の代数方程式を解く.
x^5 + 2*x^3 + 2*x^2 - 15*x + 10 = 0
解は 1(重根), -2, ±√5i である. function TestRpzero2()
n = 5
a = [ 1.0, 0.0, 2.0, 2.0, -15.0, 10.0 ]
rr = Vector{Cdouble}(undef, n)
ri = Vector{Cdouble}(undef, n)
s = Vector{Cdouble}(undef, n)
iter, info = rpzero2(n, a, rr, ri, s)
for i = 1:n
println(rr[i], " ", ri[i], " ", s[i])
end
println("iter = ", iter, ", info = ", info)
end
function rpzero2(n::Integer, a::Array{Float64}, rr::Array{Float64}, ri::Array{Float64}, s::Array{Float64}, iflag::Integer=0, maxiter::Integer(keyword argument)=100) 高次代数方程式 (実数係数, 複素解) (ニュートン法) (複素数型不使用)
- 実行結果
> TestRpzero2()
1.0000000135981033 2.146253582923928e-8 1.265979321229113e-7
1.4829843740329862e-18 2.23606797749979 8.99528943854828e-15
-2.0 1.1504163109909317e-19 7.53855142372064e-15
7.942413118753155e-17 -2.23606797749979 9.067230800947384e-15
0.9999999870464613 -2.247841617388521e-8 1.2657854084498727e-7
iter = 30, info = 0
注 - 二重根は半分の精度でしか求められない.
|