سورها و انواع آن در متلب|معنی+تصاویر (جلسه چهل و دوم)

سورها در متلب
سورها در متلب

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

جلسه‌ی پیش در رابطه با عدد طلایی در متلب صحبت کردیم. در این جلسه قصد داریم راجع به سورها و انواع آن در متلب صحبت کنیم.

سور در ریاضیات (مفهوم)

می‌خواهیم در مورد سورها در ریاضیات صحبت کنیم. سور در زبان عربی به معنی حصار دور شهر است که آن قسمت را از بقیه قسمت‌‌های شهر جدا می‌کند.

در منطق هم سور باعث می‌شود که دامنه‌ی گزاره‌ها محدود شوند. به طور کلی سه نوع سور داریم که کاربرد بیشتری هم دارند. سور عمومی داریم که به انگلیسی به آن universal quantification می‌گویند. سور وجودی داریم که به انگلیسی existential quantifier گفته می‌شود و سور صفر داریم که به آن non-existential quantifier گفته می‌شود.

سور عمومی که نماد آن با  نشان داده می‌شود، نماد A برعکس است و حرف A هم از All می‌آید.

  • سور عمومی (universal quantification)
  • سور وجودی (existential quantifier)
  • سور صفر (not existential quantifier)

سور عمومی، وجودی و صفر داریم. علامت سور عمومی A است که از همان All می‌آید. سور وجودی، E است که از  existential می‌آید و علامت سور صفر هم یک E است که روی آن خط خورده شده است که به معنی not existential است.

معنی این‌ها چیست؟ یعنی به ازای همه‌ی xهایی که اعداد طبیعی زوج 2x هستند. شاید کمی غیر قابل فهم باشد. باید کمی بیشتر توضیح دهم. زیرا دیگر دارد وارد ریاضیات می‌شود. ولی به صورت کلی سور عمومی یعنی به ازای همه.

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

حال وارد خود برنامه متلب می‌شویم و شروع می‌کنیم در مورد برنامه توضیح دهیم. ما با سور صفر کاری نداریم. ولی سور عمومی در برنامه متلب دقیقاً مانند All کار می‌کند. all را بزنیم سور عمومی برای ما نمایش داده می‌شود. و any هم مانند سور وجودی (existential quantifier) است. این‌ها را در برنامه متلب هم نمایش می‌دهیم.

وارد command window می‌شویم تا کدها را برایتان شرح دهیم. فرض کنید که یک X داریم که X برابر است با [1 4 5 6]. بعد از اینکه X را تعریف کردیم، می‌گوییم any (X==3) آیا x برابر ۳ای در این مجموعه X بالایی وجود دارد؟ ans می‌شود صفر و از نوع logical است یعنی وجود ندارد.

بار دیگر به این صورت می‌نویسیم any (X>3) آیا Xهای بزرگتر از ۳ وجود دارند؟

Answer یک می‌شود. یعنی بله، وجود دارد. خطا برای نوشتن x کوچک بود. در صورتی که مجموعه‌ی ما با X بزرگ نمایش داده شده است.

پس X بزرگتر از ۳ هم در این مجموعه وجود دارد و حال می‌خواهیم سور عمومی  را بررسی کنیم.

آیا تمام Xها بزرگتر از ۴ هستند؟ خیر. این‌طور نیست. پس جواب صفر می‌شود. یعنی چنین چیزی اشتباه است.

با توجه به همین بحث که گفتیم، الان می‌خواهیم بررسی کنیم که آیا r و q که برای عدد طلایی در دنباله فیبوناچی تعریف کردیم، برابر هستند یا خیر. چگونه می‌نویسیم؟ آیا تمام r و qها با هم برابرند؟ جواب درست است. یعنی همه با هم برابر هستند.

می‌گوییم آیا تک تک اعضا …

به نظر شما any (r==q) به چه معناست؟ چه تفاوتی با all دارد که گفت تک‌تک اعضا با هم برابرند؟ در اینجا حتی اگر یک مورد هم برابر باشد و یکی از اعضای r و q با هم برابر باشند، در آن صورت true و جواب ۱ می‌شود. در اینجا همه اعضا برابرند. بنابراین جواب این مورد هم true است.

در اینجا در کد برنامه q را به صورت دیگری نیز می‌توان تعریف کرد. مثلا می‌توان به جای ۱۰۰ نوشت end و خودش متوجه می‌شود که end همان ۱۰۰ است و در بالا تا ۱۰۰ تعریف شده بود. و می‌توانیم به جای ۹۹ بنویسیم end-1.

مشاهده می‌کنید که دقیقا همان می‌شود و تفاوتی نکرده است.

دیگر چه کاری می‌توان انجام داد؟ قبل از آن یک دستوری داریم که مثلا می‌خواهیم شکل r را plot کنیم. می‌نویسیم plot(r);

این دستور برای ما شکل r را نمایش می‌دهد.

الان اگر ‌run کنیم، r را برای ما به نمایش درمی‌آورد که می‌بینید هرچه به جلوتر می‌رویم به عدد طلایی نزدیک‌تر می‌شویم. یعنی به اصطلاح همگرا می‌شود.

حال در مورد plot اگر خواستید، می‌توانیم در آموزش‌های دیگر بیشتر راجع به آنها صحبت کنیم زیرا بسیار به درد بخور هستند. حتما به من اعلام کنید که اگر خواستید، ویدیوهای مجزایی برای این مبحث اختصاص می‌دهم.

پس در اینجا یک حلقه‌ی for و یک vectorize کردن داشتیم. حلقه for را در اینجا می‌توان نوشت و کار خاصی ندارد ولی سرعت برنامه پایین می‌آید. پس همیشه باید دقت داشته باشیم که تا جایی که امکان دارد، از حلقه‌ها استفاده نکنیم زیرا با vectorize کردن برنامه‌ی ما سریع‌تر می‌شود.

در اینجا اگر بخواهیم یک مثال دیگری بیان کنیم، فرض کنید که ۱۰۰ را برداریم و به جای آن N بنویسیم. بعد از آن هم N را در ابتدا تعریف کنیم که برای مثال همان ۱۰۰ می‌شود. می‌خواهیم ببینیم چقدر طول می‌کشد که برنامه ما run شود.

آن را run می‌کنیم.

مشاهده می‌کنید که N هم در قسمت workspace اضافه شده است.

در اینجا برای اینکه بفهمید run شدن برنامه ما چقدر طول می‌کشد، از چه چیزی استفاده می‌کنیم؟ از تابعی به نام tic toc استفاده می‌کنیم. وقتی تابع tic فراخوانی می‌شود، می‌آید از آن لحظه زمان را اندازه‌گیری می‌کند و پس از این که تابع toc را فراخوانی می‌کنیم، آن لحظه می‌آید زمان را از آخرین لحظه‌ای که tic فراخوانی شده بود محاسبه می‌کند. الان در اینجا برای شما آن را شرح می‌دهم. N ما ۱۰۰ بود. ما از اینجا تابع tic را فرامی‌خوانیم تا بعد از end در خط ۱۰. می‌خواهیم ببینیم چقدر طول‌ می‌کشد که اعداد طلایی ما را به صورتی که نوشته شد، دست بیاورد.

پس طبق نکته‌ای که گفتیم از اولین جایی که tic را نوشتیم شروع می‌کند و مانند یک کورنومتر کار می‌کند تا جایی که toc را گفتیم، آخرین tic را نگاه می‌کند و اندازه می‌گیرد.

توجه کنید که ما می‌خواستیم toc را برای خود دنباله تا بعد از end در خط هفتم به دست آوریم. و اینکه فعلا با خط ۸ تا ۱۱ در تصویر بالا کاری نداریم.

یک ; هم در انتهای خط ۹ قرار می‌دهیم که آن را در پایین نمایش ندهد و command window را هم می‌بندیم حال می‌خواهیم مشاهده کنیم که در این صورت چقدر time ما طول می‌کشد که این دنباله با حلقه for اجرا شود.

Run را می‌زنیم.

مشاهده می‌کنید که این timeای است که طول می‌کشد که این برنامه با حلقه‌ی for اجرا شود.

حال اگر این ۱۰۰ را برای مثال ۱۰۰۰۰ کنیم، مسما زمان بیشتر می‌شود. عدد ۸۸۹ را به یاد داشته باشید.

یک بار run می‌گیریم. مشاهده می‌کنید که زمان بسیار زیادتر شد.

فضای F را در workspace مشاهده کنید که چقدر است.

۱۰۰۰۰ تا اگر در ۴ ضرب شود، تقریبا ۴۰۰۰۰ بایت می‌شود. ۴۰۰۰۰ بایت تقسیم بر ۱۰۲۴ 39.0625 کیلوبایت و این دستور ما ۴۰۰۰۰ تقسیم بر ۱۰۲۴ تقسیم بر ۱۰۲۴ مگ حافظه اشغال کرده است.

و عدد N را اگر همین‌طور بیشتر کنیم، مثلاً دو صفر دیگر جلوی آن قرار دهیم، مشاهده می‌کنید که زمان ما همین‌طور افزایش پیدا می‌کند.

باز هم یک صفر دیگر به آن اضافه می‌کنیم و  run می‌کنیم. باز هم مشاهده می‌کنید که کمی بیشتر طول کشید.

باز هم یک صفر دیگر اضافه می‌کنیم و دوباره run می‌کنیم. مشاهده می‌کنید که دیگر خیلی دارد طول می‌کشد.

یک منطق بسیار ساده را هنوز دارد اجرا می‌کند.

۹ ثانیه تقریبا طول کشید تا این منطق ساده را اجرا کند و این مشکل همان ضعفی است که به خاطر عدم برنامه‌نویسی صحیح به وجود می‌آید. این مشکل، مشکل برنامه متلب نیست. زیرا محاسبات ما بسیار ساده است و از نحوه‌ی برنامه‌نویسی ما این مشکل به وجود آمده است.

در این قسمت اگر indicate را مشاهده کنید، در قسمت حلقه for یک فلش زده است. یعنی مشکل از حلقه‌ی for ما است.

اما در اینجا برنامه متلب به ما هیچ هشداری نداده است. گاهی اوقات اعلام می‌کند. ولی خود شما باید حواستان جمع باشد که در اینجا به جای حلقه for، …

در جلسه آینده در رابطه با مفهوم preallocating در متلب صحبت خواهیم کرد.

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

برای کسب اطلاعات بیشتر در مورد متلب میتوانید به مقاله آموزش متلب مقدماتی مراجعه کنید.

برای ثبت سفارش لطفا در تلگرام یا واتساپ یا ایتا به شماره 09104503300 پیام دهید.