درونيابي عبارتست از پروسه اي كه براساس آن مقادير مابين يكسري نقاط معلوم را ميتوان معين نمود . در اين بخش مختصري راجع به دونيابي صحبت كرده وسپس درونيابي دوبعدي و سه بعدي راشرح داده و مثالهاي از كاربردهاي آن را بيان مي كنيم ، سپس درونيابي داده هاي چند بعدي و روش درونيابي مثلثي و اسكاتر را شرح خواهيم داد .
خلاصه اي از توابع درونيابي در مطلب به شرح زير مي باشد :
تابع |
شرح |
griddata |
گره بندي داده ها و سطح مناسب |
griddata3 |
گره بندي بالاي سطح سه بعدي |
griddatan |
گره بندي داده هاي بالاي سطح (ابعاد بزرگتر يا مساوي سه ) |
interp1 |
درونيابي تك بعدي |
interp2 |
درونيابي دوبعدي |
interp3 |
درونيابي سه بعدي |
interpft |
درونيابي تك بعدي با بكارگيري روش FFT |
intern |
درونيابي N-D |
mkpp |
ايجاد چند جمله ايهاي تكه اي |
pchip |
درونيابي مكعبي هرميت چند جمله ايهاي تكه اي (PCHIP ) |
ppval |
برازش ( محاسبه در مقدار چند جمله اي در نقاط خاص) چند جمله ايهاي تكه اي |
spline |
درونيابي داده ها با اسپلاين مكعبي |
unmkpp |
جزئيات چند جمله اي تكه اي |
درونيابي تك بعدي :
دو نوع درونيابي در مطلب وجود دارند :
- درونيابي چند جمله اي
- درونيابي بر اساس FFT
درونيابي تك بعدي چند جمله اي :
تابع interp1 بيانگر درونيابي تك بعدي ميباشد ، و كاربرد عمده اي در آناليز داده ها و انطباق منحني دارد .
فرم كلي اين تابع بصورت زير است :
yi=interp1(x,y,xi,method)
كه در آن x مقادير نقاط و Yمقادير تابع در اين نقاط و xi برداري شامل نقاطي است كه بايستي درونيابي شوند وmetod انتخاب روش خاص درونيابي ميباشد كه به شرح زيرند :
- روش همسايگي نزديك ( neighbor ) : بجاي (method='neighbor' ) را قرار ميدهيم كه در اين روش نقاط درونيابي را به استفاده از نزديكترين نقاط به آنها محاسبه ميكند .
- روش درونيابي خطي (Linear ) : بجاي (method='linear' ) را قرار ميدهيم كه در اين روش از ترسيم خطوط مختلف مابين داده ها براي محاسبه درونيابي استفاده مي نمايد .
- روش درونيابي اسپلاين درجه سه (Cubic spline ): بجاي (method='spline' ) را قرار ميدهيم ، دراين روش براي درونيابي از روش درونيابي اسپلاين مكعبي ( درجه سه ) استفاده مينمايد .
- درونيابي مكعبي (Cubic ) : بحاي (method='pchip' or 'cubic' ) را قرار ميدهيم ، در اين روش از درونيابي چند جمله ايهاي درجه سه هرميت براي محاسبه درونيابي استفاده ميكند .
درصورتيكه بخواهيد داده هاي خارج از محدوده بازه داده هاي معلوم را به روش درونيابي تعين كنيد و يا به عبارت ديگر عمل برونيابي (Extrapolation ) را نيز انجام دهيد ميتوانيد تابع extrapval را به تابع درونيابي خود اضافه نمائيد ، روند بصورت زير خواهد بود :
Yi=interp1(x,y,xi,method,extrapval)
توجه به سرعت و حافظه و همواري :
هنگامي كه از روش درونيابي استفاده ميكنيد ، حافظه عملكرد به مقدار زيادي اشغال شده و زمان محاسبات طولاني ميگردد ، بنابراين لازم است كه بدانيم كه كداميك از روشهاي درونيابي كه در فوق بيان شد سريعتر و نرميت منحني بدست آمده بيشتر بوده و حافظه كمتري از كامپيوتر را اشغال ميكند :
- روش nearest سريع ميباشد ولي خروجي داده هاي آن از همواريت كمتري برخوردار است .
- روش linear حافظه بيشتري را از روش nearest اشغال ميكند و كمي بيشتر از اين روش زمان ميبرد و همانند اروش nearest در نقاط انتهاي شيب تغير ميكند .
- روش spline زمان طولانيتري براي محاسبات صرف ميكند ولي حافظه كمتري نسبت به روش cubic اشغال ميكند ولي نتايج بدست آمده از نرميت بالائي برخوردار است و نمودار بدست آمده نرمتر است اگرورويهاي شما نزديك به هم باشند نتايج دقيقتري از اين روش بدست خواهيد آورد .
- روش cubic زمان عملكرد بالائي دارد نتايج بدست آمده نسبت به روشهاي nearest و linear نرمتر ميباشد ،به هرحال داده ها و مشتقات آنها در اين روش پيوسته هستند .
روندهاي كه شرح داده شد در درونيابي دوبعدي نيز صادق است .
مثال :
x = 0:10;
y = sin(x);
xi = 0:.25:10;
yi = interp1(x,y,xi);
plot(x,y,'o',xi,yi)
مثال :
t = 1900:10:1990;
p = [75.995 91.972 105.711 123.203 131.669...
150.697 179.323 203.212 226.505 249.633];
interp1(t,p,1975)
ans =
214.8585
مثال :
t = 2000:10:2090;
p = [75.995 91.972 105.711 123.203 131.669...
150.697 179.323 203.212 226.505 249.633];
x = 2000:1:2090;
y = interp1(t,p,x,'spline');
plot(t,p,'o',x,y)
درونيابي بر اساس FFT :
تابع interpft بيانگر روش درونيابي بر اساس FFT ميباشد . اين روش براساس تبديلات فوريه اقدام به محاسبه درونيابي مينمايد فرم كلي آن بصورت زير است :
Y=interpft(x,n)
كه در آن x نمونه اي از بردار مقادير هم فضاي تابع پريوديك و n تعداد نقاط هم فضا كه برگردانده ميشوند .
درونيابي دوبعدي :
تابع interp2 بيانگر درونيابي دوبعدي ميباشد و كاربرد زيادي در آناليز داده هاو پروسه هاي ايجاد تصوير دارد ، فرم عمومي آن بصورت :
ZI = interp2(X,Y,Z,XI,YI)
ZI = interp2(Z,XI,YI)
ZI = interp2(Z,ntimes)
ZI = interp2(X,Y,Z,XI,YI,method)
Z يك آرايه مستطيلي كه شامل مقادير تابع دوبعدي است ، x,y آرايه هاي هم اندازه هستند كه شامل نقاطي است كه با استفاده از آنها z بدست ميايد .xi,yi شامل نقاطي است كه درونيابي در آن انجام ميگيرد ، method شامل روشهاي است كه براي محاسبه درونيابي بكاري ميرود (binearest و bilinear و bicubic, و bispline توضيح اين روشها همانند روشهاي است كه در يخش قبل بيان براي روشهاي درونيابي تك بعدي معرفي گرديده است .
مثال :
[X,Y] = meshgrid(-3:.25:3);
Z = peaks(X,Y);
[XI,YI] = meshgrid(-3:.125:3);
ZI = interp2(X,Y,Z,XI,YI);
mesh(X,Y,Z), hold, mesh(XI,YI,ZI+15)
hold off
axis([-3 3 -3 3 -5 20])
مثال :
years = 2000:10:2040;
service = 10:10:30;
wage = [150.697 199.592 187.625
179.323 195.072 250.287
203.212 179.092 322.767
226.505 153.706 426.730
249.633 120.281 598.243];
w = interp2(service,years,wage,15,2025)
w =
190.6288
مقايسه روشهاي درونيابي :
براي مثال درونيابي دوبعدي براي ماتريس داده هاي را با روشهاي مختلف مقايسه ميكنيم :
1- ايجاد تابع peaks در تجزيه و تحليل پائين :
[x,y]=meshgrid(-3:1:3);
z=peaks(x,y);
surf(x,y,z)
2- درونيابي با گره بندي هاي ريز :
[x,y]=meshgrid(-3:0.25:3);
z=peaks(x,y);
surf(x,y,z)
3- درونيابي با بكارگيري روش همسايگي نزديك :
[x,y]=meshgrid(-3:1:3);
[xi,yi]=meshgrid(-3:0.25:3);
z=peaks(x,y);
zi1=interp2(x,y,z,xi,yi,'nearest')
surf(xi,yi,zi1)
4- درونيابي با بكارگيري روش bilinear :
[x,y]=meshgrid(-3:1:3);
[xi,yi]=meshgrid(-3:0.25:3);
z=peaks(x,y);
zi1=interp2(x,y,z,xi,yi,'bilinear')
surf(xi,yi,zi1)
5- درونيابي با بكار گيري روش bicubic :
[x,y]=meshgrid(-3:1:3);
[xi,yi]=meshgrid(-3:0.25:3);
z=peaks(x,y);
zi1=interp2(x,y,z,xi,yi,'bicubic');
surf(xi,yi,zi1)
در زير نماي افقي ترسيمات بترتيب روشهاي 3 و 4 و 5 مشاهده ميكند :
Contor(xi,yi,zi1)
Contor(xi,yi,zi2)
Contor(xi,yi,zi3)
اگربه نماي افقي روش bicubic بنگريد مشاهده ميكنيد كه منحني حاصله از نرميت بالائي برخوردار است اما اين دليل بر آن نيست كه مبناي اصلي محاسبات خود قرار دهيد بلكه در بعضي از زمينه هاي كاربردي مانند ايجاد تصاوير در پزشكي روش nearest عملكرد بهتري دارد و ديد بهتري از اعضاء ميدهد چراكه اين روش داده هاي جديد را وارد نميكند .
انجام پروژه با نرم افزار متلب ( matlab ) پذیرفته می شود.
درونيابي آرايه هاي چند بعدي :
تعدادي از توابع كه براي درونيابي آرايه هاي چند بعدي بكار ميروند عبارتند از :
تابع |
توضيج |
interp3 |
درونيابي آرايه هاي سه بعدي |
interpn |
درونيابي آرايه هاي چندبعدي |
ndgrid |
گره بندي آرايه هاي چند بعدي |
درونيابي آرايه هاي سه بعدي :
تابع interp3 بيانگر درونيابي سه بعدي ميباشد ، براي درونيابي مابين سه سري داده بايستي نكات زير را بدانيد :
* x,y,z مختصات نقاط در ماتريس v ميباشند .
* براي محاسبه نقاط درونيابي مقادير بايستي شامل ماتريس v و x,y,z بفرمهاي عمومي زير باشند :
VI = interp3(X,Y,Z,V,XI,YI,ZI)
VI = interp3(V,XI,YI,ZI)
VI = interp3(V,ntimes)
VI = interp3(...,method)
روشهاي براي محاسبه درونيابي همانند روشهاي بكار رفته در درونيابي تك بعدي ميباشد اين روشها عبارتند از (linear, nearest, cubic )
مثال :
[x,y,z,v] = flow(10);
[xi,yi,zi] = meshgrid(.1:.25:10, -3:.25:3, -3:.25:3);
vi = interp3(x,y,z,v,xi,yi,zi); % vi is 25-by-40-by-25
slice(xi,yi,zi,vi,[6 9.5],2,[-2 .2]), shading flat
درونيابي آرايه هاي چند بعدي :
تابع intern بيانگر درونيابي مابين چندين نقطه ميباشد فرمهاي كلي اين تابع بصورت زير است :
VI = interpn(X1,X2,X3,...,V,Y1,Y2,Y3,...)
VI = interpn(V,Y1,Y2,Y3,...)
VI = interpn(V,ntimes)
VI = interpn(...,method)
كه در آن X1,X2,X3,..., ماتريس نقاط و v مقاديري ميباشند كه براساس اين نقاط بدست آمده اند . Y1,Y2,Y3,... نقاط بدست آمده از ngrid ميباشند . روشهاي (methods ) كه در اين روش ميتوان بكار برد عبارتند از :spline و linear, nearest, cubic .
گره بندي ( شبكه بندي ) آرايه هاي چند بعدي :
تابع ndgrid براي گره بندي آرايه هاي چند بعدي بكار ميرود ، كه ميتوان با واردكردن مقادير خاص فمت شبكه بندي را كنترل نمود فرم عمومي اين تابع بصورت زيرا ست :
[X1,X2,X3,...] = ndgrid(x1,x2,x3,...)
[X1,X2,...] = ndgrid(x)
براي مثال تابع سه بعدي را در نظر بگيريد ، كه در آن و و ميباشد . براي برازش ترسيم اين تابع داريم :
x1=-2:0.2:2;
x2=-2:0.25:2;
x3=-2:0.16:2;
[x1,x2,x3]=ndgrid(x1,x2,x3);
z=x2.*exp(-x1.^2 -x2.^2 -x3.^2);
slice(x2,x1,x3,z,[-1.2 0.8 2],2,[-2 0.2])
شبكه بندي مثلثي و درونيابي داده هاي پراكنده :
مطلب روشهاي مفيد و راحتي براي مسائل closest-point (نقاط نزديك) به هم و آناليز هندسي دارد ، قسمتي از توابع مربوطه را در جدول زير مشاهده مينمائيد .
تابع |
توضيح |
convhull |
پوسته محدب |
delaunay |
شبكه بندي مثلثي |
delaunay3 |
شبكه بندي سه بعدي مثلثي |
dsearch |
روش جستجوي نقاط نزديك به هم در شبكه بندي مثلثي |
inpolygon |
براي نقاط داخل محدوده كثير الاضلاع صادق است |
polyarea |
مساحت كثير الاضلاع |
rectint |
مساحت تقسيم بندي دو يا چندين مستطيل |
tsearch |
جستجوي مثلثهاي نزديك به هم |
voronio |
دياگرام voronoi |
به مثالهاي زير توجه فرمائيد :
load seamount
plot(x,y,'.','markersize',10)
k = convhull(x,y);
hold on, plot(x(k),y(k),'-r'), hold off
grid on
load seamount
plot(x,y,'.','markersize',12)
xlabel('Longitude'), ylabel('Latitude')
grid on
tri = delaunay(x,y);
hold on, triplot(tri,x,y), hold off
figure
hidden on
trimesh(tri,x,y,z)
grid on
xlabel('Longitude');
ylabel('Latitude');
zlabel('Depth in Feet')
figure
[xi,yi] = meshgrid(210.8:.01:211.8,-48.5:.01:-47.9);
zi = griddata(x,y,z,xi,yi,'cubic');
[c,h] = contour(xi,yi,zi,'b-');
clabel(c,h)
xlabel('Longitude'), ylabel('Latitude')
load seamount
voronoi(x,y)
grid on
xlabel('Longitude'), ylabel('Latitude')
دیدگاه خود را بنویسید