ステフェンセン法

数値解析においてステフェンセン法ヨハン・フレデリック・ステフェンセンにちなんで名付けられた、数値根を求める反復法であり、セカント法ニュートン法に似ていますステフェンセン法は導関数を使用せずに二次収束を達成しますが、より一般的なニュートン法も二次収束しますが導関数を必要とします。セカント法は導関数を必要としませんが、収束速度は二次収束よりも遅くなります。

ステフェンセン法は、ステップごとに2回の関数評価を必要とするという欠点がある。一方、セカント法はステップごとに1回の評価で済む。そのため、計算コストの点では必ずしも最も効率的とは言えない。これは、それぞれの反復回数に依存する。ニュートン法もまた、ステップごとに関数とその導関数の2つの関数を評価する必要があり、その計算コストは​​せいぜいセカント法と同程度だが、最悪の場合、ステフェンセン法と同程度になる。ほとんどの関数において、導関数の計算コストは​​元の関数の計算コストと同程度であるため、通常はニュートン法とステフェンセン法の計算コストは​​同程度である。[a]

ステフェンセン法は、エイトケンのデルタ二乗過程を固定小数点反復に適用したものとして導出できる。このように考えると、ステフェンセン法は、固定小数点が存在することが保証され、固定小数点反復がバナッハの固定小数点定理によって(遅くなる可能性はあるものの)収束することが保証される限り、一般バナッハ空間における効率的な固定小数点計算に自然に一般化される

簡単な説明

ステフェンセン法の最も単純な公式は、実関数零点を求める際に用いられます。つまり、次式を満たす実数値を求めることです。解の近傍では、関数の導関数は[b]を正確に、あるいは非常に近い値で満たす必要があります。一部の関数では、この条件が満たされなくてもステフェンセン法は機能しますが、そのような場合、開始値は実際の解に非常に近い値でなければならないため、解への収束が遅くなる可能性があります。後述するように、この方法の中間ステップのサイズを調整することで、これらのケースの一部で収束を改善できます。

適切な初期値が与えられれば、以下の式を用いて値の列を生成できる。この式が成立する場合、列の各値は前の値よりも解に非常に近くなる。現在のステップの値は、式[1]を用いて次のステップの値を生成する。

ここで、傾き関数は、式で与えられる元の関数の合成である。

あるいはもっと明確に言えば、

ここで、最後の反復点と補助点との間のステップサイズは、

技術的には、この関数は2点間1次差と呼ばれます[c]実際には、最後のシーケンスポイントと補助点の間の関数の傾きの平均値であり、中間ステップのサイズ(およびその方向)は次のように与えられます。

の値は の近似値であるため、その値がステフェンセンのアルゴリズムの収束を保証するために必要な条件を満たすかどうかをオプションで確認することができます。わずかな不適合は必ずしも重大な結果をもたらすとは限りませんが、条件から大きく逸脱した場合は、ステフェンセンの方法が失敗する可能性が高いことを警告しており、一時的に何らかのフォールバックアルゴリズム(例えば、より堅牢なイリノイアルゴリズムや、単純なregula falsi)を使用することが正当化されます。

この補助点を求める目的のためだけに、関数の値は[b]の要件を満たす必要がある。計算の他の部分では、ステフェンセン法では関数が連続であり、実際に近傍解を持つことのみが求められる。[1]傾きの式で使用されるステップには、 1 /2または 3 /4要件を完全に満たしていない機能に対応するためです。

利点と欠点

ステフェンセン法の主な利点は、ニュートン法と同様に二次収束性[1]を示すことです。つまり、どちらの方法も方程式の根を同じように「速く」求めます。この場合、「速く」とは、どちらの方法においても、解の正しい桁数がステップごとに倍増することを意味します。しかし、ニュートン法の式は関数だけでなくその導関数の評価も必要としますが、ステフェンセン法では関数自身の評価のみで済みます。これは、導関数が容易に、あるいは効率的に得られない場合に重要です。

高速収束の代償として、関数評価が2回必要になります。つまり、との両方を計算する必要があり、が複雑な場合は時間がかかる可能性があります。比較すると、regula falsi法とセカント法はどちらも1ステップあたり1回の関数評価で済みます。セカント法は1ステップあたり正解桁数を「わずか」約1.6倍しか増やしませんが、一定時間内にセカント法の2倍のステップ数を実行できます。セカント法はSteffensen法と同じ時間で2倍のステップ数を実行できるため、[d]実用上、両方のアルゴリズムが成功した場合、セカント法の方がSteffensen法よりも速く収束します。セカント法は2ステップ(2回の関数評価)ごとに約(1.6) 2 ≈ 2.6の桁数を達成しますが、Steffensen法は1ステップ(2回の関数評価)ごとに2倍の桁数を達成します。

他のほとんどの反復根探索アルゴリズムと同様に、ステフェンセン法の決定的な弱点は「十分に近い」開始値を選択することです。の値が実際の解に「十分近く」ない場合、この方法は失敗する可能性があり、値のシーケンスは2 つ (またはそれ以上) の極端な値の間で不規則に反転したり、無限大に発散したり、またはその両方が発生する可能性があります。

エイトケンのデルタ二乗過程を用いた導出

以下に示すMATLABコードに実装されているSteffensen法のバージョンは、収束加速のためのAitkenのデルタ2乗法を用いて見つけることができます。以下の式を上のセクションの式と比較すると、 であることに留意してください。この方法は、線形収束するシーケンスから開始することを前提とし、そのシーケンスの収束速度を高めます。 の符号が一致し、シーケンスの望ましい限界に「十分に近い」場合、次のように仮定できます。

となることによって

シーケンスの望ましい限界を解くと次のようになります。

その結果、より急速に収束するシーケンスが得られます。

コード例

Matlabで

以下は、 MATLABでの Steffensen メソッドの実装のソースです

function Steffensen ( f, p0, tol ) % この関数は、固定小数点反復関数 f、固定小数点への初期推定値 p0、および許容値 tol を入力として受け取ります。% 固定小数点反復関数は、インライン関数として入力されると想定されています。 % この関数は、式 f(x) = p が目的の許容値 tol内で真となる固定小数点 p を計算して返します。 format compact % 出力を短くします。format long % 小数点以下の桁数を多く出力します。    for i = 1 : 1000 % 大規模だが有限な回数の反復処理を実行する準備をします。% これは、メソッドが収束に失敗した場合、無限ループに陥らないようにするためです。p1 = f ( p0 ) + p0 ; % 固定点の次の 2 つの推定値を計算します。p2 = f ( p1 ) + p1 ; p = p0 - ( p1 - p0 ) ^ 2 / ( p2 - 2 * p1 + p0 ) % Aitken のデルタ 2 乗法を使用して、% p0 のより適切な近似値を見つけます。if abs ( p - p0 ) < tol % 許容範囲内かどうかをテストします。break % 範囲内であれば、反復処理を停止します。答えが得られます。end p0 = p ; % 次の反復処理のために p0 を更新します。end                                    if abs ( p - p0 ) > tol % 許容値を満たさない場合は、失敗のメッセージを出力します。 % 「1000回の反復で収束できませんでした。」終了        

Pythonの場合

以下はPythonでの Steffensen メソッドの実装のソースです

import Callable , Iterator Func = Callable [[ float ], float , float ]入力して        def g ( f : Func , x : float , fx : float ) -> Func : """1 階差分商関数。          引数:  f: gへの関数入力 x: gを評価する点 fx: xで評価される関数f  """  return  f ( x  +  fx )  /  fx  -  1def steff ( f : Func , x : float , tol : float ) -> Iterator [ float ]: """根を見つけるためのステッフェンセンアルゴリズム。          この再帰ジェネレータは最初に x_{n+1} 値を生成し、次にジェネレータが反復処理されるときに、 次の再帰レベルから x_{n+2} を生成します。 引数:  f: ルートを検索する関数 x: 最初の呼び出し時の開始値、関数が再帰する各レベル n x は x_n  """  n  =  0 while  True :  if  n  >  1000 :  print ( "1000回の反復で収束しませんでした" )  break  else :  n  =  n  +  1 fx  =  f ( x ) if  abs ( fx )  <  tol :  break  else :  gx  =  g ( f ,  x ,  fx )  x  =  x  -  fx  /  gx  # x_{n+1} に更新 yield  x  # 値を返す

バナッハ空間への一般化

ステフェンセン法は、入力と同じ出力を生成する異なる種類の関数の入力を求めるのにも使用できます。例えば、特殊な値のような解は固定点と呼ばれます。これらの関数の多くは、結果を繰り返し入力として再利用することで、自身の解を求めることができますが、収束速度が遅くなったり、関数によっては収束に全く至らない場合があります。ステフェンセン法は、この収束を加速し、2次収束へと導きます。

例として、より一般的なバナッハ空間と基本実数の問題を一時的に無視します。読者を前のセクションに再び向けると、任意のルート関数を使用した、固定小数点関数の単純なおもちゃのモデルは、次のように作成できます。ここでは、反復処理で安定するのに十分小さい値でありながら、関数の非線形性が顕著になる のに十分な大きさの適切な符号を持つ定数です。

実数値関数の不動点を求めるこの方法は、バナッハ空間をそれ自身に写す関数、あるいはより一般的には、あるバナッハ空間から別のバナッハ空間に写す関数に対して一般化されている。この一般化された方法は、およびに関連付けられた有界線形作用素族が、(局所的に)条件[2]を満たすように考案できることを前提としている。

演算子は、すべての要素がベクトル引数と の関数である行列とほぼ等価です。最初のセクションで示した単純な関数をもう一度参照してください。この関数は実数を単に入力して出力するだけです。ここでは、関数は商差です。ここでの一般化された形式では、演算子はバナッハ空間で使用される商差の類似物です

バナッハ空間で除算が可能な場合、線形演算子は次のように得られる。

これは、いくつかの洞察を与えるかもしれません。このように表現すると、線形演算子は、上記の最初のセクションで議論した商差の複雑なバージョンであることがより容易にわかります。商形式は、ここでは説明のためにのみ示されており、それ自体は必須ではありません。また、バナッハ空間内での除算は、この詳細なステフェンセン法の実行に必ずしも必要ではないことにも注意してください。唯一の要件は、演算子が( 1 )を満たすことです。

ステフェンセン法は、微分の代わりに差分商を使用する点を除けば、ニュートン法と非常によく似ています。固定点関数とそれらの線形演算子が条件( 1 )を満たすいくつかの固定点に近い引数については、恒等演算子であることに注意してください

バナッハ空間で分割が可能な場合、一般化された反復公式は次のように与えられる。

より一般的な場合割り算が不可能な場合、反復公式は

同様に、ある程度簡約された形の解を求めることもできる。

角括弧内の値はすべて に依存しない。括弧内の項はすべて のみに依存する。しかし、2番目の形式は最初の形式ほど数値的に安定していない可能性がある。最初の形式は(願わくば)小さな差の値を求めるため、反復値の過度に大きな変化や不規則な変化を回避する可能性が数値的に高い可能性がある。

線形演算子

ある正の実定数に対して、初期近似値が次の式を満たす所望の解に「十分近い」場合、この方法は2乗的に固定点に収束する。

注記

  1. ^ 稀な特殊なケースの関数については、主関数の評価から節約された部分を用いることで、ニュートン法の微分計算は無視できるコストで実行できます。このように最適化すると、ニュートン法はセカント法よりもステップあたりのコストがわずかに高くなるだけで、収束速度がわずかに速くなるという利点があります。
  2. ^ ab 条件は、 を自身の解を求めるための補正関数として使用し場合、 が解の方向()に移動し、新しい値は解と以前の値()の間に位置する傾向があることを保証する。ただし、 は原理上は自己補正関数に過ぎない点に注意する必要がある。実際にはそのような目的で使用されることはなく、たとえ使用されるとしても効率的である必要はない。
  3. ^ 商差は、符号に応じて、前方商差または後方差のいずれかになります
  4. ^ 2つの評価の事前計算を順番に実行する必要があるため、関数評価を並列に実行してもアルゴリズム自体を高速化することはできません。これはステフェンセン法のもう一つの欠点です。

参考文献

  1. ^ abc Dahlquist, Germund ; Björck, Åke (1974). Numerical Methods . 翻訳: Anderson, Ned. Englewood Cliffs, NJ: Prentice Hall. pp. 230–231.
  2. ^ Johnson, LW; Scholz, DR (1968年6月). 「Steffensen法について」. SIAM Journal on Numerical Analysis . 5 (2): 296– 302. doi :10.1137/0705026. JSTOR  2949443.
Retrieved from "https://en.wikipedia.org/w/index.php?title=Steffensen%27s_method&oldid=1325186360"