有限差分の近似ヤコビアンは、ニュートン法の不安定性を引き起こすことができますか?


13

私はpython 3に後方オイラーソルバーを実装しました(numpyを使用)。私自身の便宜と演習として、勾配の有限差分近似を計算する小さな関数を作成しました。これにより、ヤコビアンを常に分析的に決定する必要はありません(可能な場合でも!)。

Ascher and Petzold 1998で提供された説明を使用して、特定のポイントxで勾配を決定するこの関数を作成しました。

def jacobian(f,x,d=4):
    '''computes the gradient (Jacobian) at a point for a multivariate function.

    f: function for which the gradient is to be computed
    x: position vector of the point for which the gradient is to be computed
    d: parameter to determine perturbation value eps, where eps = 10^(-d).
        See Ascher und Petzold 1998 p.54'''

    x = x.astype(np.float64,copy=False)
    n = np.size(x)
    t = 1 # Placeholder for the time step
    jac = np.zeros([n,n])
    eps = 10**(-d)
    for j in np.arange(0,n):
        yhat = x.copy()
        ytilde = x.copy()
        yhat[j] = yhat[j]+eps
        ytilde[j] = ytilde[j]-eps
        jac[:,j] = 1/(2*eps)*(f(t,yhat)-f(t,ytilde))
    return jac

振り子の多変量関数を取得し、シンボリックヤコビアンを数値的に決定されたポイント範囲の勾配と比較することにより、この関数をテストしました。テストの結果に満足しました。エラーは1e-10前後でした。近似ヤコビアンを使用して振り子のODEを解くと、非常にうまく機能しました。この2つの違いを検出できませんでした。

次に、次のPDE(1Dのフィッシャーの方程式)でテストしてみました。

tあなたは=バツkバツあなたは+λあなたはCあなたは

有限差分離散化を使用します。

Newtonのメソッドは最初のタイムステップで爆発します。

/home/sfbosch/Fisher-Equation.py:40: RuntimeWarning: overflow encountered in multiply
  du = (k/(h**2))*np.dot(K,u) + lmbda*(u*(C-u))
./newton.py:31: RuntimeWarning: invalid value encountered in subtract
  jac[:,j] = 1/(2*eps)*(f(t,yhut)-f(t,yschlange))
Traceback (most recent call last):
  File "/home/sfbosch/Fisher-Equation.py", line 104, in <module>
    fisher1d(ts,dt,h,L,k,C,lmbda)
  File "/home/sfbosch/Fisher-Equation.py", line 64, in fisher1d
    t,xl = euler.implizit(fisherode,ts,u0,dt)
  File "./euler.py", line 47, in implizit
    yi = nt.newton(g,y,maxiter,tol,Jg)
  File "./newton.py", line 54, in newton
    dx = la.solve(A,b)
  File "/usr/lib64/python3.3/site-packages/scipy/linalg/basic.py", line 73, in solve
    a1, b1 = map(np.asarray_chkfinite,(a,b))
  File "/usr/lib64/python3.3/site-packages/numpy/lib/function_base.py", line 613, in asarray_chkfinite
    "array must not contain infs or NaNs")
ValueError: array must not contain infs or NaNs

これはさまざまなeps値で発生しますが、奇妙なことに、PDE空間ステップサイズとタイムステップサイズがクーラント-フリードリッヒ-レビー条件が満たされないように設定されている場合にのみ発生します。それ以外の場合は動作します。(これは、フォワードオイラーで解く場合に予想される動作です!)

完全を期すために、ここにニュートン法の関数を示します。

def newton(f,x0,maxiter=160,tol=1e-4,jac=jacobian):
    '''Newton's Method.

    f: function to be evaluated
    x0: initial value for the iteration
    maxiter: maximum number of iterations (default 160)
    tol: error tolerance (default 1e-4)
    jac: the gradient function (Jacobian) where jac(fun,x)'''

    x = x0
    err = tol + 1
    k = 0
    t = 1 # Placeholder for the time step
    while err > tol and k < maxiter:
        A = jac(f,x)
        b = -f(t,x)
        dx = la.solve(A,b)
        x = x + dx
        k = k + 1
        err = np.linalg.norm(dx)
    if k >= maxiter:
        print("Maxiter reached. Result may be inaccurate.")
        print("k = %d" % k)
    return x

(関数la.solveはscipy.linalg.solveです。)

ヤコビアンの関数を使用してテストし、安定した結果が得られたため、後方オイラーの実装が適切であると確信しています。

デバッガーでは、エラーが発生する前にnewton()が35回の反復を管理していることがわかります。この数値は、試したすべてのepsで同じままです。

追加の観察:FDAと初期条件を入力として使用して関数で勾配を計算し、イプシロンのサイズを変えながら2つを比較すると、イプシロンが縮小するにつれてエラーが大きくなります。イプシロンが縮小すると、最初は大きくなり、その後小さくなり、再び大きくなると予想されます。したがって、ヤコビアンの実装におけるエラーは合理的な仮定ですが、もしそうなら、それは非常に微妙なため、私はそれを見ることができません。編集:jacobian()を修正して、中心の違いの代わりにforwardを使用し、予想されるエラーの発生を観察しました。ただし、newton()はまだ収束に失敗します。ニュートンの反復でdxを観察すると、成長するだけで、変動さえありません。各ステップで倍になり(係数1.9)、係数は次第に大きくなります。

AscherとPetzoldは、ヤコビアンの差分近似は必ずしもうまく機能しないと述べています。有限差分を持つ近似ヤコビアンは、ニュートン法の不安定性を引き起こすことができますか?または、原因はどこか別の場所ですか?この問題に他にどのようにアプローチできますか?


1
「ヤコビアンの関数を使用してテストし、安定した結果を得ることができたため、後方オイラーの実装が適切であると確信しています。」 どうか明らかにしてください。同じ問題を正確なヤコビアンで実行し、解がPDEの正確な解に収束すると言っていますか?それは重要な情報です。
デビッドケッチャソン

@DavidKetchesonはい、それは私が言っていることです。私の用語が間違っているか不完全な場合はおApび申し上げます。(「安定した期待される結果が得られる」と言っていたはずです)
スティーブンボッシュ

回答:


3

何よりも長いコメント:

Ascher and Petzold 1998で提供された説明を使用して、特定のポイントxで勾配を決定するこの関数を作成しました。

SUNDIALSの差分商近似のコードを見て、実装で何をすべきかをよりよく理解してください。AscherとPetzoldは始めるのに良い本ですが、SUNDIALSは実際に生産作業で使用されているため、よりよくテストされています。(また、SUNDIALSはPetzoldが取り組んだDASPKに関連しています。)

AscherとPetzoldは、ヤコビアンの差分近似は必ずしもうまく機能しないと述べています。有限差分を持つ近似ヤコビアンは、ニュートン法の不安定性を引き起こすことができますか?

経験的に、近似ヤコビアンは、ニュートン法で収束に失敗する可能性があります。私はそれらを「不安定性」とみなすかどうかわかりません。場合によっては、終了基準で目的のエラートレランスを達成できないことがあります。他の場合には、不安定性として現れる可能性があります。Highamの数値手法の本や、Wメソッドに関するHairerとWannerの議論で、この現象に関するより定量的な結果があることはほぼ確実です。

または、原因はどこか別の場所ですか?この問題に他にどのようにアプローチできますか?

エラーがどこにあると思うかによります。後方オイラーの実装に非常に自信があるなら、私はそこから始めません。経験により、数値的手法の実装に夢中になったので、もし私なら、いくつかの本当に基本的なテスト問題(いくつかの非剛性および硬い線形問題、中心にある有限差分近似による熱方程式、そのようなもの)、製造されたソリューションの方法を使用して、ソリューションが何であり、何を比較するべきかを知っていることを確認します。

ただし、すでにいくつかのことを行っています。

ヤコビアンの関数を使用してテストし、安定した結果が得られたため、後方オイラーの実装が適切であると確信しています。

それは次にテストすることです:分析的なヤコビアンを使用します。その後、後方オイラーの不安定な領域にいる可能性について、有限差分ヤコビアンの極値固有値を調べることもできます。比較の基礎として分析ヤコビアンの極値固有値を見ると、洞察が得られるかもしれません。これらすべてをチェックアウトすると仮定すると、問題はおそらくニュートンのソルバーにあります。


思慮深い分析(およびSUNDIALSヒントと代替ソース)に感謝します。私の教授は、ラムダ= 0を設定することを提案し、PDEのFDAは線形になると主張しました。これを行うと、3回のタイムステップを管理し、newton()が毎回maxiterに到達してから、以前のように最終的に爆発します。
スティーブンボッシュ

彼はまた、PDEの解決に近似ヤコビアンを使用することは一般的な慣行ではないと述べ、多くの自由度のために問題があるかもしれないことを示唆しました(説明を提供せず、Wメソッドに関するヘアラーとワナーの議論を見ただけですが、おそらく些細なことではないことがわかります)。
スティーブンボッシュ

1
Knoll and Keyesによるこの有名なレビューなど、主題に関する文献の量を考えると、教授の発言はいくぶん驚くべきものです。参考文献の情報源もあなたの問題を診断するのに役立つかもしれないので、おそらく私の答えでこの論文を引用すべきだったでしょう。
ジェフオックスベリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.