2011-04-16 72 views
2

我有一個奇怪的問題,試圖使用UnivariateSpline函數插值數據。通過所有點(s = 0)插值並且樣條函數不會給出整個數據集的結果。 s> = 1的結果也很奇怪。正如我認爲它與我正在使用的數據有關,我會加入他們的協助。
我被卡住了,所以如果有人對解決方案有一個好主意,我會非常感激。與SCIPY有關的數據相關UnivariateSpline插值問題

謝謝,代碼

這兒的一部分:

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:\capamos\LOCOS\cap15L1_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]) 

而這裏DATAS:

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 

回答

5

你的問題是,您輸入的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() 

enter image description here

顯然,沒有工作的權利。然而,如果你看看你的輸入數據,你的「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() 

enter image description here

+0

非常感謝喬,它現在正常工作。我將能夠繼續我的工作。 – 2011-04-17 08:17:30