2016-07-13 5 views
1

近似多項式近似に問題があります。私の問題の詳細なレビューは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

1つの多項式を見つけて空間を広げ、そのデータを再現するのは難しいでしょう。区分的多項式で簡単です。私はそれを試みるだろう。 – 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に基づいていますが、これは最適ではない可能性があります。多くの可能な滑らかさの基準があります(特に多項式の空間を残すことができる場合)。典型的な解決法の1つは、あなたが異なって見たいと思っているカーブの一部を単純に「スティック」するために、代わりにスプラインを使うことです。しかし、私が言ったように、一般的に問題は未定義であり、 "アプローチ"ではなく "解決"できるものがたくさんあることを前提としています:-) – lejlot

+0

私はこのテーマと数学的手順を通して実験データ私はすべての与えられた実験点で最良に適合する外挿された多項式を得ました。しかし、あなたは[ここ](http://i.stack.imgur.com/FHDo5.png)を見ることができますが、より高級な多項式(n = 4、n = 5)はこの問題を抱えています。変動のない連続多項式。元の外挿された多項式を修正する方法はわからないので、私はここでこのアイデアに着きました...しかし、この問題に関して助けになる文献やその他の情報源を私に提案できれば嬉しいです。ありがとう! – mcluka