จาโคเบียนที่ประมาณด้วยความแตกต่างที่แน่นอนสามารถทำให้เกิดความไม่เสถียรในวิธีการของนิวตันได้หรือไม่?


13

ฉันใช้ตัวแก้แบบย้อนกลับ - ออยเลอร์ในไพ ธ อน 3 (โดยใช้หมายเลข) เพื่อความสะดวกของฉันและเป็นแบบฝึกหัดฉันยังเขียนฟังก์ชั่นเล็ก ๆ ที่คำนวณความแตกต่างอัน จำกัด ของการไล่ระดับสีเพื่อที่ฉันจะได้ไม่ต้องพิจารณาจาโคเบียนในเชิงวิเคราะห์ (ถ้าเป็นไปได้!)

ใช้คำอธิบายที่มีให้ในAscher และ 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

ฉันทดสอบฟังก์ชันนี้โดยการใช้ฟังก์ชันหลายตัวแปรสำหรับลูกตุ้มและเปรียบเทียบ Jacobian สัญลักษณ์กับการไล่ระดับสีที่กำหนดเป็นตัวเลขสำหรับช่วงของคะแนน ฉันพอใจกับผลการทดสอบข้อผิดพลาดประมาณ 1e-10 เมื่อฉันแก้ไข ODE สำหรับลูกตุ้มโดยใช้ยาโคเบียนโดยประมาณมันก็ใช้ได้ดีเช่นกัน ฉันไม่สามารถตรวจพบความแตกต่างระหว่างสองสิ่งนี้

จากนั้นฉันลองทดสอบด้วย PDE ต่อไปนี้ (สมการของฟิชเชอร์ใน 1D):

tu=x(kxu)+λ(u(Cu))

ใช้ discretization แตกต่างแน่นอน

ตอนนี้วิธีการของนิวตันระเบิดในการประทับเวลาครั้งแรก:

/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 และขนาดขั้นตอนเวลาถูกตั้งค่าเพื่อให้ไม่พบเงื่อนไข Courant – Friedrichs – Lewy ไม่อย่างนั้นมันก็ใช้งานได้ (นี่เป็นพฤติกรรมที่คุณคาดหวังว่าจะแก้ปัญหาด้วยการส่งต่อออยเลอร์!)

เพื่อความสมบูรณ์นี่คือฟังก์ชันสำหรับวิธีการของนิวตัน:

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)

ฉันมั่นใจว่าการใช้ออยเลอร์แบบย้อนหลังของฉันนั้นเป็นไปตามลำดับเพราะฉันได้ทำการทดสอบโดยใช้ฟังก์ชั่นสำหรับ Jacobian และได้ผลลัพธ์ที่มั่นคง

ฉันเห็นในตัวดีบักที่ newton () จัดการ 35 iterations ก่อนเกิดข้อผิดพลาด หมายเลขนี้ยังคงเหมือนเดิมสำหรับทุก eps ที่ฉันได้ลอง

การสังเกตเพิ่มเติม: เมื่อฉันคำนวณการไล่ระดับสีด้วย FDA และฟังก์ชั่นโดยใช้เงื่อนไขเริ่มต้นเป็นอินพุตและเปรียบเทียบทั้งสองขณะที่เปลี่ยนขนาดของ epsilon ความผิดพลาดจะเพิ่มขึ้นเมื่อ epsilon หดตัว ฉันคาดหวังว่ามันจะมีขนาดใหญ่ในตอนแรกจากนั้นก็จะเล็กลงและใหญ่ขึ้นอีกเมื่อเอปไซลอนหดตัว ดังนั้นข้อผิดพลาดในการใช้งาน Jacobian ของฉันจึงเป็นข้อสันนิษฐานที่สมเหตุสมผล แต่ถ้าเป็นเช่นนั้นมันช่างบอบบางเหลือเกินที่ฉันไม่เห็น แก้ไข: ฉันแก้ไข jacobian () เพื่อใช้ไปข้างหน้าแทนความแตกต่างกลางและตอนนี้ฉันสังเกตเห็นการพัฒนาที่คาดหวังของข้อผิดพลาด อย่างไรก็ตามนิวตัน () ยังคงไม่มาบรรจบกัน จากการสังเกต dx ในการวนซ้ำของนิวตันฉันเห็นว่ามันเติบโตขึ้นเท่านั้นไม่มีความผันผวน: มันเกือบเป็นสองเท่า (ปัจจัย 1.9) ในแต่ละขั้นตอนโดยที่ปัจจัยมีขนาดใหญ่ขึ้นเรื่อย ๆ

Ascher และ Petzold พูดถึงว่าการประมาณความแตกต่างสำหรับ Jacobian นั้นไม่ได้ผลดีเสมอไป จาโคเบียนที่ประมาณโดยประมาณมีความแตกต่าง จำกัด สามารถทำให้เกิดความไม่เสถียรในวิธีการของนิวตันได้หรือไม่? หรือเป็นสาเหตุที่อื่น? ฉันจะแก้ไขปัญหานี้ได้อย่างไร


1
"ฉันมั่นใจว่าการใช้ออยเลอร์ย้อนหลังของฉันนั้นเป็นไปตามลำดับเพราะฉันทดสอบโดยใช้ฟังก์ชั่นสำหรับ Jacobian และได้ผลลัพธ์ที่มั่นคง" กรุณาชี้แจง คุณกำลังบอกว่าคุณใช้ปัญหาเดียวกันกับจาโคเบียนที่แน่นอนและการแก้ปัญหามาบรรจบกับการแก้ปัญหาที่แน่นอนของ PDE หรือไม่? นั่นคือข้อมูลที่สำคัญ
David Ketcheson

@DavidKetcheson ใช่นั่นคือสิ่งที่ฉันพูด ขอโทษถ้าคำศัพท์ของฉันไม่ถูกต้องหรือไม่สมบูรณ์ (ฉันคิดว่าฉันควรจะได้กล่าวว่า "ฉันได้รับผลลัพธ์ที่มั่นคงและคาดว่าจะได้")
สตีเฟ่นบ๊อช

คำตอบ:


3

มีความคิดเห็นยาวกว่าสิ่งอื่นใด:

ใช้คำอธิบายที่มีให้ใน Ascher และ Petzold 1998 ฉันเขียนฟังก์ชันนี้ซึ่งกำหนดระดับความลาดชัน ณ จุดที่กำหนด x:

ดูรหัสสำหรับการประมาณความฉลาดทางผลต่างของ SUNDIALS เพื่อให้ได้แนวคิดที่ดีขึ้นเกี่ยวกับสิ่งที่คุณควรทำในการนำไปใช้ Ascher และ Petzold เป็นหนังสือที่ดีในการเริ่มต้น แต่ SUNDIALS ถูกนำไปใช้จริงในงานผลิตและได้รับการทดสอบที่ดีขึ้น (นอกจากนี้ SUNDIALS เกี่ยวข้องกับ DASPK ซึ่ง Petzold ทำงานอยู่)

Ascher และ Petzold พูดถึงว่าการประมาณความแตกต่างสำหรับ Jacobian นั้นไม่ได้ผลดีเสมอไป จาโคเบียนที่ประมาณโดยประมาณมีความแตกต่าง จำกัด สามารถทำให้เกิดความไม่เสถียรในวิธีการของนิวตันได้หรือไม่?

สังเกตุว่ายาโคบานโดยประมาณสามารถทำให้เกิดความล้มเหลวของการลู่เข้าในวิธีการของนิวตัน ฉันไม่รู้ว่าฉันจะบอกว่าเป็น "ความไม่แน่นอน"; ในบางกรณีมันเป็นไปไม่ได้ที่จะบรรลุเกณฑ์ความคลาดเคลื่อนที่ต้องการในเกณฑ์การเลิกจ้าง ในกรณีอื่น ๆ มันอาจประจักษ์เป็นความไม่แน่นอน ฉันเกือบจะแน่ใจว่ามีผลเชิงปริมาณมากขึ้นในปรากฏการณ์นี้ในหนังสือวิธีการเชิงตัวเลขของ Higham หรือการอภิปรายเกี่ยวกับวิธี W ของ Hairer and Wanner

หรือเป็นสาเหตุที่อื่น? ฉันจะแก้ไขปัญหานี้ได้อย่างไร

ขึ้นอยู่กับที่คุณคิดว่าอาจเกิดข้อผิดพลาด หากคุณมั่นใจอย่างยิ่งในการใช้ออยเลอร์ย้อนหลังของคุณฉันจะไม่เริ่มต้นที่นั่น ประสบการณ์ทำให้ฉันหวาดระแวงในการใช้วิธีการเชิงตัวเลขของฉันดังนั้นถ้าเป็นฉันฉันจะเริ่มต้นด้วยการเขียนปัญหาการทดสอบขั้นพื้นฐานสองสามข้อจริง ๆ (ปัญหาที่ไม่เป็นเชิงเส้นคู่และไม่เชิงเส้นแข็ง) สมการความร้อน สิ่งต่าง ๆ เช่นนั้น) และฉันจะใช้วิธีการแก้ปัญหาที่ผลิตขึ้นเพื่อรับรองตัวเองว่าฉันรู้ว่าจะแก้ปัญหาอย่างไรและควรเปรียบเทียบกับสิ่งใด

อย่างไรก็ตามคุณได้ทำสิ่งต่อไปนี้แล้ว:

ฉันมั่นใจว่าการใช้ออยเลอร์แบบย้อนหลังของฉันนั้นเป็นไปตามลำดับเพราะฉันได้ทำการทดสอบโดยใช้ฟังก์ชั่นสำหรับ Jacobian และได้ผลลัพธ์ที่มั่นคง

นั่นจะเป็นสิ่งต่อไปที่ฉันจะทดสอบ: ใช้การวิเคราะห์แบบจาโคเบียน หลังจากนั้นคุณอาจดูค่าลักษณะเฉพาะสุดขั้วของความแตกต่างอัน จำกัด จาโคเบียนเมื่อคุณอยู่ในพื้นที่ที่ไม่แน่นอนของออยเลอร์หลัง การดูค่าลักษณะเฉพาะแบบสุดขั้วของ Jacobian เชิงวิเคราะห์ของคุณเป็นพื้นฐานสำหรับการเปรียบเทียบอาจให้ข้อมูลเชิงลึกบางอย่างแก่คุณ สมมติว่าทุกคนเช็คเอาท์ปัญหาน่าจะเป็นที่นิวตันแก้


ขอบคุณสำหรับการวิเคราะห์อย่างรอบคอบ (รวมทั้งคำใบ้ SUNDIALS และแหล่งข้อมูลอื่น) อาจารย์ของฉันแนะนำให้ตั้งค่าแลมบ์ดา = 0 โดยให้เหตุผลว่า FDA ของ PDE นั้นเป็นเส้นตรงดังนั้นเราคาดว่า FDA Jacobian จะเท่ากับ Jacobian เชิงวิเคราะห์ เมื่อฉันทำเช่นนี้มันจะจัดการกับสามการตั้งเวลานิวตัน () กดปุ่มสูงสุดในแต่ละครั้งก่อนที่จะระเบิดขึ้นมาในที่สุด
สตีเฟ่นบ๊อช

นอกจากนี้เขายังกล่าวว่าไม่ใช่เรื่องธรรมดาที่จะใช้ยาโคบราวน์เพื่อแก้ไข PDE และแนะนำว่ามันอาจจะมีปัญหาเนื่องจากมีหลายระดับของอิสรภาพ ฉันสามารถเห็นว่ามันอาจจะไม่น่ารำคาญ)
สตีเฟ่นบ๊อช

1
คำสั่งอาจารย์ของคุณจะค่อนข้างน่าแปลกใจที่ได้รับปริมาณของวรรณคดีในเรื่องเช่นนี้การตรวจสอบที่มีชื่อเสียงโดย Knoll และคีย์ส ฉันอาจจะอ้างถึงบทความนี้ในคำตอบของฉันเนื่องจากแหล่งข้อมูลในบรรณานุกรมอาจช่วยในการวินิจฉัยปัญหาของคุณ
Geoff Oxberry
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.