fit_curve1.py 944 B

12345678910111213141516171819202122232425262728293031
  1. """Fitting a curve to a dataset"""
  2. import numpy as np
  3. from scipy.optimize import curve_fit
  4. from vedo.pyplot import plot
  5. from vedo import settings
  6. def func(x, h, a, x0, k):
  7. return h + a * (x-x0) * np.sin((x-x0)**2 / k)
  8. # generate simulated data
  9. xdata = np.linspace(3, 10, 80)
  10. true_params = [20, 2, 8, 3]
  11. ydata_true = func(xdata, *true_params)
  12. ydata = np.random.normal(ydata_true, 3, 80)
  13. fit_params, pcov = curve_fit(func, xdata, ydata, p0=[19, 3, 8, 2.5])
  14. ydata_fit = func(xdata, *fit_params)
  15. print("true params = ", true_params)
  16. print("fit params = ", fit_params)
  17. settings.default_font = "ComicMono"
  18. settings.remember_last_figure_format = True # when adding with p += ...
  19. p = plot(xdata, ydata, "o", mc="blue2", title=__doc__, label="Data")
  20. p += plot(xdata, ydata_true, "-g", lw=2, label="Ground Truth")
  21. p += plot(xdata, ydata_fit, "-r", lw=4, label="Fit")
  22. p.add_legend(pos="bottom-right")
  23. p.show(size=(900, 650), zoom="tight")