Как выполнить подгонку по нелинейной кривой, используя Python с определенной пользователем функцией? - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть следующий набор данных:

x = 2.5, 5, 7.5, 10, 20, 30

y = 18035.21768722, 18176.09871938, 18370.22289623, 18430.68522672, 18490.76110193, 18512.69861061

Теперь я хочу построить эти данные и сопоставить этот набор данных с моей определенной функцией f(x) = (A*K*x/1+K*x) и найти параметры A и K?

Я написал следующий скрипт python, но кажется, что он не может выполнить то, что мне нужно:

import matplotlib.pyplot as plt

import numpy as np

from scipy.optimize import curve_fit

x = np.array([2.5, 5, 7.5, 10, 20, 30])

y = np.array([18035.21768722, 18176.09871938, 18370.22289623, 18430.68522672, 18490.76110193, 18512.69861061])

def func(x, A, K):

    return (A*K*x / 1+K*x)

plt.plot(x, y, 'b-', label='data')


popt, pcov = curve_fit(func, x, y)

plt.plot(x, func(x, *popt), 'r-', label='fit')

plt.xlabel('x')

plt.ylabel('y')

plt.legend()

plt.show()

Может кто-нибудь помочь мне с изменениями в скрипте python или новый скрипт, в котором я могу правильно подобрать данные с помощью желаемой функции подгонки?

1 Ответ

0 голосов
/ 14 апреля 2020

Попробуйте исправить определение вашей функции, как было предложено туманностью HS в комментариях, и добавьте начальное предположение для k, используя аргумент p0 в curve_fit:

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


x = np.array([2.5, 5, 7.5, 10, 20, 30])
y = np.array([18035.21768722, 18176.09871938, 18370.22289623, 18430.68522672, 18490.76110193, 18512.69861061])


def func(x, A, K):
    return A*K*x / (1+K*x)


plt.plot(x, y, 'b-', label='data')

popt, pcov = curve_fit(func, x, y, p0=[1, 1e6])

plt.plot(x, func(x, *popt), 'r-', label='fit')

plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

enter image description here

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