Как установить ограничение на кривую SciPy?

Я пытаюсь установить распределение некоторых экспериментальных значений с помощью специальной функции плотности вероятности. Очевидно, что интеграл результирующей функции всегда должен быть равен 1, но результаты простого scipy.optimize.curve_fit (function, dataBincenters, dataCounts) никогда не удовлетворяют этому условию. Каков наилучший способ решить эту проблему?

  • Python: ускорение географического сравнения
  • Как я могу оптимизировать этот код Python для генерации всех слов со словом-расстоянием 1?
  • Есть ли более быстрый способ добавить два массива 2-х numpy
  • Панды: медленное преобразование даты
  • `deepcopy ()` чрезвычайно медленный
  • Python datetime.strptime () Употребление большого количества времени процессора
  • Python datetime.strptime () Употребление большого количества времени процессора
  • Быстрое вращение тензора с NumPy
  • Поверхностная кривизна Matlab эквивалент в Python
  • Python эквивалент функции «ismember» MATLAB
  • Правильная установка с scipy curve_fit, включая ошибки в x?
  • Производительность OrderedDict (по сравнению с deque)
  • 2 Solutions collect form web for “Как установить ограничение на кривую SciPy?”

    Вы можете определить свою собственную функцию остатков, включая параметр штрафа, как указано в приведенном ниже коде, где заранее известно, что интеграл по интервалу должен быть 2. .. Если вы проверите без штрафа, вы увидите, что то, что вы получаете, это обычная curve_fit :

    введите описание изображения здесь

     import matplotlib.pyplot as plt import scipy from scipy.optimize import curve_fit, minimize, leastsq from scipy.integrate import quad from scipy import pi, sin x = scipy.linspace(0, pi, 100) y = scipy.sin(x) + (0. + scipy.rand(len(x))*0.4) def func1(x, a0, a1, a2, a3): return a0 + a1*x + a2*x**2 + a3*x**3 # here you include the penalization factor def residuals(p,x,y): integral = quad( func1, 0, pi, args=(p[0],p[1],p[2],p[3]))[0] penalization = abs(2.-integral)*10000 return y - func1(x, p[0],p[1],p[2],p[3]) - penalization popt1, pcov1 = curve_fit( func1, x, y ) popt2, pcov2 = leastsq(func=residuals, x0=(1.,1.,1.,1.), args=(x,y)) y_fit1 = func1(x, *popt1) y_fit2 = func1(x, *popt2) plt.scatter(x,y, marker='.') plt.plot(x,y_fit1, color='g', label='curve_fit') plt.plot(x,y_fit2, color='y', label='constrained') plt.legend(); plt.xlim(-0.1,3.5); plt.ylim(0,1.4) print 'Exact integral:',quad(sin ,0,pi)[0] print 'Approx integral1:',quad(func1,0,pi,args=(popt1[0],popt1[1], popt1[2],popt1[3]))[0] print 'Approx integral2:',quad(func1,0,pi,args=(popt2[0],popt2[1], popt2[2],popt2[3]))[0] plt.show() #Exact integral: 2.0 #Approx integral1: 2.60068579748 #Approx integral2: 2.00001911981 

    Другие связанные вопросы:

    • SciPy LeastSq Хороший оценщик

    Вот почти идентичный фрагмент, который использует только curve_fit .

     import matplotlib.pyplot as plt import numpy as np import scipy.optimize as opt import scipy.integrate as integr x = np.linspace(0, np.pi, 100) y = np.sin(x) + (0. + np.random.rand(len(x))*0.4) def Func(x, a0, a1, a2, a3): return a0 + a1*x + a2*x**2 + a3*x**3 # modified function definition with Penalization def FuncPen(x, a0, a1, a2, a3): integral = integr.quad( Func, 0, np.pi, args=(a0,a1,a2,a3))[0] penalization = abs(2.-integral)*10000 return a0 + a1*x + a2*x**2 + a3*x**3 + penalization popt1, pcov1 = opt.curve_fit( Func, x, y ) popt2, pcov2 = opt.curve_fit( FuncPen, x, y ) y_fit1 = Func(x, *popt1) y_fit2 = Func(x, *popt2) plt.scatter(x,y, marker='.') plt.plot(x,y_fit2, color='y', label='constrained') plt.plot(x,y_fit1, color='g', label='curve_fit') plt.legend(); plt.xlim(-0.1,3.5); plt.ylim(0,1.4) print 'Exact integral:',integr.quad(np.sin ,0,np.pi)[0] print 'Approx integral1:',integr.quad(Func,0,np.pi,args=(popt1[0],popt1[1], popt1[2],popt1[3]))[0] print 'Approx integral2:',integr.quad(Func,0,np.pi,args=(popt2[0],popt2[1], popt2[2],popt2[3]))[0] plt.show() #Exact integral: 2.0 #Approx integral1: 2.66485028754 #Approx integral2: 2.00002116217 

    введите описание изображения здесь

    Python - лучший язык программирования в мире.