Python和Matlab插值函数的结果不同(Different results with Python and Matlab interpolation functions)

编程入门 行业动态 更新时间:2024-10-18 18:17:50
Python和Matlab插值函数的结果不同(Different results with Python and Matlab interpolation functions)

我正在将代码从Matlab转换为Python 2.7,并且我对interp1函数的转换有问题。 我已经查看了已经发布的类似问题,但还没有设法解决它。 问题是新生成的值(yn)的向量的第一个值是不同的,而其余的几乎相同。 我使用不同的插值方法时会得到略有不同的值,但问题相同。 目前我真的不知道为什么会这样。 有没有人对此有任何见解或看到我可能犯的任何错误? 谢谢。

变量:

x = [5.5 , 5.46678 , 5.408315, 5.33929 , 5.261025, 5.17605 , 5.08684 , 4.995375, 4.902755, 4.80942 , 4.7157 , 4.621815, 4.52782 , 4.433715, 4.339555, 4.245395, 4.151235, 4.05713 , 3.962915, 3.868645, 3.77432 , 3.680105, 3.585945, 3.491895, 3.397845, 3.303905, 3.21002 , 3.11619 , 3.02247 , 2.928805, 2.835195, 2.741695, 2.64836 , 2.55519 , 2.462295, 2.36951 , 2.27689 , 2.184435, 2.092255, 2.00035 , 1.908775, 1.817475, 1.726505, 1.63592 , 1.54583 , 1.4564 , 1.36752 , 1.279245, 1.19163 , 1.10539 , 1.02135 , 0.94006 , 0.86163 , 0.786115, 0.713515, 0.64394 , 0.577555, 0.514635, 0.45562 , 0.400785, 0.35035 , 0.304425, 0.26301 , 0.22627 , 0.193875, 0.16544 , 0.14058 , 0.118745, 0.09944 , 0.082335, 0.067265, 0.05401 , 0.042405, 0.03234 , 0.023595, 0.01628 , 0.010175, 0.00528 , 0.001485, -0.00121 , -0.002805, -0.003355, -0.00275 , -0.000935] y = [0.19896, 0.18722, 0.155 , 0.13133, 0.11168, 0.09543, 0.0815 , 0.06556, 0.04191, 0.0117 , 0.00513, 0.00123, -0.0036 , -0.00885, -0.01429, -0.01985, -0.02532, -0.03065, -0.03574, -0.04082, -0.04594, -0.05104, -0.05596, -0.06091, -0.06561, -0.07023, -0.07482, -0.07913, -0.08341, -0.08749, -0.09155, -0.09551, -0.09952, -0.10334, -0.10694, -0.11011, -0.11319, -0.11587, -0.11856, -0.12092, -0.12277, -0.12428, -0.12506, -0.12567, -0.12567, -0.12497, -0.12369, -0.12135, -0.11944, -0.1191 , -0.11983, -0.11819, -0.11197, -0.10004, -0.08016, -0.05285, -0.01569, 0.03055, 0.08527, 0.1492 , 0.21971, 0.29507, 0.37453, 0.45682, 0.53766, 0.61562, 0.6916 , 0.763 , 0.82907, 0.88665, 0.9367 , 0.97418, 0.99617, 0.99807, 0.97457, 0.91708, 0.81796, 0.66987, 0.46359, 0.19778, -0.13378, -0.54232, -1.0126 , -1.5297 ] xn = [ 0., 0.61111111, 1.22222222, 1.83333333, 2.44444444, 3.05555556, 3.66666667, 4.27777778, 4.88888889, 5.5 ]

Matlab代码:

yn_mat = interp1(x,y,xn,'linear','extrap')

Python代码:

from scipy.interpolate import InterpolatedUnivariateSpline yn_f1 = InterpolatedUnivariateSpline(x[::-1], y[::-1]) yn_py1 = yn_f1(xn) from scipy.interpolate import interp1d yn_f2 = interp1d(x[::-1], y[::-1]) yn_py2 = yn_f2(xn) import numpy as np yn_py3 = np.interp(xn, x[::-1], y[::-1])

结果:

yn_mat = [-0.7596, -0.0345, -0.1201, -0.1240, -0.1075, -0.0819, -0.0517, -0.0179, 0.0374, 0.1990 ] yn_py1 = [-0.23310355, -0.03594415, -0.11996893, -0.12406894, -0.10757466, -0.08191329, -0.05174936, -0.01793778, 0.0371338 , 0.19896 ] yn_py2 = [ 0.31712327, -0.03447354, -0.12010691, -0.12401772, -0.10754986, -0.08189905, -0.05174217, -0.01793785, 0.03742192, 0.19896 ] yn_py3 = [ 0.31712327, -0.03447354, -0.12010691, -0.12401772, -0.10754986, -0.08189905, -0.05174217, -0.01793785, 0.03742192, 0.19896 ]

I'm converting code from Matlab to Python 2.7 and am having a problem with the conversion of the interp1 function. I have looked at similar questions already posted but have not yet managed to solve it. The problem is that the first value of the vector of newly generated values (yn) is different while the rest are almost identical. I get slightly different values but the same problem when using different interpolation methods. At the moment I really have no clue why this is. Does anyone have any insight into this or see any errors I might have made? Thanks.

Variables:

x = [5.5 , 5.46678 , 5.408315, 5.33929 , 5.261025, 5.17605 , 5.08684 , 4.995375, 4.902755, 4.80942 , 4.7157 , 4.621815, 4.52782 , 4.433715, 4.339555, 4.245395, 4.151235, 4.05713 , 3.962915, 3.868645, 3.77432 , 3.680105, 3.585945, 3.491895, 3.397845, 3.303905, 3.21002 , 3.11619 , 3.02247 , 2.928805, 2.835195, 2.741695, 2.64836 , 2.55519 , 2.462295, 2.36951 , 2.27689 , 2.184435, 2.092255, 2.00035 , 1.908775, 1.817475, 1.726505, 1.63592 , 1.54583 , 1.4564 , 1.36752 , 1.279245, 1.19163 , 1.10539 , 1.02135 , 0.94006 , 0.86163 , 0.786115, 0.713515, 0.64394 , 0.577555, 0.514635, 0.45562 , 0.400785, 0.35035 , 0.304425, 0.26301 , 0.22627 , 0.193875, 0.16544 , 0.14058 , 0.118745, 0.09944 , 0.082335, 0.067265, 0.05401 , 0.042405, 0.03234 , 0.023595, 0.01628 , 0.010175, 0.00528 , 0.001485, -0.00121 , -0.002805, -0.003355, -0.00275 , -0.000935] y = [0.19896, 0.18722, 0.155 , 0.13133, 0.11168, 0.09543, 0.0815 , 0.06556, 0.04191, 0.0117 , 0.00513, 0.00123, -0.0036 , -0.00885, -0.01429, -0.01985, -0.02532, -0.03065, -0.03574, -0.04082, -0.04594, -0.05104, -0.05596, -0.06091, -0.06561, -0.07023, -0.07482, -0.07913, -0.08341, -0.08749, -0.09155, -0.09551, -0.09952, -0.10334, -0.10694, -0.11011, -0.11319, -0.11587, -0.11856, -0.12092, -0.12277, -0.12428, -0.12506, -0.12567, -0.12567, -0.12497, -0.12369, -0.12135, -0.11944, -0.1191 , -0.11983, -0.11819, -0.11197, -0.10004, -0.08016, -0.05285, -0.01569, 0.03055, 0.08527, 0.1492 , 0.21971, 0.29507, 0.37453, 0.45682, 0.53766, 0.61562, 0.6916 , 0.763 , 0.82907, 0.88665, 0.9367 , 0.97418, 0.99617, 0.99807, 0.97457, 0.91708, 0.81796, 0.66987, 0.46359, 0.19778, -0.13378, -0.54232, -1.0126 , -1.5297 ] xn = [ 0., 0.61111111, 1.22222222, 1.83333333, 2.44444444, 3.05555556, 3.66666667, 4.27777778, 4.88888889, 5.5 ]

Matlab code:

yn_mat = interp1(x,y,xn,'linear','extrap')

Python code:

from scipy.interpolate import InterpolatedUnivariateSpline yn_f1 = InterpolatedUnivariateSpline(x[::-1], y[::-1]) yn_py1 = yn_f1(xn) from scipy.interpolate import interp1d yn_f2 = interp1d(x[::-1], y[::-1]) yn_py2 = yn_f2(xn) import numpy as np yn_py3 = np.interp(xn, x[::-1], y[::-1])

Results:

yn_mat = [-0.7596, -0.0345, -0.1201, -0.1240, -0.1075, -0.0819, -0.0517, -0.0179, 0.0374, 0.1990 ] yn_py1 = [-0.23310355, -0.03594415, -0.11996893, -0.12406894, -0.10757466, -0.08191329, -0.05174936, -0.01793778, 0.0371338 , 0.19896 ] yn_py2 = [ 0.31712327, -0.03447354, -0.12010691, -0.12401772, -0.10754986, -0.08189905, -0.05174217, -0.01793785, 0.03742192, 0.19896 ] yn_py3 = [ 0.31712327, -0.03447354, -0.12010691, -0.12401772, -0.10754986, -0.08189905, -0.05174217, -0.01793785, 0.03742192, 0.19896 ]

最满意答案

您的(反向) x数组没有增加( -0.00275 < -0.000935 ),这应该是正确使用np.interp1d 。 查看文档 。 没有发出警告。

我无法访问Matlab,但我猜它会以不同的方式处理这种情况。

Your (reversed) x array is not increasing (-0.00275 < -0.000935) which is should be to use np.interp1d properly. See the docs. No warning is issued.

I don't have access to Matlab, but I'm guessing that it handles such cases differently.

更多推荐

本文发布于:2023-07-25 05:46:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1256823.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:函数   插值   Matlab   Python   interpolation

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!