Присоединение данных с интегральной функцией
При использовании curve_fit
из scipy.optimize
для соответствия некоторым данным в python, сначала определяется функция подгонки (например, полином 2-го порядка) следующим образом:
-
def f(x, a, b):
return a*x**2+b*x
- И затем продолжит установку
popt, pcov = curve_fit(f,x,y)
Но вопрос в том, как решить задачу определения функции в точке 1. Если функция содержит интеграл (или дискретную сумму), например:
![enter image description here]()
Экспериментальные данные по-прежнему указаны для x и f (x), поэтому точка 2. была бы аналогичной, я предполагаю, как только я смогу определить f (x) в python. Кстати, я забыл сказать, что предполагается, что g (t) имеет здесь хорошо известную форму и содержит параметры подгонки, то есть такие параметры, как a и b, заданные в примере полинома. Буду признателен за любую оказанную помощь. Вопрос действительно должен быть общим, а функции, используемые в сообщении, являются случайными примерами.
Ответы
Ответ 1
Здесь приведен пример подгонки кривой, определенной в терминах интеграла. Кривая является интегралом от sin(t*w)/t+p
над t
от 0 до Pi. Наши точки данных x соответствуют w
, и мы корректируем параметр p
для получения данных.
import math, numpy, scipy.optimize, scipy.integrate
def integrand(t, args):
w, p = args
return math.sin(t * w)/t + p
def curve(w, p):
res = scipy.integrate.quad(integrand, 0.0, math.pi, [w, p])
return res[0]
vcurve = numpy.vectorize(curve, excluded=set([1]))
truexdata = numpy.asarray([0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0])
trueydata = vcurve(truexdata, 1.0)
xdata = truexdata + 0.1 * numpy.random.randn(8)
ydata = trueydata + 0.1 * numpy.random.randn(8)
popt, pcov = scipy.optimize.curve_fit(vcurve,
xdata, ydata,
p0=[2.0])
print popt
Это напечатает что-то довольно близкое к 1.0, которое мы использовали как p
, когда мы создали trueydata
.
Заметим, что мы используем numpy.vectorize
для функции кривой для создания векторизованного варианта, совместимого с scipy.optimize.curve_fit
.
Ответ 2
Иногда вам может повезти, и вы можете аналитически анализировать интеграл. В следующем примере произведение h(t)=exp(-(t-x)**2/2)
и полинома второй степени g(t)
интегрируется от 0 до бесконечности. Sympy используется для оценки Integral и генерации функции, используемой для curve_fit()
:
import sympy as sy
sy.init_printing() # LaTeX-like pretty printing of IPython
t, x = sy.symbols("t, x", real=True)
h = sy.exp(-(t-x)**2/2)
a0, a1, a2 = sy.symbols('a:3', real=True) # unknown coefficients
g = a0 + a1*t + a2*t**2
gh = (g*h).simplify() # the intgrand
G = sy.integrate(gh, (t, 0, sy.oo)).simplify() # integrate from 0 to infinty
# Generate numeric function to be usable by curve_fit()
G_opt = sy.lambdify((x, t, a0, a1, a2), G)
print(G_opt(1, 2, 3, 4, 5)) # example usage
Заметим, что в общем случае проблема часто некорректна, так как интеграл не обязательно сходится в достаточно большой окрестности решения (что принято в [t22 > ).