3Phase.ir

  • Increase font size
  • Default font size
  • Decrease font size
صفحه اصلی

درون یابی داده ها بوسیله MATLAB

فرستادن به ایمیل چاپ مشاهده در قالب پی دی اف

درون یابی روشی است برای تقریب مقادیریک تابع از بین مجموعه مقادیری ازداده هایی که ارائه شده اند.زمانی درون یابی با ارزش است که کسی نتواند مقدار تابع را در نقاط میانی مورد نظر محاسبه کند.به عنوان مثال هنگامی که نقاط مورد نظر نتیجه برخی از اندازه گیریهای آزمایشی هستند یا نتیجه یک رویه محاسباتی طولانی می باشد.

MATLAB ابزاری را برای درون یابی داده ها ارائه می دهد تا از آنها بتوانید در آرایه های چند بعدی استفاده کنید.برای بیان روش درون یابی داده ها فقط از آرایه های یک بعدی و دو بعدی استفاده می کنیم.

درون یابی یک بعدی

شاید ساده ترین نوع درون یابی شکلهای ترسیمی در MATLAB باشند.به طور پیش فرضMATLAB خطوط مستقیمی را با استفاده از داده هایی که به آنها مربوط می شوند رسم می کند.درون یابی خطی حدس می زند که مقادیرمیانی بر روی خط مستقیمی که بین نقاط ورودی رسم شده قرار  می گیرند.بخصوص وقتی تعداد نقاط داده ها زیاد و فاصله بین آنها کم باشد درون یابی خطی با دقت بیشتری صورت می گیرد.به مثال زیر توجه کنید:

>> x1=linspace(0,2*pi,60);

>> x2=linspace(0,2*pi,6);

>> plot(x1,sin(x1),x2,sin(x2),'--')

>>xlabel('x'),ylabel('sin(x)')

>>title('Figure of Linear Interpolation')

در این شکل دو منحنی سینوسی رسم شده است. یکی از آنهارا با استفاده از 60 نقطه و دیگری را با استفاده از 6 نقطه

قدر مسلم منحنی رسم شده اول دقیق تر است.

برای بیان درون یابی یک بعدی به مثال زیرتوجه کنید.

آستانه شنوایی که حداقل صدایی می باشدکه قابل شنیدن است بر حسب مقیاس فرکانس در انسانها متفاوت می باشد در زیرداده هایی در این زمینه نوشته شده است:

>> Hz=[20:10:100 200:100:1000 1500 2000:1000:10000];%frequence in Hertz

>> spl=[76 66 59 54 49 46 43 40 38 22 ...%sound pressure level in db

14 9 6 3.5 2.5 1.4 0.7 0 -1 -3 ...

-8 -7 -2 2 7 9 11 12];

سطحهای فشار صدا نرمال می شوند و به موجب آن صداهایی با اندازه 0db به اندازه 1000HZ شنیده می شوند.از آنجایی که بازه تغییرات فرکانس ها بزرگ می باشد ما هم در هنگام رسم منحنی داده ها محور x را به صورت لگاریتمی در نظر می گیریم:

>> Hz=[20:10:100 200:100:1000 1500 2000:1000:10000];

>>  spl=[76 66 59 54 49 46 43 40 38 22 14 9 6 ...

3.5 2.5 1.4 0.7 0 -1 -3 -8 -7 -2 2 7 9 11 12];

>> semilogx(Hz,spl,'-o')

xlabel('frequency,Hz')

ylabel('relative sound pressure level,db')

همان طور که در منحنی فوق مشاهده می کنید گوش انسان نسبت به صداهایی با فرکانس 3 کیلو هرتز حساس می باشد.حال اجازه دهیدتا با استفاده ازتابعinterp1  سطح فشار صدا را به روشهای گوناگون در فرکانس 5/2 کیلو هرتز تقریب بزنیم.

>> s=interp1(Hz,spl,2.5e3)  %linear interpolation

s =

-5.5000

>> s=interp1(Hz,spl,2.5e3,'cubic')   %cubic interpolation

s =

-6.0488

>> s=interp1(Hz,spl,2.5e3,'spline')   %cubic spline interpolation

s =

-5.8690

>> s=interp1(Hz,spl,2.5e3,'nearest')    %nearest-neighbor interpolation

s =

-8

به تفاوت موجود در نتایج حاصله دقت نمایید.دو نتیجه اول دقیقا همان مقداری را نشان می دهند که در شکل فوق در نقطه5/2 کیلو هرتزی نشان داده می شوند و MATLAB آن را به صورت خطی بین داده های موجود در منحنی قرار داده بود.

درون یابی اسپلاین و درجه سه به صورت درجه سه قرار می گیرند به عبارتی دیگر در روش سوم چند جمله ای مربوط به فاصله های مختلف از شرطهای مختلفی استفاده می کند. درون یابی مکعبی داده ها را به صورت یکنواخت نگه می دارد در حالی که درون یابی اسپلاین بیشترین همواری را در معرض نمایش قرار می دهد.ضعیفترین درون یابی در این حالت روش نزدیکترین همسایه می باشد که نزدیکترین داده ورودی به مقادیر داده شده را بر می گردادند.

حال چگونه یک روش درون یابی را برای مسئله ارائه شده انتخاب می کنید؟ در بسیاری از حالات استتفاده از درون یابی خطی موثرواقع می شود.در حقیقت به همین علت این روش روش پیش فرض می باشد. در حالی که روش نزدیکترین همسایه نتایج ضعیفی تولید می کند از آن اغلب در مواقعی که سرعت انجام کار برای ما مهم بوده یا مجموعه داده ها بزرگ می باشد استفاده می شود.

روشی که بیشتر از بقیه به طول می انجامد روش اسپلاین می باشد ولی اغلب نتایج خوبی را ارائه می دهد.

در حالی که در حالت فوق فقط یک نقطه درون یاب در نظر گرفته می شود interp1  می تواند هر تعداد دلخاه از نقاط را رسم کند.در حقیقت یکی از علل استفاده از درون یابی مکعبی و اسپلاین تعدیل داده ها می باشد. به همین علت مجموعه داده های ارائه شده از درون یابی برای محاسبه داده ها در فواصل کوتاه تراستفاده می کند به مثال زیر توجه کنید:

>> Hzi=linspace(2.2e3,5.5e3);

>> spli=interp1(Hz,spl,Hzi,'spline');

>> i=find(Hz>=2.2e3 & Hz<=5.5e3);

>>semilogx(Hz(i),spl(i),'--o',Hzi,spli)

>>xlabel('frequncy,Hz')

>>ylabel('relative sound pressure level,db')

>>title('threshold of human hearing')

>>grid on

در نمودار فوق منحنی خط چین به وسیله درون یابی خطی به دست آمده و منحنی توپر توسط درون یابی درجه سه رسم شده است و نقاط اصلی با علامت (o) علامتگذاری شده اند.برای بیشتر شدن میزان دقت شما روی محور فرکانس و همچنین استفاده از درون یابی اسپلاین تقریب دقیق تری روی سطح فشار صدا می زنیم.به این نکته توجه کنید که شیب حاصل از حل به روش اسپلاین در نقاط داده ها تغییر نمی کند.

با این داده ها می توانیمتقریب بهتری از فرکانس با حساسیت و دقت بیشتری داشته باشیم:

spl_min,i]=min(spli)  %minimum and index of minimum

spl_min =

-8.4245

i =    45

>>Hz_min=Hzi(i)  %frequency at minimum

Hz_min =

3333.3

از نتایج حاصله فوق می توان این گونه نتیجه گرفت که گوش انسان به صداهایی با فرکانس3/33 کیلو هرتز حساس می باشد.

مشخص کردن محدودیت اصلی که با استفاده از interp1 به وجود می آیدمهم می باشد بدین معنی که متغیر مستقل هممی بایست یکنواخت باشد. به همین علت است که اولین متغیر می بایست همیشه صعودی یا همیشه نزولی باشد.در مثال فوق HZ یکنواخت است درپایان لازم به ذکر است که امکان درون یابی از چندین مجموعه داده در یک زمان وجود دارد زیرا تابع interp1  از ورودی چند بعدی پشتیبانی می کند. به عنوان مثال اگرy یک آرایه ستونی باشد.به همین علت اگر x یک بردار باشد آنگاه y هم می تواند یا بصورت برداری که در بالا نشان داده شده باشد یاآرایه ای باشد که دارای length(x) سطر و تعداد دلخواهی ستون باشد. به مثال زیر توجه کنید:

>> x=linspace(0,2*pi,11)';

>> y=[sin(x) cos(x) tan(x)];

>> size(y)

ans =

11     3

>> xi=linspace(0,2*pi);

>> yi=interp1(x,y,xi,'cubic');

>> size(yi)

ans =

100     3

در مثال فوق توابع sin(x), cos(x), tan(x) در نقاط xi درون یابی می شوند.

درون یابی دو بعدی

درون یابی دو بعدی هم همانند درون یابی یک بعدی به نکات ریز و مهمی بستگی دارد. همان طور که از نام آن پیداست درون یابی دو بعدی توابع دو متغیری را درون یابی میکند(z=f(x,y)) برای بیان این حالت به مثال زیر توجه کنید.یک شرکت حفاری برای رسم نقشه کف دریا از دستگاه sonar استفاده می کند.در هر5/0 کیلومتر روی یک جدول مستطیل شکل عمق دریا را بر حسب متر ثبت می کند تا از آن در آنالیزهای بعدی استفاده کند.قسمتی از داده های جمع آوری شده در اسکریپتocean.m  ذخیره می شوند.به مقادیر زیر توجه کنید:

>> x=1:9;

>> y=1:13;

>> z=[100 99 100 99 100 99 99 99 100; 100 99 99 99 100 99 100 99 99; 99 99 98 98 ...

100 99 100 100 100; 100 98 97 97 99 100 100 100 99; 101 100 98 98 100 102 103 100 ...

100; 102 103 101 100 102 106 104 101 100; 99 102 100 100 103 108 106 101 99; 97 99 ...

100 100 102 105 103 101 100; 100  102 103  101 102 103 102 100 99; 100 102 103 102 ...

101 101 100 99 99; 100 100 101 101 100 100 100 99 99; 100 100 100 100 100 99 99 99 99; ...

100 100 100 99 99 100 99 100 99];

منحنی مربوط به این نقاط را می توان با وارد کردن دستورات زیر نمایش داد:

>> mesh(x,y,z)

>>xlabel('x-axis,km')

>>ylabel('y-axis,km')

>>zlabel('ocean depth.m')

>>title('ocean depth measurements')

با وجود این داده ها و با استفاده از تابعinterp2  می توان عمق موجود در نقاط دلخواه را به دست آورد.به مثال زیر توجه کنید:

>> zi=interp2(x,y,z,2.2,3.3)

zi =

98.5000

zi=interp2(x,y,z,2.2,3.3,'cubic')

zi =

98.4903

همانند حالت یک بعدی از روشهای درون یابی متعددی می توانید استفاده کنید که از روش درون یابی خطی به عنوان روش پیش فرض استفاده می شود.

یکبار دیگر می توانیم منحنی مربوط به این نقاط را با دقتی بیشتر رسم کنیم.به مثال زیر توجه کنید:

>> xi=linspace(1,9,30);

>> yi=linspace(1,13,40);

به ازای تمام مقادیر موجود در xi می خواهیم تمام مقادیرyi را درون یابی کنیم.به همین علت است که می خواهیمجدولی از تمام  ترکیبات مقادیر xi و yi ایجاد کنیم سپس در تمام این نقاط درون یابی انجام دهیم.تابع meshgrid دو بردار را دریافت کرده و دو آرایه تولید می کند که هر کدام حاوی کپی هایی از داده های ورودی می باشند که در آن تمام ترکیبات مربوط به داده های ورودی قابل مشاهده هستند.به مثال زیر توجه کنید:

>> xtest=1:5

xtest =

1     2     3     4     5

>> ytest=6:9

ytest =

6     7     8     9

>> [xx,yy]=meshgrid(xtest,ytest)

xx =

1     2     3     4     5

1     2     3     4     5

1     2     3     4     5

1     2     3     4     5

 

yy =

6     6     6     6     6

7     7     7     7     7

8     8     8     8     8

9     9     9     9     9

همان طور که در بالا نشان داده شده  xxدارای length(ytest)  سطر می باشد هر سطرشامل xtest می باشد و yy دارای length(xtest) ستون می باشد و هر ستون شامل ytest می باشد.با کمک این ساختار xx(i,j) و yy(i,j) به ازای تمام i و j ها تمامی ترکیبات بردارهای xtest و ytest را در بر می گیرند.برای پیدا کردن عمق اقیانوس مثال فوق از تابع meshgrid استفاده می شود که در نتیجه نتایج زیر حاصل می شوند:

>> [xxi,yyi]=meshgrid(xi,yi);

>> size(xxi)

ans =

40    30

>> size(yyi)

ans =

40    30

با توجه به مقادیر xxi و yyi ارائه شده اکنون می توان عمق اقیانوس را با وارد کردن مقادیر زیر با دقت بیشتری درون یابی کرد:

>> zzi=interp2(x,y,z,xxi,yyi,'cubic');

>> size(zzi)

ans =

40    30

>> mesh(xxi,yyi,zzi)

>>hold on

>>[xx,yy]=meshgrid(x,y);

>>plot3(xx,yy,z+0.1,'ok')

>>hold off

>>xlabel('x-axis,km')

>>ylabel('y-axis,km')

>>zlabel('ocean depth,m')

>>title('smoothing')


با استفاده از این داده ها می توانیم نقطه مرتفع را پیدا کرده و محل آن را تقریب بزنیم :

>> zmax=max(max(zzi))

zmax =

108.0520

>> [i,j]=find(zmax==zzi);

>> xmax=xi(j)

xmax =

6.2414

>> ymax=yi(i)

ymax =

6.8462

با توجه به دو قسمت فوق که شرح داده شد طبیعی است که می توان ابعاد را افزایش داد تا آنجا که بتوانید از توابع ndgrid وinterp3 وinterpn استفاده کنید.تابع ndgrid معادل تابع meshgrid  در حالت چند بعدی می باشد.

در درون یابی چند بعدی از آرایه های چند بعدی استفاده می شود تا داده ها را سازماندهی کرده و درون یابی را انجام دهند.

تابع interp3 عمل درون یابی را در فضای سه بعدی و تابع  interpn در فضای  n بعدی انجام می دهد.هر دو تابع interp3 و interpn روش انتخابهای linear, cublic و nearest را پیشنهاد می کنند.برای کسب اطلاعات بیشتردر مورد این توابع می توانید به متن راهنمای موجود در MATLAB مراجعه کنید.

نظر ها
افزودن جدید
علیرضا   |2010-06-08 17:00:43
مرسی عالی بود
hamed   |2010-11-30 10:00:32
واقعا دستت درد نكنه
ciahposh   |2010-12-22 22:33:13
از مطلبی که گذاشتید ممنون و سپاسگزارم.
ali   |2011-04-03 12:19:39
pdf sitetoon khoub dar nemiyad.
lida   |2011-04-22 19:51:25
ممنون از مطلبتون. می شه درون یابی تصویر را با
اسپیلاین نشون بدید. میدونم تصویر هم از
ماتریس تشکیل شده ولی نیاز به دستورات
دارم.

ممنون
vida   |2011-04-22 19:59:14
سلام
ممنون از مطلبتون می شه خواهش کنم یک
تصویر هم با روش بی اسپیلاین درون یابی کنید.


ممنون
Akbar   |2011-04-27 10:52:56
در پردازش تصویر از درون یابی برای تغییرات
هندسی مثل چرخش تصویر استفاده می شه که این
کار رو با توابع دیگه ای که هست می تونید انجام
بدید يا انجام اعمال ریخت شناسی مورد استفاده
قرار می گیرد(morphology)
منظورتون رو دقیقتر بگید.
vida  - تشکر   |2011-04-28 00:44:09
منظورمو بد رسوندم ولی متنتونو سه چهار بار
خوندم, آخر تونستم کاری که می خوام انجام بدم.
یک دنیا ممنون از سایت خوبتون. خیلی دنبال این
مطلب بودم.
ناشناس   |2011-07-20 23:32:10
tnx
نوشتن نظر
نام:
ایمیل:
 
آدرس سایت:
عنوان:
قالب نوشته:
[b] [i] [u] [url] [quote] [code] [img] 
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s

3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved."

 
English Arabic German Hindi Italian Russian Turkish

تبلیغات