python程序中的插值错误

时间:2015-06-03 11:57:50

标签: python scipy interpolation

from cmath import phase
import math
import numpy
import numpy as np
from numpy import unwrap
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
import scipy
from scipy import interpolate
from scipy.interpolate import interp1d
import scipy.signal.signaltools as sigtool

我有一个由以下代码生成的数据集。

for i in xrange(10000):
    v = i/10000.0

    if v < 0.25:
        k=0.4*(math.sin(2*3.14*90*v))
        l1.append(k)
    elif 0.25 <= v < 0.5:
        k=0.8*(math.sin(2*3.14*90*v))
        l2.append(k)
    elif 0.5 <= v < 0.75:
        k=0.6*(math.sin(2*3.14*300*v))
        l3.append(k)
    elif 0.75 <= v < 1.0:
        k=0.9*(math.sin(2*3.14*300*v))
        l4.append(k)


comb= l1+l2+l3+l4

k=[]

for i in range(len(comb)):
    i1=i/10000.
    k.append(i1)
    f.write(str(i1)+" "+(str(comb[i])+"\n"))

我使用以下代码找到局部最大值和局部最小值以及它们的相应位置:

loc_mx=[]
loc_mn=[]
loc_mnt=[]
loc_mxt=[]
for i in range(len(comb)-2):
    if comb[i] < comb[i+1]:
        if comb[i+1] > comb[i+2]:
            loc_mx.append(comb[i+1])
            loc_mxt.append(i+3)
    if comb[i] > comb[i+1]:
        if comb[i+1] < comb[i+2]:
            loc_mn.append(comb[i+1])
            loc_mnt.append(i+3)

使用以下代码

借助局部最大值和局部最小值对数据进行插值
loc_mn.append(comb[len(comb)-1])
loc_mx.append(comb[len(comb)-1])
loc_mnt.append(k[len(comb)-1])
loc_mxt.append(k[len(comb)-1])
loc_mn.reverse
loc_mx.reverse
loc_mn.append(comb[0])
loc_mx.append(comb[0])
loc_mnt.append(k[0])
loc_mxt.append(k[0])
loc_mn.reverse
loc_mx.reverse


min_mnt=min(loc_mnt)
min_mxt=min(loc_mxt)
max_mnt=max(loc_mnt)
max_mxt=max(loc_mxt)


x1=loc_mxt
y1=loc_mx
f1=interpolate.interp1d(x1,y1,kind="cubic")

x2=loc_mnt
y2=loc_mn
f2=interpolate.interp1d(x2,y2,kind="cubic")
f1(k)
f2(k)

我收到以下错误。

  File "emd.py", line 150, in <module>
    int_dt.write(str(k[i])+" "+str(f1(k[i]))+" "+str(f2(k[i])))
  File "/usr/lib/python2.7/dist-packages/scipy/interpolate/polyint.py", line 54, in __call__
    y = self._evaluate(x)
  File "/usr/lib/python2.7/dist-packages/scipy/interpolate/interpolate.py", line 448, in _evaluate
    out_of_bounds = self._check_bounds(x_new)
  File "/usr/lib/python2.7/dist-packages/scipy/interpolate/interpolate.py", line 475, in _check_bounds
    raise ValueError("A value in x_new is below the interpolation "
ValueError: A value in x_new is below the interpolation range.

非常感谢在这方面得到任何帮助。

1 个答案:

答案 0 :(得分:1)

插补器无法推断。

f1 = interpolate.interp1d(x1,y1,kind="cubic")

在域f1上定义[min(x1), max(x1)]

In [62]: [min(x1), max(x1)]
Out[62]: [30, 9982]
无法在此域外评估

f1。由于

In [63]: [min(k), max(k)]
Out[63]: [0.0, 0.9999]

f1(k[i])加注

ValueError: A value in x_new is below the interpolation range.

类似问题会影响f2(k[i]),因为k中的值再次位于[min(x2), max(x2)]之外。

相关问题