Проблема одномерной интерполяции данных с помощью SCIPY

#python #scipy #interpolation

#python #scipy #интерполяция

Вопрос:

У меня возникла странная проблема при попытке интерполировать данные с помощью функции одномерной интерполяции. Интерполяция через все точки (s = 0) и функцию сплайна не дает результата для всего набора данных. Результат для s> = 1 также очень странный. Поскольку я думаю, что это связано с данными, которые я использую, я присоединяюсь к ним в приложении.
Я застрял, поэтому, если у кого-нибудь есть хорошая идея по решению, я буду очень признателен.

Спасибо,

здесь часть кода:

 import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline

def openfile(infilename):
    ifile = open(infilename, 'r') # open file for reading
    lines = ifile.readlines()
    ifile.close()
    return lines

def extractData(lines):
    data=[]
    CV=[]

    for i in range(len(lines)):
        item=lines[i].split()
        for j in range(len(item)):
            item[j]=float(item[j])
            data.append(item[j])

    CV=np.array(data)
    CV.shape = (len(CV)/3,3)
    return CV

if __name__ == "__main__":

    lines=openfile("D:capamosLOCOScap15L1_rec_mod.csv")
    CV=extractData(lines)
    Vg1=CV[:,0]
    C1=CV[:,1]
    Cmax=C1.max()
    Cmin=C1.min()
    S=0.002
    Cfb=compute(Cmax,Cmin,S) #compute the flat band capacitance
    print "Cfb=",Cfb

    splineCV= UnivariateSpline(Vg1,C1,s=0)
    x = linspace(-5, 5, 1000)   # just to draw the spline function
    y=splineCV(x)
    Vfb=splineCV(Cfb)  # find the flat band voltage at Cfb
    print "Vfb=",Vfb
    print y

    plt.figure(1)
    p1=plot(Vg1,C1,'b',label='edge')
    p2=plot(x,y,'g')
    plt.axis([-6,6,1e-11,80e-12])
  

И здесь данные:

 5   6.35E-011   -4.79E-010
4.95    6.35E-011   -1.91E-010
4.9 6.35E-011   -2.19E-010
4.85    6.35E-011   -4.57E-010
4.8 6.35E-011   -1.24E-010
4.75    6.35E-011   -3.50E-010
4.7 6.35E-011   -4.15E-010
4.65    6.34E-011   2.37E-010
4.6 6.35E-011   -2.84E-010
4.55    6.34E-011   -2.18E-010
4.5 6.35E-011   1.90E-010
4.45    6.34E-011   -7.71E-011
4.4 6.34E-011   -6.89E-010
4.35    6.34E-011   -2.79E-010
4.3 6.33E-011   -3.37E-010
4.25    6.33E-011   -4.32E-010
4.2 6.33E-011   -7.29E-010
4.15    6.33E-011   -2.17E-012
4.1 6.33E-011   1.62E-010
4.05    6.32E-011   -1.63E-010
4   6.32E-011   -2.73E-010
3.95    6.33E-011   -9.93E-011
3.9 6.32E-011   1.77E-010
3.85    6.32E-011   -3.26E-010
3.8 6.32E-011   -2.47E-010 
3.75    6.32E-011   -1.59E-010
3.7 6.30E-011   -1.03E-010
3.65    6.30E-011   -7.15E-011
3.6 6.31E-011   -3.02E-010
3.55    6.30E-011   2.52E-010
3.5 6.31E-011   -2.98E-010
3.45    6.29E-011   -1.21E-010
3.4 6.29E-011   -1.97E-010
3.35    6.29E-011   -6.97E-011
3.3 6.29E-011   -1.68E-010
3.25    6.28E-011   2.52E-010
3.2 6.28E-011   -2.66E-010
3.15    6.28E-011   -6.52E-010
3.1 6.27E-011   2.78E-011
3.05    6.27E-011   -4.69E-010
3   6.27E-011   -2.63E-010
2.95    6.26E-011   -3.00E-010
2.9 6.26E-011   -2.23E-010
2.85    6.25E-011   -4.05E-010
2.8 6.25E-011   -2.68E-010
2.75    6.25E-011   -5.19E-010
2.7 6.23E-011   9.14E-011
2.65    6.24E-011   -5.05E-010
2.6 6.22E-011   -4.39E-010
2.55    6.21E-011   -4.11E-010
2.5 6.21E-011   1.71E-010
2.45    6.20E-011   2.35E-010
2.4 6.19E-011   -1.20E-010
2.35    6.18E-011   -9.91E-012
2.3 6.18E-011   -6.99E-011
2.25    6.17E-011   -2.35E-010
2.2 6.15E-011   -6.35E-010
2.15    6.14E-011   -2.10E-010
2.1 6.13E-011   -3.70E-010
2.05    6.11E-011   -2.89E-010
2   6.10E-011   1.06E-010
1.95    6.09E-011   -3.23E-010
1.9 6.07E-011   1.37E-010
1.85    6.05E-011   -2.40E-010
1.8 6.03E-011   -1.04E-010
1.75    6.00E-011   -1.72E-010
1.7 5.98E-011   -4.59E-011
1.65    5.96E-011   -4.71E-010
1.6 5.91E-011   -4.40E-010
1.55    5.88E-011   -2.11E-010
1.5 5.84E-011   -3.97E-010
1.45    5.78E-011   -1.37E-010
1.4 5.74E-011   -2.56E-010
1.35    5.66E-011   -3.33E-010  
1.3 5.58E-011   -1.61E-011
1.25    5.50E-011   -3.73E-011
1.2 5.39E-011   -2.02E-010 
1.15    5.27E-011   2.62E-011
1.1 5.12E-011   1.48E-010
1.05    4.94E-011   -5.94E-011 
1   4.75E-011   -2.22E-010
0.95    4.52E-011   5.05E-011
0.9 4.27E-011   -2.08E-010
0.85    4.02E-011   -3.30E-011
0.8 3.77E-011   2.84E-010
0.75    3.52E-011   -2.50E-010
0.7 3.30E-011   7.79E-010
0.65    3.11E-011   9.33E-010
0.6 2.93E-011   9.51E-010
0.55    2.78E-011   7.86E-010
0.5 2.65E-011   5.22E-010
0.45    2.54E-011   7.77E-011
0.4 2.44E-011   7.67E-011
0.35    2.36E-011   -2.22E-010
0.3 2.28E-011   -1.93E-010
0.25    2.21E-011   -1.78E-010
0.2 2.15E-011   4.91E-011
0.15    2.09E-011   -1.97E-010
0.1 2.04E-011   -4.07E-010
0.05    1.99E-011   -1.37E-0 10
0   1.95E-011   -1.58E-010
-0.05   1.91E-011   -2.27E-010
-0.1    1.88E-011   -4.24E-010
-0.15   1.86E-011   -3.00E-010
-0.2    1.83E-011   2.35E-010
-0.25   1.81E-011   2.87E-010
-0.3    1.79E-011   -7.89E-011
-0.35   1.78E-011   5.05E-010
-0.4    1.77E-011   8.43E-011
-0.45   1.76E-011   -1.67E-010
-0.5    1.75E-011   -3.21E-010
-0.55   1.74E-011   -1.39E-010
-0.6    1.74E-011   -2.56E-010
-0.65   1.73E-011   6.28E-011
-0.7    1.72E-011   -1.39E-010
-0.75   1.71E-011   1.07E-010
-0.8    1.70E-011   2.98E-010
-0.85   1.69E-011   -4.11E-011
-0.9    1.68E-011   -2.59E-010
-0.95   1.68E-011   -4.53E-010 
-1  1.67E-011   -4.97E-010
-1.05   1.66E-011   -3.11E-010
-1.1    1.65E-011   1.02E-010
-1.15   1.64E-011   3.58E-010
-1.2    1.64E-011   2.33E-011
-1.25   1.63E-011   -1.96E-011
-1.3    1.62E-011   -2.55E-010
-1.35   1.61E-011   -1.24E-010
-1.4    1.60E-011   9.76E-011
-1.45   1.60E-011   -1.30E-010
-1.5    1.59E-011   -1.94E-010
-1.55   1.59E-011   3.96E-010
-1.6    1.58E-011   -9.73E-013
-1.65   1.58E-011   -3.42E-011
-1.7    1.56E-011   2.40E-010
-1.75   1.56E-011   -2.59E-010
-1.8    1.55E-011   -2.25E-010
-1.85   1.55E-011   -2.09E-010
-1.9    1.54E-011   6.10E-011
-1.95   1.54E-011   -1.91E-010  
-2  1.53E-011   -5.28E-011
-2.05   1.52E-011   -1.15E-010
-2.1    1.52E-011   -1.54E-010
-2.15   1.51E-011   -9.81E-011
-2.2    1.51E-011   -2.18E-011
-2.25   1.50E-011   -4.79E-011
-2.3    1.50E-011   4.71E-011
-2.35   1.50E-011   -3.73E-010
-2.4    1.49E-011   1.50E-010
-2.45   1.48E-011   1.08E-010
-2.5    1.48E-011   -1.51E-010
-2.55   1.48E-011   1.72E-010
-2.6    1.47E-011   -3.49E-011
-2.65   1.47E-011   -2.53E-010
-2.7    1.46E-011   -1.64E-010  
-2.75   1.46E-011   -2.40E-011
-2.8    1.45E-011   -7.15E-011
-2.85   1.45E-011   -2.91E-010
-2.9    1.45E-011   6.30E-011
-2.95   1.45E-011   -2.76E-010
-3  1.45E-011   2.01E-010
-3.05   1.44E-011   -2.15E-010
-3.1    1.44E-011   -9.85E-011  
-3.15   1.43E-011   2.53E-011
-3.2    1.44E-011   5.78E-012
-3.25   1.43E-011   -3.54E-010
-3.3    1.43E-011   3.60E-011
-3.35   1.44E-011   -1.14E-010
-3.4    1.44E-011   -2.33E-010
-3.45   1.44E-011   -3.83E-010 
-3.5    1.44E-011   -3.10E-010
-3.55   1.43E-011   -9.04E-011
-3.6    1.43E-011   -1.86E-010
-3.65   1.43E-011   -3.67E-010
-3.7    1.44E-011   8.13E-011
-3.75   1.43E-011   -1.46E-010
-3.8    1.43E-011   2.34E-010
-3.85   1.44E-011   -1.07E-011
-3.9    1.44E-011   -2.10E-010
-3.95   1.44E-011   -1.86E-010
-4  1.45E-011   -4.67E-011
-4.05   1.44E-011   -1.51E-010
-4.1    1.45E-011   1.09E-010
-4.15   1.44E-011   1.94E-010
-4.2    1.45E-011   -8.02E-011
-4.25   1.45E-011   -1.25E-010
-4.3    1.46E-011   -1.47E-010
-4.35   1.46E-011   -2.76E-010
-4.4    1.46E-011   5.60E-011
-4.45   1.47E-011   -6.24E-011
-4.5    1.48E-011   1.79E-010
-4.55   1.49E-011   -1.71E-010
-4.6    1.49E-011   1.49E-010
-4.65   1.50E-011   -4.05E-011
-4.7    1.50E-011   8.56E-012
-4.75   1.51E-011   -3.71E-010
-4.8    1.52E-011   2.12E-010
-4.85   1.53E-011   -2.04E-010
-4.9    1.54E-011   -1.97E-012
-4.95   1.56E-011   -4.94E-010
-5  1.58E-011   -2.03E-010
  

Ответ №1:

Ваша проблема в том, что ваши входные координаты x расположены в порядке убывания. UnivariateSpline ожидается, что они будут в порядке возрастания.

Вот более компактная версия вашего кода выше, которая воспроизводит проблемы, с которыми вы столкнулись. (Ожидается, что данные, которые вы указали в своем вопросе, будут в файле с именем data.txt ).

 import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline

data = np.loadtxt('data.txt')
x = data[:,0]
y = data[:,1]

spline = UnivariateSpline(x, y, s=0)
xi = np.linspace(x.min(), x.max(), 1000)
yi = spline(xi) 

p1 = plt.plot(x, y, 'bo', label='Original Points')
p2 = plt.plot(xi, yi, 'g', label='Interpolated Points')
plt.legend()
plt.show()
  

введите описание изображения здесь

Очевидно, что это сработало неправильно.

Однако, если вы посмотрите на свои входные данные, ваши координаты «x» расположены в порядке убывания. Если мы просто поменяем местами входные данные «x» и «y», это сработает идеально.

 import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline

data = np.loadtxt('data.txt')
x = data[:,0][::-1] # Reversing the input data...
y = data[:,1][::-1]

spline = UnivariateSpline(x, y, s=0)
xi = np.linspace(x.min(), x.max(), 1000)
yi = spline(xi) 

p1 = plt.plot(x, y, 'bo', label='Original Points')
p2 = plt.plot(xi, yi, 'g', label='Interpolated Points')
plt.legend()
plt.show()
  

введите описание изображения здесь

Комментарии:

1. Большое тебе спасибо, Джо, теперь это работает отлично. Я был бы в состоянии продолжить свою работу.