Нещодавно я порівнював різні нелінійні розв'язувачі з scipy і був особливо вражений прикладом Ньютона-Крилова в кулінарній книзі Scipy, в якому вони вирішують диференціальне рівняння рівняння другого порядку з нелінійним терміном реакції приблизно в 20 рядках коду.
Я змінив приклад коду для вирішення нелінійного рівняння Пуассона (його також називають рівнянням Пуассона-Больцмана , див. Стор. 17 в цих примітках) для напівпровідникових гетероструктур, які мають вигляд,
(Це залишкова функція, яка передається вирішувачу.)
Це проблема електростатики, де і p ( x , ϕ ) - нелінійні функції для виду n i ( x ) e - ( E i ( x , ϕ ) - E f ) . Деталі тут не важливі, але справа в тому , що нелінійна функцій експоненціально змінюватиметься в залежності ф так , залишкова функція може змінюватися в величезному діапазоні ( 10 - 6 - 10 16 )з незначною зміною .
Я чисельно розв'язую це рівняння з ньютоном-Криловим scipy, але воно ніколи не збігатиметься (адже воно завжди повідомляло б про помилку при обчисленні якобійців). Я перейшов з розв'язувача Ньютона-Крилова на fsolve (який базується на гібриді MINPACK), і це спрацювало вперше!
Чи є загальні причини, чому Ньютон-Крилов не добре підходить до певних проблем? Чи потрібно вхідні рівняння якось обумовлювати?
Можливо, для коментування потрібно більше інформації, але чому ви вважаєте, що fsolve працював у цьому випадку?
sol = newton_krylov(func, guess, method='gmres')
) вирішила проблему. Не зовсім точно, чому, але будь-хто інший із цим питанням може подумати, що робити те саме.