Предлагаю аппроксимировать пошаговую функцию.Вместо бесконечного наклона в «точке изменения» сделайте его линейным на расстоянии одного x (1,0 в примере).Например, если параметр x, xp, для функции определен как средняя точка на этой линии, тогда значение в xp-0.5 является более низким значением y, а значение в xp + 0.5 является более высоким значением y, а промежуточные значения функции винтервал [хр-0,5;xp + 0.5] - линейная интерполяция между этими двумя точками.
Если можно предположить, что ступенчатая функция (или ее приближение) переходит от более низкого значения к более высокому значению, то я думаю, что первоначальное предположениепоследние два параметра должны быть наименьшим значением y и наибольшим значением y соответственно вместо 0.0 и 0.0.
У меня есть 2 исправления:
1) np.random.random ()возвращает случайные числа в диапазоне от 0,0 до 1,0.Таким образом, среднее значение составляет +0,5, а также является значением третьего параметра (вместо 0,0).И тогда второй параметр равен -9,5 (+0,5 - 10,0) вместо -10,0.
Таким образом
print np.sum(errfunc([250.,-10.,0.], x, y)**2.)
должно быть
print np.sum(errfunc([250.,-9.5,0.5], x, y)**2.)
2)В оригинальном fitfunc () одно значение y становится 0.0, если x точно равно p [0].Таким образом, в этом случае это не ступенчатая функция (больше похоже на сумму двух ступенчатых функций).Например, это происходит, когда начальное значение первого параметра равно 500.