Вам необходимо предоставить функцию f(t,b,c)
, которая с аргументом или списком аргументов в t
возвращает значение функции для аргумента (ов).Это требует некоторой работы, либо путем определения типа t
, либо с помощью конструкции, которая работает в любом случае:
def f(t,b,c):
tspan = np.hstack([[0],np.hstack([t])])
return scint.odeint(pend, y0, tspan, args=(b,c))[1:,0]
popt, pcov = scopt.curve_fit(f, t, sol[:,0], p0=guess)
, которая возвращает popt = array([ 0.25, 5. ])
.
Это может быть расширено доподходит еще больше параметров,
def f(t, a0,a1, b,c):
tspan = np.hstack([[0],np.hstack([t])])
return scint.odeint(pend, [a0,a1], tspan, args=(b,c))[1:,0]
popt, pcov = scopt.curve_fit(f, t, sol[:,0], p0=guess)
, что приводит к popt = [ 3.04159267e+00, -2.38543640e-07, 2.49993362e-01, 4.99998795e+00]
.
Другая возможность состоит в том, чтобы явно вычислить квадратную норму разностей для целевого решения и применить минимизацию копределенная скалярная функция.
def f(param):
b,c = param
t_sol = scint.odeint(pend, y0, t, args=(b,c))
return np.linalg.norm(t_sol[:,0]-sol[:,0]);
res = scopt.minimize(f, np.array(guess))
, которая возвращает res
fun: 1.572327981969186e-08
hess_inv: array([[ 0.00031325, 0.00033478],
[ 0.00033478, 0.00035841]])
jac: array([ 0.06129361, -0.04859557])
message: 'Desired error not necessarily achieved due to precision loss.'
nfev: 518
nit: 27
njev: 127
status: 2
success: False
x: array([ 0.24999905, 4.99999884])