2016-07-13 38 views
1

我正面臨着aproximation多項式擬合的問題。我的問題更詳細的回顧顯示HERE。 基本上我想通過長時間的數學運算來獲得多項式的中間部分,如下所示。 enter image description here 我得到的想法是從多項式的末端(它的點)開始和範圍內取一個範圍,並做出一個近似多項式,它在中段沒有波動;選定的點如下所示。 enter image description here 但是通過使用polyfit函數,我並沒有完全得到我所希望的多項式。 enter image description here擬合給定數據的近似多項式

這我的代碼的關鍵部分:

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") 

我想就如何解決這個近似多項式問題或是否有另一種方式來解決中段揮舞一些建議 - 一個更好的平滑方式。 任何幫助,高度讚賞!

+0

您是否嘗試過增加多項式的順序? – gabra

+0

我想使用與原始多項式相同的近似多項式。這是平滑中段的想法,並最終比較它們的係數...... – mcluka

+0

很難找到一個多項式來跨越您的空間並重現該數據。分段多項式很容易。我會嘗試。 – duffymo

回答

4

您試圖將一個多項式擬合到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() 

enter image description here

+0

有沒有更好的方法來平滑多項式並解決一般的波動問題? – mcluka

+0

它取決於確切的設置,現有的約束,真實的,基本的目標和原因。你提出的擬合基於MSE,可能不是最優的。有許多可以使用的光滑度準則(特別是如果您可以留下多項式的空間)。其中一種典型的解決方案是用一些樣條曲線來簡單地「粘住」你想看起來不同的曲線的一部分。但正如我所說,現在一般來說這個問題還沒有得到明確定義,並且需要很多假設才能成爲我們可以「解決」而不是「接近」的事情:-) – lejlot

+0

我正在做這個主題的碩士學位,並通過一個數學程序和實驗數據我得到了外推多項式,它將適合所有給定實驗點的最好結果。然而,正如你可以看到[這裏](http://i.stack.imgur.com/FHDo5.png),更高等級的多項式(n = 4,n = 5)有這個問題,我想得到連續多項式沒有任何波動。我不知道如何修正原始的外推多項式,所以我在這裏想到了這個想法......但是如果您能夠向我推薦任何有助於此事的文獻或其他資料,我會很高興。謝謝! – mcluka