InterpolateRoot[lhs==rhs,{x,x0,x1}]
x の最初の2つの値として x0と x1を使い,方程式 lhs==rhs の数値解を求める.
詳細とオプション
例題
例
スコープ
アプリケーション
考えられる問題
関連項目
テクニカルノート
関連するガイド
FunctionApproximations`
FunctionApproximations`
InterpolateRoot
InterpolateRoot[lhs==rhs,{x,x0,x1}]
x の最初の2つの値として x0と x1を使い,方程式 lhs==rhs の数値解を求める.
詳細とオプション
- InterpolateRootを使うためには,まず関数近似パッケージをロードしなくてはならない.それにはNeeds["FunctionApproximations`"]を実行する必要がある.
- InterpolateRootは形式 x->sol の規則として解を与える.
- InterpolateRoot[expr,{x,x0,x1}]は方程式 expr==0の根を探索する.
- InterpolateRootは最後の4つのデータ点の逆3次補間を使い,解を探索する.これは導関数情報を使わない.
- 解が重根のとき,InterpolateRootは非常に遅い.
- InterpolateRootはFindRootほどロバストではない.しかし,根の位置がおおよそ分かっており,関数の各評価が高価で,高精度が望まれる場合には便利である.
- 方程式と初期値が実数ならば,InterpolateRootは実根のみを探す.そうでない場合は複素根を探す.
- 次のオプションを与えることができる:
-
AccuracyGoal Automatic 目標確度 MaxIterations 15 使用する反復の最大回数 ShowProgress False 進行状況を監視するかどうか WorkingPrecision 40 内部計算で使用する精度 - AccuracyGoalの設定とは,根での残余の大きさではなく根の確度を言う.
- 内部計算で使用される精度の範囲は通常,初めは機械精度より少し高めで,最後はWorkingPrecisionの設定となる.
- WorkingPrecisionの設定は所望のAccuracyGoalに達するために超過してもよい.
- InterpolateRootがMaxIterationsステップ内に所望の確度での解を見付けられなかった場合,最後に見付かった近似を返す.
- ShowProgress->Trueでは,InterpolateRootは{accuracy,x}に続き{precision,extraprecision,delta}を出力する.以下を参照:
-
accuracy 現在の解の近似の推定確度 x 現在の解の近似 precision 現在の作業精度 extraprecision 使用されている精度の追加桁数 delta 次の反復での近似の予想される変更
例題
すべて開く すべて閉じる例 (1)
スコープ (2)
Needs["FunctionApproximations`"]InterpolateRootは複素根を求めることができる:
InterpolateRoot[Exp[x] + 2 == 0, {x, 1 + 3I, 2 + 4I}]Exp[x] + 2 == 0 /. %Needs["FunctionApproximations`"]InterpolateRoot[Sin[x], {x, 3, 4}]アプリケーション (1)
Needs["FunctionApproximations`"]リーマン(Riemann)予想によると,関数Zeta[z]の零点はすべて複素平面の
線上にある.次は最初のいくつかの零点である.
InterpolateRoot[Zeta[z], {z, .5 + # I, .5 + (# + 1)I}]& /@ {14, 21, 25}Zeta関数を評価する関数を定義し,カウンタを増加させる:
g[z_ ? NumericQ] := (n++;Zeta[z])n = 0;InterpolateRoot[g[z], {z, .5 + 14I, .5 + 15I}, WorkingPrecision -> 400]//Timingn割線法でFindRootを使う:
Block[{s = 0, n = 0},
soln = FindRoot[Zeta[z], {z, .5 + 14I, .5 + 15I},
WorkingPrecision -> 400,
StepMonitor :> s++,
EvaluationMonitor :> n++];
Print[s, "ステップで", n, "回の関数評価"];
soln]//Timingニュートン法でFindRootを使う:
Block[{s = 0, n = 0},
soln = FindRoot[Zeta[z], {z, (1/2) + 14.I},
WorkingPrecision -> 400,
StepMonitor :> s++,
EvaluationMonitor :> n++];
Print[s, "ステップで", n, "回の関数評価"];
soln]//Timing