Baru-baru ini saya telah membandingkan berbagai pemecah non-linear dari scipy dan sangat terkesan dengan contoh Newton-Krylov dalam Scipy Cookbook di mana mereka memecahkan persamaan persamaan diferensial orde dua dengan istilah reaksi non-linear dalam sekitar 20 baris kode.
Saya memodifikasi kode contoh untuk menyelesaikan persamaan Poisson non-linear ( juga disebut persamaan Poisson-Boltzmann , lihat halaman 17 dalam catatan ini) untuk heterostruktur semikonduktor, yang memiliki bentuk,
(Ini adalah fungsi residual yang diteruskan ke pemecah.)
Ini adalah masalah elektrostatik di mana dan p ( x , ϕ ) adalah fungsi nonlinier untuk bentuk n i ( x ) e - ( E i ( x , ϕ ) - E f ) . Detail di sini tidak penting, tetapi intinya adalah bahwa fungsi non-linear bervariasi secara eksponensial dengan ϕ sehingga fungsi residual dapat bervariasi pada rentang yang sangat besar ( 10 - 6 - 10 16 )dengan sedikit perubahan pada .
Saya secara numerik memecahkan persamaan ini dengan Scipy's Newton-Krylov, tetapi tidak akan pernah bertemu (pada kenyataannya ia akan selalu melaporkan kesalahan dengan menghitung Jacobian). Saya beralih dari pemecah Newton-Krylov ke fsolve (yang didasarkan pada MINPACK hybrd) dan berhasil pertama kali!
Apakah ada alasan umum mengapa Newton-Krylov tidak cocok untuk masalah tertentu? Apakah persamaan input perlu dikondisikan entah bagaimana?
Mungkin diperlukan lebih banyak informasi untuk berkomentar, tetapi mengapa menurut Anda fsolve bekerja dalam kasus ini?
sol = newton_krylov(func, guess, method='gmres')
) memperbaiki masalah. Tidak terlalu yakin mengapa, tetapi siapa pun dengan masalah ini mungkin mempertimbangkan untuk melakukan hal yang sama.