2017-07-26 8 views
1

私はMatlabのコードをPythonに持ってきています。 Iはnumpy.polyfit(x_cord、y_cord、3)を使用する場合Python/Numpyで3つの出力を持つMatlab polyval関数

x_cord = [58.2986 39.5842 23.0044 10.9427 3.0465] 
y_cord = [0.9600 0.9700 0.9800 0.9900 1.0000] 
[p,S,mu]=polyfit(x_cord, y_cord, 3); % p = [-0.002120716372462 0.004361710897014 -0.014104050472739 0.977080254892409] 
result=polyval(p, 16.574651718139650, [], mu); % result = 0.9848 

Iは、実施例では異なる結果を得ます。また、Numpyでpolyval(2つ以上の入力パラメータを持つ)を見つけることができませんでした。

MatlabとNumpyの結果は、1つのリターンパラメータを要求すると同じです。多項式をフィッティングのため

答えて

1

numpyのscipyのダウンロードと機能は自動的にMATLAB関数のように入力しないスケーリングのオプションが含まれていません。

まず、ここであなたは、スケーリングせずにデータを合うことができる方法は次のとおりです。

In [39]: x_cord = [58.2986, 39.5842, 23.0044, 10.9427, 3.0465] 

In [40]: y_cord = [0.9600, 0.9700, 0.9800, 0.9900, 1.0000] 

In [41]: c = np.polyfit(x_cord, y_cord, 3) 

In [42]: c 
Out[42]: 
array([ -1.91755884e-07, 2.43049234e-05, -1.52570960e-03, 
     1.00431483e+00]) 

In [43]: p = np.poly1d(c) 

In [44]: p(16.574651718139650) 
Out[44]: 0.98483061114799408 

In [45]: xx = np.linspace(0, 60, 500) 

In [46]: plot(xx, p(xx)) 
Out[46]: [<matplotlib.lines.Line2D at 0x110c8d0f0>] 

In [47]: plot(x_cord, y_cord, 'o') 
Out[47]: [<matplotlib.lines.Line2D at 0x10d6f8390>] 

plot

numpyの計算agrees with Wolfram Alpha


ここでは、実際のMatlab計算にかなり近づける方法を示します。

便宜上、x_cordをリストからnumpyの配列に変換してください。

In [64]: x_cord = np.array(x_cord) 

x_cordの平均および標準偏差を計算します。 x_cordのシフトおよびスケーリングされたバージョンを使用して

In [65]: mu = np.mean(x_cord) 

In [66]: std = np.std(x_cord, ddof=1) 

コールnp.polyfit()、。

In [67]: cscaled = np.polyfit((x_cord - mu)/std, y_cord, 3) 

これらの値は、MATLABコード内のコメントに示す配列pにかなり接近しています。

In [68]: cscaled 
Out[68]: array([-0.00212068, 0.00436168, -0.01410409, 0.97708027]) 

呼び出すことができるpoly1dオブジェクトを作成します。 pscaled

In [69]: pscaled = np.poly1d(cscaled) 

入力はシフトしmustdを用いてスケーリングしなければなりません。

In [70]: pscaled((16.574651718139650 - mu)/std) 
Out[70]: 0.98483061114799486 
+0

このような詳細な回答ありがとうございました。これは私を助けてくれました。 – Vants

関連する問題