Một Jacobian gần đúng với sự khác biệt hữu hạn có thể gây ra sự mất ổn định trong phương pháp Newton không?


13

Tôi đã triển khai một bộ giải Euler lạc hậu trong python 3 (sử dụng numpy). Để thuận tiện cho bản thân và như một bài tập, tôi cũng đã viết một hàm nhỏ tính toán xấp xỉ sai phân hữu hạn của độ dốc để tôi không phải luôn xác định Jacobian một cách phân tích (nếu có thể!).

Sử dụng các mô tả được cung cấp trong Ascher và Petzold 1998 , tôi đã viết hàm này xác định độ dốc tại một điểm 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

Tôi đã kiểm tra hàm này bằng cách lấy hàm đa biến cho con lắc và so sánh Jacobian tượng trưng với độ dốc được xác định bằng số cho một loạt các điểm. Tôi rất hài lòng với kết quả kiểm tra, lỗi là khoảng 1e-10. Khi tôi giải ODE cho con lắc bằng Jacobian gần đúng, nó cũng hoạt động rất tốt; Tôi không thể phát hiện bất kỳ sự khác biệt giữa hai.

Sau đó, tôi đã thử kiểm tra nó với PDE sau (phương trình của Fisher trong 1D):

tbạn= =x(kxbạn)+λ(bạn(C-bạn))

sử dụng một sự khác biệt hữu hạn.

Bây giờ phương pháp của Newton nổ tung trong dấu thời gian đầu tiên:

/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

Điều này xảy ra với nhiều giá trị eps, nhưng thật kỳ lạ, chỉ khi kích thước bước không gian PDE và kích thước bước thời gian được đặt sao cho không đáp ứng điều kiện Courant cảm Friedrichs Friedrich Lewy. Nếu không thì nó hoạt động. (Đây là hành vi bạn mong đợi nếu giải quyết bằng Euler chuyển tiếp!)

Để hoàn thiện, đây là chức năng của Phương pháp Newton:

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

(Hàm la.solve là scipy.linalg.solve.)

Tôi tin tưởng rằng việc triển khai Euler lạc hậu của tôi là theo thứ tự, bởi vì tôi đã thử nghiệm nó bằng cách sử dụng một chức năng cho Jacobian và nhận được kết quả ổn định.

Tôi có thể thấy trong trình gỡ lỗi rằng newton () quản lý 35 lần lặp trước khi xảy ra lỗi. Con số này vẫn giữ nguyên cho mỗi eps tôi đã thử.

Một quan sát bổ sung: khi tôi tính toán độ dốc với FDA và một hàm sử dụng điều kiện ban đầu làm đầu vào và so sánh hai trong khi thay đổi kích thước của epsilon, lỗi sẽ tăng lên khi epsilon co lại. Tôi dự kiến ​​nó sẽ lớn lúc đầu, sau đó nhỏ hơn, sau đó lại lớn hơn khi epsilon co lại. Vì vậy, một lỗi trong việc triển khai Jacobian của tôi là một giả định hợp lý, nhưng nếu vậy, nó tinh tế đến mức tôi không thể nhìn thấy nó. EDIT: Tôi đã sửa đổi jacobian () để sử dụng chuyển tiếp thay vì các khác biệt trung tâm và bây giờ tôi quan sát sự phát triển dự kiến ​​của lỗi. Tuy nhiên, newton () vẫn không hội tụ. Quan sát dx trong phép lặp Newton, tôi thấy rằng nó chỉ phát triển, thậm chí không có biến động: nó gần gấp đôi (yếu tố 1.9) với mỗi bước, với yếu tố ngày càng lớn hơn.

Ascher và Petzold có đề cập rằng các xấp xỉ khác nhau cho Jacobian không phải lúc nào cũng hoạt động tốt. Một Jacobian gần đúng với sự khác biệt hữu hạn có thể gây ra sự mất ổn định trong phương pháp của Newton không? Hay là nguyên nhân ở một nơi khác? Làm thế nào khác tôi có thể tiếp cận vấn đề này?


1
"Tôi tin tưởng rằng việc triển khai Euler lạc hậu của tôi là theo thứ tự, bởi vì tôi đã thử nghiệm nó bằng cách sử dụng một chức năng cho Jacobian và nhận được kết quả ổn định." Vui lòng làm rõ. Bạn có nói rằng bạn chạy cùng một vấn đề với một Jacobian chính xác và giải pháp hội tụ đến giải pháp chính xác của PDE? Đó là thông tin quan trọng.
David Ketcheson

@DavidKetcheson Vâng, đó là những gì tôi đang nói. Xin lỗi nếu thuật ngữ của tôi không chính xác hoặc không đầy đủ. (Tôi cho rằng tôi cũng nên nói "Tôi nhận được kết quả ổn định và mong đợi.")
Stephen Bosch

Câu trả lời:


3

Nhiều bình luận dài hơn bất cứ điều gì khác:

Sử dụng các mô tả được cung cấp trong Ascher và Petzold 1998, tôi đã viết hàm này xác định độ dốc tại một điểm x:

Nhìn vào mã cho xấp xỉ thương số khác nhau của SUNDIALS để có ý tưởng tốt hơn về những gì bạn nên làm trong khi thực hiện. Ascher và Petzold là một cuốn sách hay để bắt đầu, nhưng SUNDIALS thực sự được sử dụng trong công việc sản xuất, và do đó đã được thử nghiệm tốt hơn. (Ngoài ra, SUNDIALS có liên quan đến DASPK, mà Petzold đã làm việc.)

Ascher và Petzold có đề cập rằng các xấp xỉ khác nhau cho Jacobian không phải lúc nào cũng hoạt động tốt. Một Jacobian gần đúng với sự khác biệt hữu hạn có thể gây ra sự mất ổn định trong phương pháp của Newton không?

Theo kinh nghiệm, những người Jacob gần đúng có thể gây ra những thất bại hội tụ trong phương pháp của Newton. Tôi không biết rằng tôi mô tả họ là "sự bất ổn"; trong một số trường hợp, không thể đạt được dung sai lỗi mong muốn trong tiêu chí chấm dứt. Trong các trường hợp khác, nó có thể biểu hiện như một sự bất ổn. Tôi gần như chắc chắn có một kết quả định lượng hơn về hiện tượng này trong cuốn sách phương pháp số của Higham, hoặc thảo luận về phương pháp W của Hairer và Wanner.

Hay là nguyên nhân ở một nơi khác? Làm thế nào khác tôi có thể tiếp cận vấn đề này?

Nó phụ thuộc vào nơi bạn nghĩ rằng lỗi có thể. Nếu bạn cực kỳ tự tin vào việc triển khai Euler lạc hậu, tôi sẽ không bắt đầu từ đó. Kinh nghiệm đã khiến tôi hoang tưởng khi triển khai các phương pháp số, vì vậy nếu là tôi, tôi sẽ bắt đầu bằng cách mã hóa một vài vấn đề thử nghiệm thực sự cơ bản (một vài vấn đề tuyến tính cứng và cứng, phương trình nhiệt với xấp xỉ sai phân hữu hạn trung tâm, những thứ như vậy) và tôi sẽ sử dụng phương pháp của các giải pháp được sản xuất để đảm bảo với bản thân rằng tôi biết giải pháp đó sẽ là gì và tôi nên so sánh với cái gì.

Tuy nhiên, bạn đã thực hiện một số điều đó:

Tôi tin tưởng rằng việc triển khai Euler lạc hậu của tôi là theo thứ tự, bởi vì tôi đã thử nghiệm nó bằng cách sử dụng một chức năng cho Jacobian và nhận được kết quả ổn định.

Đó sẽ là điều tiếp theo tôi sẽ kiểm tra: sử dụng một Jacobian phân tích. Sau đó, bạn cũng có thể xem xét các giá trị bản địa cực đoan của sự khác biệt hữu hạn của bạn Jacobian nếu bạn ở trong khu vực không ổn định của Euler lạc hậu. Nhìn vào giá trị bản địa cực đoan của Jacobian phân tích của bạn làm cơ sở để so sánh có thể cung cấp cho bạn một cái nhìn sâu sắc. Giả sử tất cả những người kiểm tra, vấn đề có lẽ là trong giải quyết Newton.


Cảm ơn các phân tích chu đáo (cộng với gợi ý SUNDIALS và các nguồn thay thế). Giáo sư của tôi đề nghị đặt lambda = 0, lập luận rằng FDA của PDE sau đó trở thành tuyến tính, vì vậy chúng tôi hy vọng FDA Jacobian sẽ bằng Jacobian phân tích. Khi tôi làm điều này, nó quản lý ba dấu thời gian, newton () nhấn maxiter mỗi lần, trước khi cuối cùng nổ tung như trước.
Stephen Bosch

Ông cũng nói rằng việc sử dụng những người Jacob xấp xỉ để giải quyết PDE là không phổ biến và cho rằng nó có thể gặp rắc rối do nhiều mức độ tự do (không đưa ra lời giải thích, mặc dù chỉ nhìn vào thảo luận về phương pháp W của Hairer và Wanner, Tôi có thể thấy rằng nó có thể không tầm thường).
Stephen Bosch

1
Tuyên bố của giáo sư của bạn là hơi ngạc nhiên, với số lượng tài liệu về chủ đề này, ví dụ như bài phê bình nổi tiếng này của Knoll và Keyes . Tôi có lẽ nên trích dẫn bài báo này trong câu trả lời của mình, vì các nguồn trong thư mục cũng có thể giúp ích trong việc chẩn đoán các vấn đề của bạn.
Geoff Oxberry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.