Ваш график c не воспроизводится, в python 3.7, scipy 1.4.1, я получаю расхождение практически до бесконечности около 12,5, и после очистки рабочего пространства оба графика перемещаются в ноль после времени 10.
Проблема заключается в вашем делении на 2*y
во втором уравнении. Фактически это означает, что y
является квадратом root какой-либо другой функции, и этот тип функции ведет себя плохо при небольших значениях, когда тангенс становится вертикальным, а вскоре после этого изменяется на ноль.
Однако можно десингуляризовать деление простым способом
dy = -alpha*(1+epi*X)*y/(1e-10+2*y*y)
или более сложным способом, который оставляет решение далеко от нуля действительно неизменным
dy = -alpha*(1+epi*X)*y/(y*y+max(1e-12,y*y))
в результате получается график
Если это все еще не ожидаемое поведение, то в вашей системе ODE что-то другое отличается от версии Matlab.
То, что особая точка находится на отметке w=10
, почти полностью зависит от alpha=0.1
. Поскольку epi
мало, а X
изначально мало, второе уравнение близко к
d(y^2)/dW = -alpha ==> y^2 = 1 - alpha*W
, и оно достигает нуля примерно на W=10
, где решение должно заканчиваться как квадрат y
не может принимать отрицательные значения.