Optimizar constantes en ecuaciones diferenciales en Python.

Bueno, ¿cómo me acercaría a escribir un código para optimizar las constantes a y b en una ecuación diferencial, como dy / dt = a * y ^ 2 + b, usando curve_fit? Estaría usando odeint para resolver la EDO y luego curve_fit para optimizar a y b. Si pudiera darnos su opinión sobre esta situación, se lo agradecería mucho.

Related of "Optimizar constantes en ecuaciones diferenciales en Python."

Puede que te sirvan mejor observando ODEs con Sympy . Scipy / Numpy son paquetes fundamentalmente numéricos y no están configurados para realizar operaciones algebraicas / simbólicas.

Definitivamente puedes hacer esto:

import numpy as np from scipy.integrate import odeint from scipy.optimize import curve_fit def f(y, t, a, b): return a*y**2 + b def y(t, a, b, y0): """ Solution to the ODE y'(t) = f(t,y,a,b) with initial condition y(0) = y0 """ y = odeint(f, y0, t, args=(a, b)) return y.ravel() # Some random data to fit data_t = np.sort(np.random.rand(200) * 10) data_y = data_t**2 + np.random.rand(200)*10 popt, cov = curve_fit(y, data_t, data_y, [-1.2, 0.1, 0]) a_opt, b_opt, y0_opt = popt print("a = %g" % a_opt) print("b = %g" % b_opt) print("y0 = %g" % y0_opt) import matplotlib.pyplot as plt t = np.linspace(0, 10, 2000) plt.plot(data_t, data_y, '.', t, y(t, a_opt, b_opt, y0_opt), '-') plt.gcf().set_size_inches(6, 4) plt.savefig('out.png', dpi=96) plt.show() 

Para abordar específicamente este tipo de problema, decidí escribir un paquete envoltorio que unifique sympy y scipy . Se llama symfit . El ajuste a su ODE se vería así:

 tdata = np.array([10, 26, 44, 70, 120]) ydata = 10e-4 * np.array([44, 34, 27, 20, 14]) y, t = variables('y, t') a, b = parameters('a, b') model_dict = { D(y, t): a*y^2 + b } ode_model = ODEModel(model_dict, initial={t: 0.0, y: 0.0}) fit = Fit(ode_model, t=tdata, y=ydata) fit_result = fit.execute() 

Como se puede ver en la forma en que se define como un dict, el ajuste a los sistemas de EDO (de primer orden) no es un problema. Echa un vistazo a los documentos para más!