Почему Curve_fit Scipy не дает правильного результата для следующих проблем? - PullRequest
0 голосов
/ 08 мая 2020

Код:

from scipy.optimize import curve_fit
import numpy as np
from numpy import *


def func(x, a, b): 
    return ff(x,a,b) 


ff= lambda x,a,b: eval("1/(a*x+b)")

xdata = [1 ,2, 4, 6, 8, 10]
ydata = [0.22, 0.1, 0.06, 0.04, 0.03, 0.024]

popt, pcov = curve_fit(func, xdata, ydata)
print('\n', '[a b] for the best fit =    ', popt,'\n')

при запуске он дает

 [a b] for the best fit =     [ 4.62673137 -0.04794652]

Между тем, согласно моему научному калькулятору c (или решив это вручную), ответ должен быть:

 [a b] for the best fit =     [ 0.9232 4.05396]

Я неоднократно тестировал программу, это не единственный пример, в котором она не дает правильных результатов.

1 Ответ

0 голосов
/ 08 мая 2020

Я проверил ваши расчеты:

import matplotlib.pyplot as plt
plt.scatter(xdata, ydata)
plt.scatter(xdata, func(np.array(xdata), 4.62673137, -0.04794652), c='r')
plt.scatter(xdata, func(np.array(xdata), 0.9232, 4.05396), c='g')
plt.show()

и обнаружил, что curve_fit() дает хорошо подходящие параметры. Проблема связана с вашим другим решением.

Предложения:

Не используйте from X import *. В некоторых случаях это затрудняет управление кодом.

Не используйте eval(), если он вам не нужен. В этом случае:

def func(x, a, b):
    return 1. / (a * x + b)

короче и понятнее.

...