2016-07-07 13 views
2

私が持っているデータは、常に二次多項式(二次関数)です。私は補間された関数のピークを可能な限り正確に見つけたいと思います。 データを補間してピークを見つける最も正確な方法は?

Data sample points

は、これまでのところ私は interp1dを使用してきたし、その後 linspaceとシンプルな forループを使用して、ピーク値を抽出します。 linspaceに多数の新しく生成されたサンプルを使用することはできますが、フィッティングされた多項式の導関数を使用してさらに正確にすることはできます。
私は interp1dを使ってそれを行う方法を見つけられませんでした。

フィッティングした多項式係数を返す唯一の関数はpolyfitですが、この適合関数はかなり不正確です(ほとんどの場合、関数はデータポイントを通過しない)。

<code>interp1d</code> and <code>polyfit</code> functions

私はUnivariateSplineを使用して試してみたと当てはめ関数は非常に正確であるように思わ、派生スプラインとその根を得ることは非常に簡単です。

他の多項式フィッティング関数(BarycentricInterpolatorKroghInterpolator、...)は、数値安定性の理由から多項式係数を計算していないことを示しています。

UnivariateSplineとその派生の正確さはどの程度正確ですか?

答えて

0

私はpolyfitと一緒に行った最後にします。フィットされた機能はデータポイントを正確には通過しませんでしたが、最終結果はまだ良好でした。返された係数から、私はピークの望ましいx座標とy座標を得ました。

1

あなたが必要とするすべてはこれをしない理由は二次多項式の最小/最大見つけることがある場合:

import matplotlib.pyplot as plt 
from scipy.interpolate import KroghInterpolator 
import numpy as np 

x=range(-20,20) 
y=[] 
for i in x: 
    y.append((i**2)+25) 

x=x[1::5] 
y=y[1::5] 

f=KroghInterpolator(x,y) 
xfine=np.arange(min(x),max(x),.5) 
yfine=f(xfine) 

val_interp=min(yfine) 
print val_interp 

plt.scatter(x,y) 
plt.plot(xfine, yfine) 
plt.show() 
+0

しかし、この方法は依然として 'np.arange'のステップサイズに依存します。この場合は_0.5_です。私はフロート/倍精度に二次関数の最大値を取得したいと思います。 –

+0

@TjazBrelih浮動小数点精度を与えます。 'y.append((i ** 2)+25)'を 'y.append((i ** 2)+25.086)'に変更します。次に、プログラムを実行します。 0.5間隔での補間では、渡された元のデータにその値が存在しないにもかかわらず、最小値が検出されます。 –

+0

これは、関数がx軸に沿ってシフトされていない場合にのみ機能します。あなたが 'y.append((i ** 2)+25)'を 'y.append(((i + 0.2)** 2)+25)'に変更すると、真のピークが見つからず、最大/補間された関数の最小値は_0.5_の間隔でサンプリングされます。 –