Curve_Fit с полиномами переменной длины - PullRequest
0 голосов
/ 06 июня 2018

Я новичок в python (и программировании в целом) и хочу сделать подгонку полинома, используя curve_fit, где порядок полиномов (или количество параметров подгонки) является переменным.

Я сделал этот код, который работает для фиксированного числа из 3 параметров a,b,c

# fit function
def fit_func(x, a,b,c):
    p = np.polyval([a,b,c], x)
    return p

# do the fitting
popt, pcov = curve_fit(fit_func, x_data, y_data)

Но теперь я хотел бы, чтобы моя функция подгонки зависела только от числа N параметров вместоa,b,c,....

Полагаю, это не очень сложно сделать, но из-за моих ограниченных знаний я не могу заставить это работать.

Я уже рассмотрел этот вопрос , но я не смог применить его к своей проблеме.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Вы можете определить функцию, которая будет соответствовать вашим данным, следующим образом:

def fit_func(x, *coeffs):
    y = np.polyval(coeffs, x)
    return y

Затем, когда вы вызываете curve_fit, установите аргумент p0 в начальное предположение о полиномиальных коэффициентах.Например, этот график создается следующим сценарием.

plot

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


# Generate a sample input dataset for the demonstration.
x = np.arange(12)
y = np.cos(0.4*x)


def fit_func(x, *coeffs):
    y = np.polyval(coeffs, x)
    return y


fit_results = []
for n in range(2, 6):
    # The initial guess of the parameters to be found by curve_fit.
    # Warning: in general, an array of ones might not be a good enough
    # guess for `curve_fit`, but in this example, it works.
    p0 = np.ones(n)

    popt, pcov = curve_fit(fit_func, x, y, p0=p0)
    # XXX Should check pcov here, but in this example, curve_fit converges.

    fit_results.append(popt)


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

xx = np.linspace(x.min(), x.max(), 100)
for p in fit_results:
    yy = fit_func(xx, *p)
    plt.plot(xx, yy, alpha=0.6, label='n = %d' % len(p))

plt.legend(framealpha=1, shadow=True)
plt.grid(True)
plt.xlabel('x')
plt.show()
0 голосов
/ 07 июня 2018

Параметры polyval задают p как массив коэффициентов от самого высокого до самого низкого.С x является числом или массивом чисел для оценки многочлена в.Он говорит следующее:

Если p имеет длину N, эта функция возвращает значение:

p [0] * x ** (N-1) + p [1] * x ** (N-2) + ... + p [N-2] * x + p [N-1]

def fit_func(p,x):
    z = np.polyval(p,x)
    return z

например,

t= np.array([3,4,5,3])
y = fit_func(t,5)
503

что, если вы делаете математику здесь правильно.

...