توابع استاندارد متلب، از جمله توابع گرافیک ها، تمایل به کار با ماتریس های مستطیلی دارند که تعداد ردیف ها و ستون ها باهم برابر باشند. برای سطوح لازم است که ماتریس های y , x وz در تعیین سطح اعمال شود. برای مثال: ابتدا ما یک دامنه مستطیلی از نقاط x و y که x از -۱ تا۱ و y از ۰ تا ۲ را تولید می کنیم:

 

>> [x ,y]= meshgrid(-1:1,1:3)

 

x =

 

-۱     ۰     ۱

-۱     ۰     ۱

-۱     ۰     ۱

 

 

y =

 

۱     ۱     ۱

۲     ۲     ۲

۳     ۳     ۳

 

این مجموعه نقاط یک دامنه مستطیلی تعریف می شود، چون تمام ردیف های ماتریس xیکسان، و در ماتریس y تمام ستون ها باهم یکسان هستند. حال ما می توانیم ترسیمی از نقاط را به صورت زیر داشته باشیم:

>> clf

>> plot(x,y,’o’)

 

 

حال ما ماتریس y را مقدارری تغییر می دهیم:

>> y = [[1; 2; 3] [1; 1.5; 2] [0; .2; .4]]

 

y =

 

۱٫۰۰۰۰    ۱٫۰۰۰۰         ۰

۲٫۰۰۰۰    ۱٫۵۰۰۰    ۰٫۲۰۰۰

۳٫۰۰۰۰    ۲٫۰۰۰۰    ۰٫۴۰۰۰

در ترسیم با این داده ها مانند یک مثلث خمیده به نظر می رسد:

>> plot(x,y,’o’)

 

 

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

>> z = 5*ones(3,3)

 

z =

 

۵     ۵     ۵

۵     ۵     ۵

۵     ۵     ۵

 

>> surf(x,y,z)

 

 

 

البته مقادیر z لازم نیست که همیشهه با آرایه های ثابت باشد:

>> z = [[4; 5; 6] [4.5; 5; 5.5] [4.9; 5; 5.1]]

 

z =

 

۴٫۰۰۰۰    ۴٫۵۰۰۰    ۴٫۹۰۰۰

۵٫۰۰۰۰    ۵٫۰۰۰۰    ۵٫۰۰۰۰

۶٫۰۰۰۰    ۵٫۵۰۰۰    ۵٫۱۰۰۰

 

>> surf(x,y,z)

 

 

توابع گرافیکی دیگر نیز می تواند شبکه های غیر مستطیلی را اداره کند. برای مثال با استفاده از تابع contour   :

>> cs = contour(x,y,z,’k’);

>> clabel(cs)

>> i = [1 4 7 9 6 3 1];

>> hold on

>> plot(x(i),y(i),’:’)

 

 

 

مقدار خطوط (contour) با استفاده از دستور clable برچسب شده است و منطقه تعریف شده توسط نقاط x و y با خط چین مشخص شده است. خطوط با برچسبهایی کوچک با علامت (+) مشخص شده است.

بردار i از نقاط مناسب ماتریس های x و y با استفاده از نمایه سازی ستونی استخراج شده است.دیگر سطوح گرافیکی ، تابع mesh , surfl , surfc و contour در کاریرد شبکه های غیر مستطیلی میتواند مناسب باشد. تابع های imag و imagesc برای شبکه های مستطیلی مناسب نمی باشد. (تابع pcolor یک سطحی ترسیم می کند و یک نقطه نمایش را به صورت مستقیم از بالا قرار می دهد، بنابریا از آن به طور جداگانه بحث خواهد شد.)

ما می خواهیم یک مجموعه ای از نقاطی را که تعریف کنیم یک ناحیه نیمه حلقوی را پوشش دهد.( شکل زیر) به منظور تعریف چنین مجموعه ای از نقاط ما با استفاده از شبکه های قطبی بر اساس مختصات شعاعی و زاویه ای (r و θ) استفاده می کنیم. برای مثال ما از محدودیت های زیر در مختصات استفاده می کنیم:

 

 

این سطح در متلب به شرح زیر می باشد:

>> rv = linspace(.3,1,50);

>> thv = linspace(pi/4,5*pi/4,50);

>> [r,th] = meshgrid(rv,thv);

 

در اینجا از فرمان linspace که یک بردار از ۵۰ نقطه با فاصله های مساوی  استفاده شده است. نقاط x و y به وسیله روابط مثلثاتی تعریف می شود.

>> x = r.*cos(th);

>> y = r.*sin(th);

 

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

>> plot(x,y,’.’)

 

دوباره ما می توانیم ماتریس z را به طور دلخواه تعریف کنیم. ما در اینجا از تابع  peaks در اندازه واقعی استفاده می کنیم، و یک سطح با خطوط شیب دار اضافه می کنیم:

>> z = peaks(50) + 10*x;

>> surf(x,y,z)

 

 

همانند مثال قبلی ما کار تابع contour را امتحان می کنیم.( برچسب ها را حذف می کنیم و تعداد خطوط تا ۳۰ را افزایش می دهیم)

>> contour(x,y,z,30);

 

 

ممکن است متوجه شده باشید که در منطقه نیمه حلقوی بصورت یک بخش مدور(دایره ای) ظاهر نشده است. به دلیل این است که محور به صورت مربع(square)  نیست. برای مربع (square) کردن محور فرمان axis square را وارد کنید.

>> axis square

 

 

 

 

———————————–

 

 
برچسب‌ها: contour, clabl, axis, peaks, linspace

+ نوشته شده در  جمعه یازدهم اسفند ۱۳۹۱ساعت ۱:۳۴  توسط رضا  |  آرشیو نظرات

پایه ترسیم (meshgrid – mesh – surf- surfl – surfc – contourf – contour3-imagesc)

 

یک سطح در متلب توسط مختصات Z مرتبط با مجموعه ای از مختصات (x، y) تعریف شده است. به عنوان مثال، فرض کنید ما یک مجموعه ای از مختصات (x، y) را داریم:

 

نقاط می تواند به صورت (x,y) های جفت رسم شود.

 

(x,y) های جفت می تواند به صورت مجزا در ماتریس های جداگانه نوشته شود:

ماتریس x در امتداد سطون و ماتریس y در امتداد ردیف با یکدیگر متفاوتند. ما می توانیم صفحه zرا به صورت زیر تعریف کنیم:

 

که در آن z فاصله (x,y) از  مبدا مختصات است. برای محاسبه z  ابتدا باید ماتریس های x  و y در برنامه متلب تعریف کنیم. ما با استفاده از تابع meshgrid شروع می کنیم.

 

>> [x,y] = meshgrid(1:4)

 

x =

 

۱     ۲     ۳     ۴

۱     ۲     ۳     ۴

۱     ۲     ۳     ۴

۱     ۲     ۳     ۴

 

 

y =

 

۱     ۱     ۱     ۱

۲     ۲     ۲     ۲

۳     ۳     ۳     ۳

۴     ۴     ۴     ۴

 

حال ما می توانیم به راحتی با تبدیل معادله فاصله ها با توجه به فرمول فوق z را بدست آورد. برای جذر گیری از تابع sqrt استفاده می کنیم.

>> z = sqrt (x.^2 + y.^2)

 

z =

 

۱٫۴۱۴۲    ۲٫۲۳۶۱    ۳٫۱۶۲۳    ۴٫۱۲۳۱

۲٫۲۳۶۱    ۲٫۸۲۸۴    ۳٫۶۰۵۶    ۴٫۴۷۲۱

۳٫۱۶۲۳    ۳٫۶۰۵۶    ۴٫۲۴۲۶    ۵٫۰۰۰۰

۴٫۱۲۳۱    ۴٫۴۷۲۱    ۵٫۰۰۰۰    ۵٫۶۵۶۹

ما می توانیم  صفحه z را به عنوان یک تابعی از  x و y ترسیم کنیم:

 

>> mesh(x,y,z)

 

ما می توانیم با افزایش ورودی ها در تابع meshgrid در دامنه محاسباتمان را گسترش دهیم. بهتر است در انتهای خط فرمان از علامت ; (سیمیکلون) استفاده کنیم تا غرق اعداد نشویم. برای مثال:

 

>> clear , close all

>> [x,y]=meshgrid(-10:10);

>> z=sqrt(x.^2+y.^2);

>> mesh(x,y,z)

 

 

تصویر یک مخروط معکوس که راس آن در نقطه (۰,۰,۰) می باشد.

یک سطح بسیار جالب و جذاب

در متلب فرمول بالا را باید به صورت زیر وارد کنید:

>> z = 3*(1-x).^2.*exp(-(x.^2) – (y+1).^2) …

– ۱۰*(x/5 – x.^3 – y.^5).*exp(-x.^2-y.^2) …

– ۱/۳*exp(-(x+1).^2 – y.^2);

اما لازم نیست که ما این فرمول را وارد کنیم. چون قبلا در برنامه متلب این فرمول در تابع   peaksتعریف شده است. قبل از ترسیم ما داده ها را تعریف می کنیم و colormap را در حالت خاکستری (gray) قرار می دهیم.

 

>> [x,y,z] = peaks;

>> colormap(gray)

 

 

در زیر ۹ روش برای اطلاعات فوق ترسیم و نمایش داده شده:

 

 

>> clf

>> plot (z)

 

 

 

 

>> mesh(x,y,z)

 

 

 

 

 

>> surf(x,y,z)

>> shading flat

 

 

 

 

 

>> surfl (x,y,z)

>> shading flat

 

 

 

 

>> contour(x,y,z)

 

 

 

 

>> imagesc(z)

>> axis xy

 

 

 

 

>> surfc(x,y,z)

 

 

 

 

>> contourf(x,y,z)

 

 

 

 

>> plot3(x,y,z,’k’)

>> hold on

>> contour3(x,y,z,’k’)