#python #numpy #scipy
#python #numpy #scipy
Вопрос:
Добрый день всем,
Я пытался сгладить подогнанную функцию, которая у меня есть на выходе экспоненциального процесса подгонки. Строки кода, которые я использую, выглядят следующим образом:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
x = (0.005, 0.025, 0.05, 0.075, 0.1)
y = (1.0, 0.7261356155365372, 0.5170068027210885, 0.3651525126179504, 0.26135615536537193)
plt.plot(x, y, "r")
x = np.array(x, dtype=float)
y = np.array(y, dtype=float)
def func(x, a, b):
return a * np.exp(-b * x)
popt, pcov = curve_fit(func, x, y)
print(popt[0], popt[1])
plt.plot(x, func(x, *popt), "b")
plt.legend(loc='best')
plt.show()
Результат математически удовлетворительный, и мои подогнанные значения print(popt[0], popt[1])
совершенно разумны. Основная проблема заключается в том, что синяя линия (подогнанная функция) не является гладкой. Я поискал в Google информацию о сглаживании функций, но не нашел ничего, что применимо к подогнанным функциям, а те, что действуют на мои исходные наборы данных, такие как numpy np.linspace()
, не помогают.
Большое спасибо всем, кто может помочь мне с этой задачей!
Ответ №1:
Итак, функция определенно гладкая, поскольку это хорошая экспоненциальная. Проблема в том, что вы строите ее на очень грубой сетке x
. Конечно, вы хотите сохранить x
фиксированный результат при подгонке кривой, поскольку эти значения x
соответствуют вашим известным наблюдениям y
. Но мы можем использовать другой домен при построении графика следующим образом.
Замените строки, начинающиеся с plt.plot
, на:
new_x = np.linspace(0, 0.1) # or whatever domain you like
plt.plot(new_x, func(new_x, *popt), "b")
plt.legend(loc='best')
plt.show()
И у вас должно получиться.
Комментарии:
1. хорошее объяснение
2. Я думаю, что так и должно быть
plt.plot(new_x, func(new_x, *popt), "b")
, не так ли?3. Ах, извините, у меня была опечатка! Забыл указать
new_x
в качестве аргументаfunc
— Я отредактировал свой ответ, чтобы отразить это4. Чарли Виндолф творит чудеса! Также спасибо @Flob за указание на опечатку, я собирался прокомментировать это, потому что получал странную ошибку.
5. @CharlieWindolf сам заметил это еще до того, как я закончил вводить свой комментарий, так что вся похвала ему 😉