#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. Большое тебе спасибо, Джо, теперь это работает отлично. Я был бы в состоянии продолжить свою работу.