Scipy curve_fit не подходит к простой экспоненте - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь найти простое экспоненциальное соответствие для некоторых данных, используя scipy curve_fit, и в результате получается экспонента, которая на много порядков слишком велика

import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import math
import numpy as np




cases_DE = [16,18,26,48,74,79,130,165,203,262,545,670,800,1040,1224,1565,1966,2745,3675,4599,5813, 7272, 9367, 12327]

def simple_DE(A,c,t):
    return A*math.e**(c*t)

range_thing = np.array(range(len(cases_DE)))

popt, pcov = curve_fit(simple_DE, range_thing, cases_DE, bounds=((-np.inf, 0), (np.inf, 1)))

print(popt)

plt.scatter(range_thing, simple_DE(*popt, range_thing))
plt.scatter(range_thing, cases_DE)
print(simple_DE(*popt, 20))
plt.xlabel('x')
plt.ylabel('y')

plt.show()

Может кто-нибудь показать мне, где я пошло не так?

1 Ответ

2 голосов
/ 19 марта 2020

Кажется, вы перепутали порядок параметров. Функция, переданная в curve_fit, должна иметь следующую сигнатуру:

Она должна принимать независимую переменную в качестве первого аргумента, а параметры - в качестве отдельных оставшихся аргументов: ydata = f(xdata, *params) + eps.

Таким образом, вам нужно изменить порядок аргументов вашей simple_DE функции:

def simple_DE(t, A, c):
    ...

И аналогично при построении подгонки:

plt.scatter(range_thing, simple_DE(range_thing, *popt))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...