Сглаживание встроенной функции - PullRequest
1 голос
/ 14 марта 2019

Добрый день всем,

Я пытался сгладить подобранную мной функцию в качестве результата экспоненциального процесса подгонки. Строки кода, которые я использую, выглядят так:

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]) вполне разумны. Основная проблема заключается в том, что синяя линия (встроенная функция) не является гладкой . Я гуглил по поводу сглаживания функций, но я не нашел ничего, что относилось бы к встроенным функциям, и те, которые действуют на мои оригинальные наборы данных, такие как np.linspace() numpy, не помогают.

Большое спасибо всем, кто может помочь мне с этой задачей!

1 Ответ

4 голосов
/ 14 марта 2019

Итак, функция определенно плавная, так как это хорошая экспонента.Проблема в том, что вы наносите его на очень грубую сетку 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()

И у вас все должно получиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...