整個事情起源于這個圖
? ? 這是之前和別人組之前合作測試時候我?guī)熜之嫷耐奘簦瑱M軸壓力縱軸溫度诬留,顏色軸是電阻率的對數(shù)缨睡,很直觀的看出來了金屬到半導(dǎo)體絕緣體的轉(zhuǎn)變與壓力溫度的關(guān)系。
? ? 還記得那是一個陽光明媚的能熱死個人的下午把鉴,我去找老板討論這一組數(shù)據(jù)故黑,大概意思就是壓力下這個樣品從一個絕緣體/半導(dǎo)體轉(zhuǎn)變?yōu)橐粋€金屬。老板拿出了師兄之前畫的那個圖庭砍,說你去試試也畫下類似這個的圖吧场晶,應(yīng)該不難的。
? ? “應(yīng)該不難的”這種話從老板嘴里說出來一般都不可信怠缸,然后我去問師兄他比較忙只告訴我他用matlab畫的偽色彩圖交洗,那怎么辦呢馏予,我只能一天從零開始入門matlab了啊。
? ? 先說說我摸索的過程,我思路一開始是這樣的:我們測試是在不同壓力下對其電阻-溫度關(guān)系進(jìn)行的測試划鸽,而要將其轉(zhuǎn)化為三維圖像首先要將其轉(zhuǎn)化為矩陣,而不同壓力下測試的溫度范圍都不同靡狞,也就意味著沒法同時放到矩陣?yán)锿誓牵窃撛趺崔k呢?
? ? 我選擇了igor pro中的插值功能來解決這個問題疚俱,自己寫了個小的macro來執(zhí)行劝术。
macro interpof(T1,T2,pressure)
variable T1=3.5, T2=290, pressure
Make/N=600/D T_tot
SetScale/I x,T1,T2,T_tot
T_tot=x
String newname1="T_R_"+num2str(pressure)+"G"
String newname2="R_"+num2str(pressure)+"G"
String newname3="R_"+num2str(pressure)+"G_tot"
Duplicate T_tot? $newname3
$newname3=interp(T_tot,$newname1,$newname2)
Duplicate $newname3 ::$newname3
end
大概意思就是根據(jù)輸入的T1、T2兩個溫度點(diǎn) 呆奕,在其中均勻分600個位置养晋,然后在這600個位置中對數(shù)據(jù)結(jié)果進(jìn)行插值,因?yàn)槲覀兊臏y試一般會得到幾千個點(diǎn)梁钾,所以這樣的簡單插值精度完全可以保證绳泉。分別對不同壓力下數(shù)據(jù)允許這個macro,即可得到同一溫度下不同壓力對應(yīng)的電阻值姆泻。將不同壓力下插值得到的600*n個數(shù)據(jù)在excel中排好導(dǎo)入matlab即可得到矩陣零酪。運(yùn)行g(shù)riddata指令即可得到結(jié)果。
[p,t,z]=griddata(P,T,lnR,linspace(2,12)',linspace(3.5,290),'v4');%插值
pcolor(p,t,z);shading interp
? ? 把相變點(diǎn)一加坐標(biāo)軸一標(biāo)也是有那么點(diǎn)意思拇勃,不過有個小問題蛾娶,對每個壓力點(diǎn)的測試溫度范圍都不完全相同,圖中是對3.8-290K進(jìn)行的插值潜秋,但許多時候測量范圍會差很多蛔琅,尤其是對一些高溫超導(dǎo)體,其下半部分不可能這么整齊峻呛,比如下圖罗售,而此處使用這種辦法只能在矩陣中手動將沒有數(shù)字的地方設(shè)為0辜窑,非常麻煩;同時也不能使用'v4'參數(shù)寨躁,而要換為cubic spline模式穆碎。
? ? 然后我又去找?guī)熜钟懻摿耍龍D敲詐出他的原始方法职恳,經(jīng)過一番討論所禀,以及我自己的摸索,終于找到了更一般的方法放钦。
? ? 我們首先來看看matlab中g(shù)riddata的描述
griddata
Interpolates scattered data - generally to produce gridded data
? ? Vq = griddata(X,Y,V,Xq,Yq) fits a surface of the form V = F(X,Y) to the ? ? scattered data in (X, Y, V). The coordinates of the data points are ? ? defined by the vectors (X,Y) and V defines the corresponding values. ? ? griddata interpolates the surface F at the query points (Xq,Yq) and ? ? returns the values in Vq. The query points (Xq, Yq) generally represent ? ? a grid obtained from NDGRID or MESHGRID, hence the name griddata.
? ? Vq = griddata(X,Y,Z,V,Xq,Yq,Zq) fits a hyper-surface of the form ? ? V = F(X,Y,Z) to the scattered data in (X, Y, Z, V). The coordinates of ? ? the data points are defined by the vectors (X,Y,Z) and V defines the ? ? corresponding values. griddata interpolates the surface F at the query ? ? points (Xq,Yq,Zq) and returns the values in Vq.
? ? ? Vq = griddata(X,Y,V, xq, yq) where xq is a row vector and yq is a ? ? column vector, expands (xq, yq) via [Xq, Yq] = meshgrid(xq,yq). ? ? [Xq, Yq, Vq] = griddata(X,Y,V, xq, yq) returns the grid coordinates ? ? arrays in addition.
? ? Note: The syntax for implicit meshgrid expansion of (xq, yq) will be ? ? removed in a future release.
? ? griddata(..., METHOD) where METHOD is one of
? ? ? ? 'nearest'? - Nearest neighbor interpolation
? ? ? ? 'linear'? ? - Linear interpolation (default)
? ? ? ? 'natural'? - Natural neighbor interpolation
? ? ? ? 'cubic'? ? - Cubic interpolation (2D only)
? ? ? ? 'v4'? ? ? ? - MATLAB 4 griddata method (2D only)
? ? defines the interpolation method. The 'nearest' and 'linear' methods ? ? have discontinuities in the zero-th and first derivatives respectively, ? ? while the 'cubic' and 'v4' methods produce smooth surfaces.? All the ? ? methods except 'v4' are based on a Delaunay triangulation of the data.
? ? Example 1:
? ? ? % Interpolate a 2D scattered data set over a uniform grid
? ? ? x = 4*rand(100,1)-2; y = 8*rand(100,1)-4; z = x.*exp(-x.^2-y.^2);
? ? ? [xq,yq] = meshgrid(-2:.2:2, -4:.4:4);
? ? ? zq = griddata(x,y,z,xq,yq);
? ? ? mesh(xq,yq,zq), hold on, plot3(x,y,z,'o'), hold off
? ? Example 2:
? ? ? % Interpolate a 3D data set over a grid in the x-y (z=0) plane
? ? ? x = 2*rand(5000,1)-1;
y = 2*rand(5000,1)-1;
z = 2*rand(5000,1)-1;
? ? ? v = x.^2 + y.^2 + z.^2;
? ? ? d = -0.8:0.05:0.8;
? ? ? [xq,yq,zq] = meshgrid(d,d,0);
? ? ? vq = griddata(x,y,z,v,xq,yq,zq);
? ? ? surf(xq,yq,vq);
? ? ? ? 不僅可以處理矩陣的數(shù)據(jù)色徘,同時也可對輸入的(x,y操禀,z)點(diǎn)集進(jìn)行插值褂策,此方法即不再將其視為矩陣,而視為xy對應(yīng)的二元函數(shù)z颓屑,輸入所有的xyz數(shù)據(jù)進(jìn)行插值即可斤寂。然而處理時首先還要注意點(diǎn)的數(shù)量,我們測試的原始數(shù)據(jù)加起來總共有上萬個點(diǎn)揪惦,為了提高效率依舊可以先使用igor pro對數(shù)據(jù)插值及平滑處理遍搞,不過不用再設(shè)定溫度范圍,直接選擇點(diǎn)的個數(shù)(600)插值即可器腋,然后將得到的所有數(shù)據(jù)(600*n)輸入excel中分別為三列:壓力溪猿、溫度、電阻蒂培,導(dǎo)入matlab中作為三個向量再愈,運(yùn)行指令
[x,y,z]=griddata(P,T,Z,linspace(2,12)',linspace(0,300),'cubic');%插值
pcolor(x,y,z);shading interp
即可得到完整的包括0K附近及300K附近邊角缺憾的相圖榜苫。之后再添加其他說明數(shù)據(jù)即可护戳。
這種方法相比于前者更為簡便,且應(yīng)用范圍更廣垂睬,我以后應(yīng)該不會用我費(fèi)老大勁搞出來的笨辦法了媳荒。