Оптимизация констант в дифференциальных уравнениях в Python

Итак, как бы я подошел к написанию кода для оптимизации констант a и b в дифференциальном уравнении, например dy / dt = a * y ^ 2 + b, используя curve_fit? Я бы использовал odeint для решения ODE, а затем curve_fit для оптимизации a и b. Если бы вы могли, пожалуйста, внести свой вклад в эту ситуацию, я бы очень признателен!

  • Как нарисовать линию внутри участка рассеяния
  • эффективно находить интервал с не-нулями в scipy / numpy в Python?
  • Python: поиск нескольких корней нелинейного уравнения
  • Как я могу получить эффект «умного резкости» на моих изображениях с помощью python?
  • Как рассчитать статистику «t-test» с numpy
  • Линейная регрессия массивов, содержащих NAN в Python / Numpy
  • Как получить доступ к элементам numpy ndarray?
  • Эффективный расчет расстояния между N точками и ссылкой в ​​numpy / scipy
  • 3 Solutions collect form web for “Оптимизация констант в дифференциальных уравнениях в Python”

    Вам может быть лучше, если посмотреть на ODE с помощью Sympy . Scipy / Numpy являются фундаментально численными пакетами и на самом деле не созданы для выполнения алгебраических / символических операций.

    Вы определенно можете это сделать:

    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() 

    Чтобы конкретно решить эту проблему, я решил написать пакет-оболочку, который объединяет sympy и scipy . Это называется symfit . Соответствие вашему ODE будет выглядеть следующим образом:

     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() 

    Как вы можете видеть из того, как он определяется как dict, установка на системы ODE (первого порядка) не является проблемой. Узнайте больше о документах !

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