Сглаживание подогнанной функции

#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 сам заметил это еще до того, как я закончил вводить свой комментарий, так что вся похвала ему 😉