我在Matlab中有需要带到Python的代码。
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
当我使用numpy.polyfit(x_cord,y_cord,3)时,我得到的结果与示例中的结果不同。另外,我在Numpy中找不到那种polyval(具有两个以上的输入参数)。
当我问一个返回参数时,Matlab和Numpy的结果是相同的。
拟合多项式的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>]
numpy计算与Wolfram Alpha一致。
这是您非常接近实际Matlab计算的方法。
为了方便起见,将x_cord
列表转换为numpy数组。
In [64]: x_cord = np.array(x_cord)
计算的均值和标准差x_cord
。
In [65]: mu = np.mean(x_cord)
In [66]: std = np.std(x_cord, ddof=1)
np.polyfit()
使用的缩放版本进行呼叫x_cord
。
In [67]: cscaled = np.polyfit((x_cord - mu)/std, y_cord, 3)
这些值非常接近p
Matlab代码的注释中显示的数组。
In [68]: cscaled
Out[68]: array([-0.00212068, 0.00436168, -0.01410409, 0.97708027])
创建一个poly1d
可以调用的对象。
In [69]: pscaled = np.poly1d(cscaled)
pscaled
必须使用mu
和转换和缩放输入std
。
In [70]: pscaled((16.574651718139650 - mu)/std)
Out[70]: 0.98483061114799486
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句