سلام
وقت بخیر
دکتر زهرا مروج با مرتبهی استاد تمام در دانشگاه سمنان ترمهای زیادی هست که به تدریس درس حفاظت و رله میپردازن.
بنده دانشجوی ایشون بودم در مقطع کارشناسی. دو فایل PDF از تمرینهای مرتبط با این درس در مورد طراحی حفاظت دیفرانسیل ترانس و باسبار، و همچنین طراحی رلههای دیستانس از ترم ۹۷-۹۸ ایشون رو براتون به اشتراک میذارم؛ تمرینهای ارزشمندی هستن و فکر نمیکنم جایی بتونید مشابه اینها رو به راحتی تهیه کنید. چون خودم هم خیلی دنبالش گشتم ولی متاسفانه منابع بسیار محدود هستند بخصوص منابع سوال همراه با پاسخ.
برای دانلود فایلها ادامهی مطلب رو باز کنید.
ادامه مطلبسلام رفقا
توی این پست میخوام روش سادهای برای بدست آوردن دنبالهی فیبوناچی با استفاده از دستورات متلب رو براتون توضیح بدم.
برای این کار پیشنیاز زبان برنامهنویسی متلب (پایهی زبان C) و اندکی هم فلوچارت نویسی هست که البته اصلا نگران نباشید اگر این ها رو بلد نیستید. چون زبانی بسیار سادهست و به راحتی میتونید تحلیلش کنید
همونطور که میدونید دنبالهی فیبوناچی این شکلیه:
1, 1, 2, 3, 5, 8, 13, 21 و.
اگر کمی بهش دقت کنید متوجه میشید که در مرحله اول عدد ۱ رو با ۱ جمع میکنیم. مرحله دوم یا به عبارتی جملهی سوم دنبالهی فیبوناچی با جمع کردن دو جملهی قبلی حاصل میشه یعنی اگر جملات رو با fn مشخص کنیم، جمله سوم دنباله از طریق رابطهی f3=f2+f1 بدست میاد. و همینطور جمله چهارم هم از حاصل جمع جملهی دوم و سوم، جملهی پنجم از حاصل جمع جملهی چهارم و سوم و الی آخر.
دقیقا کاری که ما میخوایم توی محیط متلب انجام بدیم:
این کدها رو ببینید:
clc; clear all; i=0; f1=1; f2=1; n=input('set n value:'); while(i<n) if i<=n disp(f1); f3 = f2+f1; f1 = f2; f2 = f3; i=i+1; elseif i>n disp(f1); break; end end
برای توضیحش از خط اول شروع میکنیم و خط به خط میریم جلو
۱. این دستور به منظور تمیز کردن command prompt متلب استفاده میشه و یه جورایی کدهای اضافی رو از صفحه پاک میکنه.
۲. هر متغیری که توی workspace شما ذخیره شده باشه با این دستور پاک میشه.
۳. برای حلقههایی که داریم باید از یه شمارنده استفاده کنیم. متغیر i رو برای شمارش تعداد تکرارهای حلقهمون استفاده میکنیم.
۴. جملهی اول دنبالهی فیبوناچی رو با مشخص کردن مقدار اولیه برای متغیر f1 مشخص میکنیم.
۵. مشابه خط قبلی، جملهی دوم دنباله رو با مشخص کردن مقدار اولیه برای متغیر f2 مشخص میکنیم.
۶. حالا وقتشه از کاربر بپرسیم که میخواد این دنباله تا چند جمله نمایش داده بشه. یعنی تا کجا این کار ادامه پیدا کنه؟! این مقدار رو از کاربر درخواست میکنیم و اون رو توی متغیر n قرار میدیم.
۷. ما نیاز به یه حلقه داریم. برای اینکه مجبور نباشیم تمام جملات دنباله رو خودمون وارد کنیم! و این کار توسط کامپیوتر انجام بشه. بنابراین یه حلقه با شرط تعریف میکنیم و شرط توقف حلقه رو اینطور تعریف میکنیم: مادامی که تعداد جملات نوشته شده به عدد انتخابی کاربر نرسیده حلقه را تکرار کن.
۸. حالا باید مشخص کنیم که اگر هنوز تعداد جملاتی که نوشته شده به تعداد جملاتی که کاربر انتخاب کرده نرسیده، چه اتفاقی باید بیفته! پس یه شرط میذاریم و مقدار شرط رو مطابق کدی که نوشتیم انتخاب میکنیم.
۹. توی خط اول، اولین جملهی دنبالهی خودمون رو چاپ میکنیم.
۱۰. مقدار جملهی سوم رو از مقدار دو جملهی قبلی محاسبه میکنیم.
۱۱. از اینجا به بعد یک مقدار کمی پیچیده میشه ماجرا. چرا؟! چون باید یک سری تغییراتی توی جملاتمون بدیم. به توضیحات زیر دقت کنید:
شما در تکرار اول این حلقه، مقدار f3 رو محاسبه میکنید. یعنی تا الان اعداد زیر رو بدست آوردید:
f1, f2, f3
1, 2, 3
و جملهی اول رو چاپ کردید. یعنی تا الان خروجیتون به این صورته:
1
توی خط ۱۱ کاری که ما انجام میدیم اینه که، اعداد رو یه دونه به عقب هل میدیم. یعنی چی؟ دنباله فیبوناچی رو اینجا رو ببینید:
f1, f2, f3, f4, f5, f6, .
1, 1, 2, 3, 5, 8, .
و کاری که ما در این مرحله و مرحلهی بعدی یعنی خط ۱۲ انجام میدیم این دنباله رو به شکل زیر تغییر میده:
f1, f2, f3, f4, f5, f6, .
1, 2, 3, 5, 8, 13, .
فهمیدید چی شد؟ ما با این کار عدد اول دنباله رو نوشتیم و از گردونهی اعداد خارجش کردیم.
حالا باید دوباره اولین عددی که داریم رو بنویسیم.
۱۲. توضیحات مرحلهی (خط) ۱۱ رو با دقت بخونید.
۱۳. شمارندهی ما برای اینکه بتونیم تشخیص بدیم تو چه مرحلهای هستیم باید یک واحد افزایش پیدا کنه.
۱۴. اما اگر از ابتدا، جملهای که مشخص کردیم یا عدد n برابر صفر بود چی؟!
۱۵. فقط مقدار جملهی اول یا همون ۱ در خروجی نوشته میشه و دستور توقف برنامه صادر میشه.
حالا خودتون هم این کار رو انجام بدید.
ممنون میشم اگر سوالی داشتید از طریق کامنتها مطرح کنید تا با هم دیگه بهش پاسخ بدیم.
این پست رو به دوستانتون هم معرفی کنید.
سلام به عزیزان همراه
طبق روالی که در پیش گرفتیم تا به حال دو مثال کاربردی و خوب رو از کدهای متلب در دو پست گذشته باهم بررسی کردیم. تا به حال بدست آوردن مقدار سینوس زاویه از روی بسط تیلور و همچنین بدست آوردن جملهی nام دنبالهی فیبوناچی رو باهم بررسی کردیم.
توی پرانتز:
علت اینکه با مثال پیش میبریم آموزشها رو اینه که اگر ما بخوایم توابع رو دونه دونه و از پایه توضیح بدیم، روند آموزش بسیار طولانی میشه و شاید هرگز به این مقدار کاربردی نباشه. توی مثالها توضیحات به حدی کافی هستند که شما بتونید از توابعی که به کار رفته در برنامههای خاص خودتون استفاده کنید.
در این پست سعی دارم تا روش مقلوب کردن اعداد رو با استفاده از دستورات متلب به شما یاد بدم. اما مقلوب یعنی چه؟ به مثال زیر دقت کنید:
فرض کنید ما یک عدد ۶ رقمی مشابه عدد زیر داریم:
۱۲۳۴۵۶
و اگر این عدد رو مقلوب کنیم:
۶۵۴۳۲۱
به همین سادگی! یعنی ارقام این عدد شش رقمی رو برعکس ردیف کنیم!
حالا برای این کار میشه به سادگی از کدهای زیر استفاده کرد:
clc; clear all; x=input('insert your number: '); m=mod(x,10); while(1) x=floor(x/10); m=mod(x,10)+(10*m); if floor(x/10)==0 out=['the inverse is equal to: ',num2str(m)]; disp(out); break; end end
خطوط اول و دوم که مطابق توضیحات قبلی مربوط به تمیز کردن command prompt و workspace هستند.
در خط سوم ما با دستور input عددی رو که کاربر مایل به مقلوب کردنش هست رو دریافت میکنیم و اون رو توی متغیر x ذخیره میکنیم.
متغیر m در واقع جایی هست که ما تغییرات رو در اون انجام میدیم و در نهایت مقدار عدد نهای رو از طریق این متغیر توی خروجی تحویل میدیم.
برای اینکه رقم یکان رو از عدد ورودی جدا کنیم از دستور mod استفاده میکنیم. این یعنی x رو بر 10 تقسیم کن و بعد، باقیماندهی این تقسیم رو در m قرار بده.
مطابق دو برنامهی قبلی که نوشتنش رو تمرین کردیم، اینجا هم برای انجام کار توسط سیستم به یک حلقه و یک شرط توقف احتیاج داریم. چرا حلقه؟ فرض کنید عدد وارد شده 14 رقمی! باشه. اون وقت علت وجود حلقه رو شاید بهتر بشه درک کرد!
در اولین دستور داخل حلقه، دستوری که با floor مشخص شده خروجی حاصل تقسیم عدد ورودی بر ۱۰ رو به سمت پایین گرد میکنه تا مقدار اعشار رو از انتهای این عدد بندازه. به مثال زیر توجه کنید:
5423 >> 5423/10 >> 542.3 >> floor(542.3)=542
قبل از ورود به حلقه به سادگی رقم یکان رو جدا کردیم. این مقدار حالا با ارزشترین رقمیه که در اختیار داریم. از طرفی عدد جدید رو با استفاده از اولین خط دستور درون حلقه تشکیل دادیم. با تکرار دستوری که خارج از حلقه نوشته شده بود، و کمارزشترین رقم اون عدد رو برای ما جدا میکرد، میتونیم رقم بعدی رو از عدد اصلی جدا کنیم. کافیه پر ارزشترین رقمی که در اختیار داریم، یا یکان رو با ضرب کردنش در عدد 10 یک جایگاه بالاتر ببریم و با رقم بعدی که بدست آوردیم جمع کنیم! با این کار به سادگی دو رقم از سمت راست عدد اصلی جدا کردیم و به صورت برعکس نوشتیمشون!
میتونید بگید در تکرار بعدی حلقه چه اتفاقی میافته؟!
بله! رقم بعدی از عدد اصلی جدا میشه و کنار m مینشینه! به همین ظرافت.
شرط توقفی که برای این تکرار تعیین کردیم اینه که اون عدد گرد شدهی رو به پایین دیگه بشه صفر! و در واقع بعد از اون هیچ رقم دیگری وجود نداشته باشه. چرا؟! (کامنت کنید)
برای نمایش خروجی هم از دستور disp استفاده میکنیم.
موافق این آموزش بودید؟!
اگر این آموزش و آموزشهای قبلی رو مفید میدونید، ما رو به دوستان خودتون و کسانی که فکر میکنید این مطالب بدردشون میخوره معرفی کنید.
فایل کدها بزودی روی سایت قرار میگیره.
سلام دوباره
هفتهی پیش بود اگر اشتباه نکنم که روش بدست آوردن جملهی nام دنبالهی فیبوناچی رو با استفاده از کدهای دستوری متلب یاد دادیم. فایلش هم موجوده که میتونید برید به رایگان دانلود کنید و استفاده کنید.
این دفعه قصد دارم بهتون یاد بدم چطوری با استفاده از بسط تیلور توابع سینوس یا کسینوس، مقدار سینوس زاویهی دلخواهتون رو فقط با نوشتن چند خط کد ساده بدست بیارید.
خب. برای شروع اول باید بدونیم که بسط تیلور تابع سینوس به چه صورت نوشته میشه. به رابطهی زیر دقت کنید:
خب. همونطور که مشاهده میکنید، طرف دوم این تساوی یک دنبالهای از اعداد رو شامل میشه که در واقع هرچقدر مقدار جملات بیشتر باشن، دقت خروجی شما (یعنی مقدار سینوس زاویهی بدست اومده) دقیقتر خواهد بود. به تفاوت دو مقدار بدست اومدهی زیر دقت کنید؛ بار اول تعداد تکرارها یا جملات بسط تیلور رو برابر یک قرار دادیم و خروجی سینوس زاویه Pi/6 برابر 0.5236 شده. در حالی که شما میدونید سینوس ۳۰ درجه دقیقا برابر 0.5 هست.
x is the angle & n is the number of iterrations set x value: pi/6 set n value: 1 0.5236
حالا اگر تعداد جملات رو بیشتر کنیم چی میشه؟ ببینید:
x is the angle & n is the number of iterrations set x value: pi/6 set n value: 5 0.5000
همونطور که میبینید به سادگی با افزایش تعداد جملات از ۱ به ۵ دقت خروجی به طرز چشمگیری تغییر میکنه. شاید بگید حالا که با ۵ تا جمله این اتفاق میافته چه کاریه n رو خیلی بزرگ انتخاب کنیم؟! خب پاسخ در این خلاصه میشه که ۱. همیشه اینطور نیست که با ۵ جمله به دقت مطلوب برسید و ۲. مختارید که چه تعداد از جملات رو استفاده کنید.
اما کد اصلی که منتج به این خروجی میشه چیه.
کدهای زیر رو نگاه کنید تا توضیحاتش رو باهم مرور کنیم:
clear all; clc; s=0; disp('x is the angle & n is the number of iterrations'); x=input('set x value: '); n=input('set n value: '); m=1; i=1; f=x; while(i<=n) h=factorial(i); z=(f/(h*m)); s=s+z; if i<n i=i+2; f=f*x*x; m=-m; else break; end end disp(s);
در بخش اول این کدها، همونطور که در ابتدا توضیح دادیم، مقادیر n (یعنی تعداد جملات بسط تیلور) و x (یعنی زاویهای که میخوایم سینوسش رو محاسبه کنیم) رو از کاربر دریافت میکنیم و اونها رو توی متغیرهایی به همون اسم ذخیره میکنیم. مقادیر m، i و f هم به ترتیب متغیرهایی هستن که داخل حلقهها و شرطهامون ازشون استفاده میکنیم.
برای اینکه هربار یک جمله از این بسط رو تولید کنیم و با مقادیر قبلی جمع کنیم تا در نهایت به خروجی مطلوبمون برسیم باید از یک حلقه استفاده کنیم. شرط توقف این حلقه رسیدن شمارندهی i به تعداد جملات انتخاب شده توسط کاربر یعنی n هست.
داخل این حلقه هربار مقدار فاکتوریل دیده شده در فرمول رو تولید میکنیم و اون روی توی h قرار میدیم.
z مقدار محاسبه شدهی خروجی بسط تیلور در جملهی iام هست و با کمی دقت به فرمول و کد نوشته شده متوجه ارتباطشون خواهید شد.
اما خروجی اصلی باید مجموع مقادیر z محاسبه شده تا اون جمله باید باشه و این کار رو با جملهی بعدی یعنی s=s+z انجام میدیم.
برای ادامهی روند باید یک سری شروط رو چک کنیم تا در صورتی که شرطها برقرار نبودن برنامه متوقف بشه و یا در صورتی که نیاز به ادامهی روند وجود داشت، یک سری تغییرات در مقادیر متغیرها ایجاد کنیم.
شرط اصلی این برنامه رسیدن شمارنده i به مقدار n انتخاب شده توسط کاربره. پس مادامی که i به n نرسیده، برنامه باید به کار خودش ادامه بده. اما برای اینکه به مرحلهی بعدی بریم اول باید مقدار شمارنده i و مقدار f یا در واقع همون x که در هر مرحله توانش تغییر میکنه و همچنین علامت جمله رو که با متغیر m تعیین میکنیم تغییر بدیم. برای درک این قسمت با دقت به فرمول بسط تیلور تابع سینوس نگاه کنید.
بعد از ایجاد تغییرات در متغیرهامون باید به ابتدای حلقه بریم و مجدد کارهایی که در خطوط قبلی توضیح دادیم رو تکرار کنیم.
ممنونم که همراهی میکنید.
اگر این متلب برای شما یا اشخاصی که میشناسید مفید بود، ممنون میشم نظرات خودتون رو با من به اشتراک بذارید. همچنین خوشحال میشم اگر این صفحه رو به کسانی که فکر میکنید علاقمند هستند یا بهش نیاز دارن معرفی کنید.
اگر سوالی دارید از طریق نظرها بپرسید تا جواب بدم.
فایل این برنامه رو بزودی از زیر همین پست به رایگان میتونید دریافت کنید.
درباره این سایت