Я относительно новичок в Python и пытаюсь использовать его для решения нелинейного дифференциального уравнения второго порядка, в частности уравнения Пуассона-Больцмана в электролите.
phi''(r) + (2/r)*phi'(r) = (k^2)*sinh(phi(r))
По сути, он описывает спад электростатического потенциала (phi) вдали от заряженной поверхности в электролите со скоростью спада, определяемой параметром k.
- phi(r) - потенциал на r
- dphi(r) - производная потенциала по r
- r - расстояние от поверхности (в данном случае я решаю от r = 1 до r = R)
и граничные условия
- фи (1) = 5
- дфи (R) = 0
Проблемный бит кода выглядит следующим образом
from scipy.integrate import odeint
from scipy.optimize import root
from pylab import * # for plotting commands
k = 0.5
phi = 5
dphi = -10
R = 21
def deriv(z,r): # return derivatives of the array z (where z = [phi, phi'])
return np.array([
(z[1]),
((k**2)*sinh(z[0]))-((2/r)*z[1])
])
result = odeint(deriv,np.array([phi,dphi]),np.linspace(1,R,1017), full_output = 1)
Как правило, для низких значений k интеграция работает нормально, и я могу использовать root из scipy.optimize для ее решения с учетом граничных условий, однако, когда я пытаюсь использовать относительно большие значения k (0,5 и выше), интеграция сталкивается с проблемами и выдает следующую ошибку
Excess work done on this call (perhaps wrong Dfun type).
Запустив его с full_output = 1 и взглянув на параметр tcur
, кажется, что он плавно подсчитывает до определенного момента, а затем резко колеблется от очень больших до очень маленьких значений. В той же точке nfe
количество вычислений функции падает до нуля. При правильной работе параметр tcur плавно изменяется от 1 до R. Может ли кто-нибудь просветить меня, почему это происходит? Это проблема с моей реализацией или в уравнении есть нестабильность?
Заранее благодарю за любую помощь,
Дэйв