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

时间:2015-04-10 17:37:50

标签: python matlab python-2.7 numpy scipy

我将代码从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   ]

1 个答案:

答案 0 :(得分:0)

您的(反向)x数组没有增加(-0.00275 < -0.000935),应该正确使用np.interp1d。见the docs。没有发出警告。

我无法访问Matlab,但我猜测它会以不同方式处理此类情况。