Положите
print t,y
в качестве первой строки в fun
, чтобы увидеть, что ваше решение быстро развивается, используя очень маленькие размеры шагов. Последние строки этого журнала
0.00100025397168 [ 2.57204893e+289 6.79981963e+298]
0.00100025397168 [ 2.57204893e+289 6.79981963e+298]
0.00100025397168 [ 2.57204893e+289 6.79981964e+298]
0.00100025397168 [ 2.57204893e+289 6.79981964e+298]
0.00100025397168 [ 2.57204897e+289 6.79981974e+298]
0.00100025397168 [ 2.57204899e+289 inf]
0.00100025397168 [ inf nan]
0.00100025397168 [ nan nan]
0.00100025397168 [ nan nan]
0.00100025397168 [ nan nan]
0.00100025397168 [ 2.57204894e+289 6.79981966e+298]
0.00100025397168 [ 2.57204894e+289 inf]
0.00100025397168 [ inf nan]
0.00100025397168 [ nan nan]
0.00100025397168 [ nan nan]
0.00100025397168 [ nan nan]
/usr/lib/python2.7/dist-packages/scipy/integrate
/_ode.py:1018: UserWarning: dopri5: step size becomes too small
self.messages.get(idid, 'Unexpected idid=%s' % idid))
Чтобы увидеть математическую сторону этого, обратите внимание, что начальная константа Липшица находится где-то на уровне L=1e+18
.
Полезные размеры шага для численного интегрирования должны соблюдать L*dt < 10
, возможно, меньшую верхнюю границу, чтобы оставаться в области A-стабильности для явных методов.
Коэффициент увеличения от локальной ошибки к глобальной составляет (exp(L*T)-1)
, где T
— длина интервала интегрирования. Это означает, что значимых результатов можно ожидать только, оптимистично, для L*T < 50
, что дает T<5e-17
.
При этих теоретических ограничениях интегратор dopri5 на практике оказывается достаточно надежным, поскольку он выходит из строя только при T=2.5e-7
.
Возмущение к форме Эйлера
t²·y'' + 3t·y' - 7/t0^4·y = 0
дает начальный рост в пределах
(t/t0) ^ 3e6
и так как самый большой двойник составляет около 10^300
, числовой диапазон превышается примерно в
t/t0 = 10 ^ 1e-4 = 1.00023028502 or t=0.00100023028502
который ближе всего к тому, где численное интегрирование спасает, и, следовательно, вероятно, истинная причина. (Лучшие оценки дают 10^(308/2.6e6)=1.00027280498
.)
Резюме
Мало того, что это дифференциальное уравнение имеет чрезвычайно большую постоянную Липшица и, таким образом, плохо себя ведет или является жестким, точное решение, насколько может сказать аппроксимация уравнением Эйлера, растет так быстро, что превышает диапазон double
в то время, когда численное интегрирование не работает. То есть даже такой лучший метод, как неявный интегратор, не даст лучших результатов.
person
Lutz Lehmann
schedule
04.01.2016