近似多项式拟合给定数据

mcl*_*uka 1 python math polynomial-math smoothing python-3.x

我面临着近似多项式拟合的问题。此处显示了对我的问题的更详细评论。基本上我想平滑我通过长时间数学运算得到的多项式的中间部分,如下所示。 在此处输入图片说明 我得到的想法是从多项式的开头和结尾取一个范围(它的点),并制作一个在中间部分没有波动的近似多项式;选定的点如下所示。 在此处输入图片说明 然而,通过使用该polyfit函数,我并没有得到我所希望的多项式。 在此处输入图片说明

这是我的代码的关键部分:

from sympy import*
import numpy as np
init_printing()
%matplotlib inline
import matplotlib.pyplot as plt

S = np.linspace(25, 400, 1000)
SS = np.log10(S)
def f(logS): # the polynomial that I got
    return 10**(-57.2476193068601*logS**5 + 585.900632193053*logS**4 - 2384.35277925916*logS**3 + 4821.25582425353*logS**2 - 4845.47249368281*logS + 1943.75303313331)  

xdata = f(SS)
ydata = S

plt.figure(figsize=(12, 10), dpi= 600, facecolor='w', edgecolor='k')

plt.loglog(xdata, ydata,'k-')
# Data for new polynomial (approximation)
XX = xdata[:40].tolist()
X1 = xdata[len(xdata)-350:].tolist()
YY = ydata[:40].tolist()
Y1 = ydata[len(ydata)-350:].tolist()
for i in range(len(X1)):
    XX.append(X1[i])
    YY.append(Y1[i])

# Approximation polynomial fit
plt.loglog(XX,YY,'mo')
x_t = np.linspace(np.min(xdata), np.max(xdata),1000)
p = np.poly1d(np.polyfit(XX,YY, deg=5))

plt.loglog(x_t, p(x_t),'g-')
print(p)

plt.ylim((np.min(ydata), np.max(ydata)))
plt.xlim((np.min(xdata), np.max(xdata)*0.7))  

plt.xlabel('xdata')
plt.ylabel('ydata')
plt.grid(True, which="both")
Run Code Online (Sandbox Code Playgroud)

我想要一些关于如何解决这个近似多项式问题的建议,或者是否有另一种方法来解决中间部分的波动 - 一种更好的平滑方法。任何帮助表示高度赞赏!

lej*_*lot 5

您正在尝试在 exp-exp 尺度的常规数据上拟合多项式,并且仅将其绘制在 log-log 中,它看起来像一个多项式。您将无法用多项式表示这种关系。首先将所有内容预处理为对数刻度,在那里拟合多项式,如果您想回到 exp-exp 世界,请再次进行后处理。

from sympy import*
import numpy as np
import matplotlib.pyplot as plt

S = np.linspace(25, 400, 1000)
SS = np.log10(S)
def f(logS): # the polynomial that I got
    return 10**(-57.2476193068601*logS**5 + 585.900632193053*logS**4 - 2384.35277925916*logS**3 + 4821.25582425353*logS**2 - 4845.47249368281*logS + 1943.75303313331)  



xdata = np.log(f(SS))
ydata = np.log(S)

plt.figure(figsize=(12, 10),facecolor='w', edgecolor='k')
plt.plot(xdata, ydata, 'k-')
#plt.loglog(xdata, ydata,'k-')
# Data for new polynomial (approximation)
XX = xdata[:40].tolist()
X1 = xdata[len(xdata)-350:].tolist()
YY = ydata[:40].tolist()
Y1 = ydata[len(ydata)-350:].tolist()
for i in range(len(X1)):
    XX.append(X1[i])
    YY.append(Y1[i])


# Approximation polynomial fit
#plt.loglog(XX,YY,'mo')
x_t = np.linspace(np.min(xdata), np.max(xdata),1000)
p = np.poly1d(np.polyfit(XX,YY, deg=5))

#plt.loglog(x_t, p(x_t),'g-')
plt.plot(x_t, p(x_t),'g-')
print(p)

plt.ylim((np.min(ydata), np.max(ydata)))
plt.xlim((np.min(xdata), np.max(xdata)))  

plt.xlabel('xdata')
plt.ylabel('ydata')
plt.grid(True, which="both")
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明