简体   繁体   English

Python和Matlab插值函数的结果不同

[英]Different results with Python and Matlab interpolation functions

I'm converting code from Matlab to Python 2.7 and am having a problem with the conversion of the interp1 function. 我正在将代码从Matlab转换为Python 2.7,而interp1函数的转换存在问题。 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. 问题在于,新生成的值(yn)的向量的第一个值不同,而其余几乎相同。 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: Matlab代码:

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

Python code: 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])

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   ]

Your (reversed) x array is not increasing ( -0.00275 < -0.000935 ) which is should be to use np.interp1d properly. 您的(反向) x数组没有增加( -0.00275 < -0.000935 ),应该正确使用np.interp1d See the docs . 请参阅文档 No warning is issued. 没有发出警告。

I don't have access to Matlab, but I'm guessing that it handles such cases differently. 我没有使用Matlab的权限,但是我猜想它对这种情况的处理方式有所不同。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM