У меня есть наборы данных с именами E
и V
, а также функция.Эта функция принимает V и 4 параметра в качестве входа.Параметры E0
и V0
должны быть минимальными значениями функции.
Для подгонки кривой я дал несколько начальных значений параметров.E0
и V0
приведены как минимальные значения соответствующих наборов данных.Теоретическое значение B0
должно быть 28, поэтому я дал ему это, и я даю случайное значение для B1
.
После подгонки кривой я пытаюсь получить минимум функции и найти E0
и V0
.Значения, которые я получаю, кажутся нормальными.Затем я строю свои данные и определяю функцию.Результаты Curve_fit не совпадают с моими данными.Я думаю, что проблема в подходящей части, но я не уверен.E
и V
- это мои экспериментальные результаты, и я знаю, что с ними ничего нет.
Вот код:
from scipy.optimize import curve_fit
from scipy.optimize import fmin
import matplotlib.pylab as plt
V = np.array([9359.78033951, 10835.11571553, 12457.86763189, 14235.05592385, 16173.70042667, 18280.82097561, 20563.43740591, 23028.56955282, 25683.23725162, 28534.46033754, 31589.25864585])
E = np.array([12.73271364, 10.56261464, 8.21189843, 5.67853559, 3.18963332, 1.76136256,2.35816986, 5.01274293, 9.64990078, 16.22373202, 24.7102355])
E0 = min(E)
V0 = min(V)
print(V0,E0)
def func(V, E0, V0, B0, B1):
return E0 + B0*V/B1 * (((V0/V)**B1)/(B1-1) + 1);
p0 = [E0, V0, 28, 100]
params, param2 = curve_fit(func, V, E, p0)
V0_new = fmin(func, V0, args=(params[0], params[1], params[2], params[3]))
E0_new = func(V, params[0], V0_new, params[2], params[3])
for ii in range(len(V)):
plt.plot(V, E, '-k')
plt.plot(V[ii], func(V[ii], params[0], params[1], params[2], params[3]), 'or')
После некоторых запусков я начал получать эту ошибку:
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-14-ec759702af45> in <module>
6
7 p0 = [E0, V0, 28, 100]
----> 8 params, param2 = curve_fit(func, V, E, p0)
9
10 V0_new = fmin(func, V0, args=(params[0], params[1], params[2], params[3]))
/anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, jac, **kwargs)
753 cost = np.sum(infodict['fvec'] ** 2)
754 if ier not in [1, 2, 3, 4]:
--> 755 raise RuntimeError("Optimal parameters not found: " + errmsg)
756 else:
757 # Rename maxfev (leastsq) to max_nfev (least_squares), if specified.
RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 1000.
А теперь я даже не получаю значения после оптимизации.Любая помощь приветствуется.
Редактировать Мне каким-то образом удалось получить фигуру снова.Вы видите, что точки не соответствуют данным.
fig.png
Edit2 Я продолжаю запускать скрипт, и иногда я получаю эту ошибкуи это не даст мне никаких параметров ...
Warning: Maximum number of function evaluations has been exceeded.
Так что мне нужно исправить эту проблему максимальной оценки, а затем найти способ получить правильные параметры, которые соответствуютданные правильно.