Gần đây tôi đã so sánh các bộ giải phi tuyến tính khác nhau từ scipy và đặc biệt ấn tượng với ví dụ Newton-Krylov trong Scipy Cookbook trong đó chúng giải phương trình phương trình vi phân bậc hai với thuật ngữ phản ứng phi tuyến tính trong khoảng 20 dòng mã.
Tôi đã sửa đổi mã ví dụ để giải phương trình Poisson phi tuyến tính ( còn được gọi là phương trình Poisson-Boltzmann , xem trang 17 trong các ghi chú này) cho các cấu trúc dị vòng bán dẫn, có dạng,
(Đây là hàm dư được truyền cho người giải.)
Đây là một vấn đề tĩnh điện trong đó và là các hàm phi tuyến cho dạng . Các chi tiết ở đây không quan trọng, nhưng điểm quan trọng là hàm phi tuyến tính thay đổi theo cấp số nhân với nên hàm dư có thể thay đổi trong phạm vi rất lớn ( với một chút thay đổi trong .
Tôi giải quyết một cách số lượng phương trình này với Newton-Krylov của scipy, nhưng nó sẽ không bao giờ hội tụ (thực tế là nó sẽ luôn báo cáo lỗi khi tính toán Jacobian). Tôi đã chuyển từ một bộ giải Newton-Krylov sang fsolve (dựa trên phép lai MINPACK) và nó hoạt động lần đầu tiên!
Có những lý do chung tại sao Newton-Krylov không phù hợp với một số vấn đề nhất định? Các phương trình đầu vào cần phải được điều hòa bằng cách nào đó?
Có thể cần thêm thông tin để bình luận, nhưng tại sao bạn nghĩ fsolve hoạt động trong trường hợp này?
sol = newton_krylov(func, guess, method='gmres')
) đã khắc phục vấn đề. Không chắc chắn chính xác tại sao, nhưng bất cứ ai khác có vấn đề này có thể xem xét làm tương tự.