🔵اعداد تصادفی در متلب(مقدمه: عدد تصادفی چیست؟)🔵
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیشنیاز:ندارد
برای:همه
برای همه ما پیش آمده است که با سوالاتی مانند پیدا کردن ادامه دنباله ای عددی مانند دنباله زیر روبرو شویم:
5,1,1,2,5,3,3,8,2,4,…
گاهی اوقات با تلاش زیاد می توانیم ادامه دنباله را حدس بزنیم و گاهی هم شکست میخوریم در آن لحظه ممکن است تصور کنیم که دنباله هیچ "الگوی" مشخصی ندارد و کاملا تصادفی است که ناگهان متوجه میشویم دوست باهوش تر ما ادامه دنباله را یافته است! نتیجه گیری منطقی و طبیعی که به ذهن می رسد این است که هیچ گاه نمی توان ادعا کرد که یک دنباله تصادفی است چرا که "شاید الگویی دارد که ما نمی دانیم" در مواردی این ممکن است به مغلطه توسل به جهل هم منجر شود!(فکر کنید چرا)
مشکلاتی مانند این بسیاری از ریاضیدانانی که بر روی نظریه پیچیدگی محاسباتی کار می کردند را بر آن داشت تا تعریفی ریاضی از "تصادفی بودن" ارائه دهند. تعریف کولموگروف(Kolmogrov) در این میان از همه بیشتر مورد قبول قرار گرفت. این تعریف شهودی، جامع و زیبا است. بر اساس این تعریف دنباله ای تصادفی است که حجم کدی که برای تولید آن دنباله رندم تولید می شود( به صورت مجانبی) بیشتر یا مساوی با خود دنباله باشد. در اینجا منظور از "حجم کد" دقیقا به بایت است. به عبارت ساده تر وقتی هیچ الگوریتمی وجود نداشته باشد که حجم آن از حجم دنباله کمتر باشد دنباله هم قاعدتا هیچ الگویی ندارد.(تعریف algorithmically random)
این تعریف بسیار دقیق و از لحاظ تئوریک غنی است اما در کاربرد های واقعی ما به یک تعریف عملیاتی تر نیاز داریم. تعریف عملیاتی دنباله ی تصادفی، بر اساس مفهوم "از لحاظ آماری تصادفی"(statistically random) قرار دارد. بر اساس این تعریف هر دنباله ی تصادفی می بایست تعدادی تست آماری را با موفقیت پشت سر بگذارد تا بتوان نام "رندم" بر آن نهاد. در اینجا وارد جزییات نمی شویم ولی ویژگی هایی مانند پیروی کردن از توزیع یکنواخت(یعنی تمام اعداد شانس مساوی برای حضور در دنباله داشته باشند) یا ویژگی بیشینه آنتروپی از آن دسته اند.
حالا چطور اعداد تصادفی را در کامپیوتر ایجاد کنیم؟ هر گاه این سوال را از دانشجویانم میپرسم ابتدا کمی در فکر فرو می روند و سپس شوکه می شوند. چرا که بر خلاف دسترسی راحتی که برنامه ها به تولید اعداد تصادفی ایجاد می کنند یافتن الگوریتم ساخت اعداد تصادفی، غیر ممکن به نظر می رسد!
در واقع بیشتر این برنامه ها اصلا اعداد تصادفی واقعی تولید نمی کنند. آن ها اعداد شبه تصادفی تولید می کنند. اعداد شبه تصادفی دارای فرمول هستند و دنباله ای که ایجاد می کنند تست های آماری را با موفقیت پشت سر می گذارند. یکی از معروف ترین الگوریتم های در این زمینه linear congruent generator است که از یک رابطه بازگشتی مانند زیر استفاده می کند:
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیشنیاز:ندارد
برای:همه
برای همه ما پیش آمده است که با سوالاتی مانند پیدا کردن ادامه دنباله ای عددی مانند دنباله زیر روبرو شویم:
5,1,1,2,5,3,3,8,2,4,…
گاهی اوقات با تلاش زیاد می توانیم ادامه دنباله را حدس بزنیم و گاهی هم شکست میخوریم در آن لحظه ممکن است تصور کنیم که دنباله هیچ "الگوی" مشخصی ندارد و کاملا تصادفی است که ناگهان متوجه میشویم دوست باهوش تر ما ادامه دنباله را یافته است! نتیجه گیری منطقی و طبیعی که به ذهن می رسد این است که هیچ گاه نمی توان ادعا کرد که یک دنباله تصادفی است چرا که "شاید الگویی دارد که ما نمی دانیم" در مواردی این ممکن است به مغلطه توسل به جهل هم منجر شود!(فکر کنید چرا)
مشکلاتی مانند این بسیاری از ریاضیدانانی که بر روی نظریه پیچیدگی محاسباتی کار می کردند را بر آن داشت تا تعریفی ریاضی از "تصادفی بودن" ارائه دهند. تعریف کولموگروف(Kolmogrov) در این میان از همه بیشتر مورد قبول قرار گرفت. این تعریف شهودی، جامع و زیبا است. بر اساس این تعریف دنباله ای تصادفی است که حجم کدی که برای تولید آن دنباله رندم تولید می شود( به صورت مجانبی) بیشتر یا مساوی با خود دنباله باشد. در اینجا منظور از "حجم کد" دقیقا به بایت است. به عبارت ساده تر وقتی هیچ الگوریتمی وجود نداشته باشد که حجم آن از حجم دنباله کمتر باشد دنباله هم قاعدتا هیچ الگویی ندارد.(تعریف algorithmically random)
این تعریف بسیار دقیق و از لحاظ تئوریک غنی است اما در کاربرد های واقعی ما به یک تعریف عملیاتی تر نیاز داریم. تعریف عملیاتی دنباله ی تصادفی، بر اساس مفهوم "از لحاظ آماری تصادفی"(statistically random) قرار دارد. بر اساس این تعریف هر دنباله ی تصادفی می بایست تعدادی تست آماری را با موفقیت پشت سر بگذارد تا بتوان نام "رندم" بر آن نهاد. در اینجا وارد جزییات نمی شویم ولی ویژگی هایی مانند پیروی کردن از توزیع یکنواخت(یعنی تمام اعداد شانس مساوی برای حضور در دنباله داشته باشند) یا ویژگی بیشینه آنتروپی از آن دسته اند.
حالا چطور اعداد تصادفی را در کامپیوتر ایجاد کنیم؟ هر گاه این سوال را از دانشجویانم میپرسم ابتدا کمی در فکر فرو می روند و سپس شوکه می شوند. چرا که بر خلاف دسترسی راحتی که برنامه ها به تولید اعداد تصادفی ایجاد می کنند یافتن الگوریتم ساخت اعداد تصادفی، غیر ممکن به نظر می رسد!
در واقع بیشتر این برنامه ها اصلا اعداد تصادفی واقعی تولید نمی کنند. آن ها اعداد شبه تصادفی تولید می کنند. اعداد شبه تصادفی دارای فرمول هستند و دنباله ای که ایجاد می کنند تست های آماری را با موفقیت پشت سر می گذارند. یکی از معروف ترین الگوریتم های در این زمینه linear congruent generator است که از یک رابطه بازگشتی مانند زیر استفاده می کند:
مقادیر m معمولا بزرگ است(مانند m=2^64) و a و c هم به مقادیری ست می شوند که در پکیج های مختلف متفاوت است. یکی از مهمترین قسمت های این فرمول بازگشتی مقدار اولیه ای است که به آن داده می شود و به عنوان دانه(seed) اولیه الگوریتم شناخته می شود. هر دانه دنباله ای کاملا متفاوت ایجاد می کند. با آنکه الگوریتم ایجاد اعداد شبه تصادفی در تقریبا تمامی نرم افزار ها(حتی اپل) به صورت عمومی در دسترس است، این الگوریتم برای نرم افزار متلب نامشخص است و تنها به گفتن: "تولید اعداد شبه تصادفی" اکتفا شده است.
در قسمت بعد به جزییات اعداد تصادفی در متلب می پردازیم. اما قبل از آن به تولید اعداد تصادفی واقعی در کامپیوتر فکر کنید!
MatlabTips
#For_beginner ,
#For_intermediate, #For_Advanced
#Randomness, #Random
نویسنده:(#A_2)
در قسمت بعد به جزییات اعداد تصادفی در متلب می پردازیم. اما قبل از آن به تولید اعداد تصادفی واقعی در کامپیوتر فکر کنید!
MatlabTips
#For_beginner ,
#For_intermediate, #For_Advanced
#Randomness, #Random
نویسنده:(#A_2)
🔵دستورهای ابتدایی برای تولید اعداد تصادفی🔵
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیشنیاز:کدنویسی پایه
برای:مبتدیان
متلب دارای قابلیت تولید اعداد تصادفی است که این قابلیت در توابع rand، randn ، randi و randperm قرار گرفته است. تابع rand اعداد شبه تصادفی در بازه 0 تا 1 و به صورت یکنواخت تولید می کند. به طور مثال:
برای تولید اعداد تصادفی در بازه دلخواه [a,b] کافی است به صورت زیر عمل کنیم:
تابع randn اعداد شبه تصادفی با توزیع گاوسی(نرمال) با میانگین صفر و واریانس یک ایجاد می کند(N(0,1)) این توزیع در طبیعت بسیار رخ می دهد و در کاربردهای علمی و مهندسی بسیار مورد استفاده قرار می گیرد به طور مثال:
برای تولید اعداد شبه تصادفی با میانگین و واریانس دلخواه کافی است به صورت زیر عمل کنیم:
تابع randi هم اعداد تصادفی صحیح تولید می کند. به طور مثال تابع زیر یک ماتریس m در n از اعداد تصادفی در بازه 1 تا x را تولید می کند.
همچنین برای تولید اعداد تصادفی در یک بازه به صورت کلی داریم:
تابع randperm قدری متفاوت است زیرا وظیفه آن ایجاد یک جایگشت تصادفی از اعداد در یک بازه است. مثلا:
با اضافه کردن یک آرگومان دیگر می توان تعدادی از این اعداد را انتخاب کرد.(مثلا سه تا عدد به صورت تصادفی از بازه 1 تا 10)
تفاوت این تابع با randi این است که randi انتخاب تصادفی با جایگزینی است اما randperm بدون جایگزینی است.
@MatlabTips
#For_beginner
#Rand #Randi #Randn #Randperm #Random
نویسنده:(#A_2)
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیشنیاز:کدنویسی پایه
برای:مبتدیان
متلب دارای قابلیت تولید اعداد تصادفی است که این قابلیت در توابع rand، randn ، randi و randperm قرار گرفته است. تابع rand اعداد شبه تصادفی در بازه 0 تا 1 و به صورت یکنواخت تولید می کند. به طور مثال:
u = rand(3) %Generates a 3x3 matrix
u =
0.8147 0.9134 0.2785
0.9058 0.6324 0.5469
0.1270 0.0975 0.9575
برای تولید اعداد تصادفی در بازه دلخواه [a,b] کافی است به صورت زیر عمل کنیم:
u = a + (a-b)*rand
تابع randn اعداد شبه تصادفی با توزیع گاوسی(نرمال) با میانگین صفر و واریانس یک ایجاد می کند(N(0,1)) این توزیع در طبیعت بسیار رخ می دهد و در کاربردهای علمی و مهندسی بسیار مورد استفاده قرار می گیرد به طور مثال:
g = randn(2,3) %Generates a 2x3 matrix
g =
0.7147 -0.1241 1.4090
-0.2050 1.4897 1.4172
برای تولید اعداد شبه تصادفی با میانگین و واریانس دلخواه کافی است به صورت زیر عمل کنیم:
>> m = 10; %Mean
>> v = 9; %Variance
>> d = 1000; %Length
>> g = m + sqrt(v)*randn(d,1);
>> mean(g) %Mean
ans =
9.8529
>> var(g) %Variance
ans =
8.6272
>>std(g) %Standard Deviation
ans =
2.9372
تابع randi هم اعداد تصادفی صحیح تولید می کند. به طور مثال تابع زیر یک ماتریس m در n از اعداد تصادفی در بازه 1 تا x را تولید می کند.
>> b = randi(x, m, n);
>> b = randi(10, 2, 4)
b =
9 4 4 10
2 5 8 2
همچنین برای تولید اعداد تصادفی در یک بازه به صورت کلی داریم:
>> b = randi([x y], m, n)
تابع randperm قدری متفاوت است زیرا وظیفه آن ایجاد یک جایگشت تصادفی از اعداد در یک بازه است. مثلا:
>> b = randperm(10)
b =
1 9 10 5 7 2 4 3 6 8
با اضافه کردن یک آرگومان دیگر می توان تعدادی از این اعداد را انتخاب کرد.(مثلا سه تا عدد به صورت تصادفی از بازه 1 تا 10)
>> b = randperm(10,3)
b =
7 4 8
>> c = randi(10,1,3)
c =
7 2 2
تفاوت این تابع با randi این است که randi انتخاب تصادفی با جایگزینی است اما randperm بدون جایگزینی است.
@MatlabTips
#For_beginner
#Rand #Randi #Randn #Randperm #Random
نویسنده:(#A_2)
🔵یک فراکتال🔵
سطح پیچیدگی: 🌕🌑🌑🌑🌑
پیش نیاز: آشنایی مقدماتی
برای: مقدماتی
📝هدف از این پست:( آشنا شدن با یک فراکتال دیگر و آشنایی با روابط بازگشتی در متلب)
یک فراکتال نسبتا زیبا با استفاده از رسم خروجی های معادلات تفاضلی زیر که مجموعه ای از نقاط (Xk,Yk) می باشد، قابل رسم است. نقطه شروع را (0,0) انتخاب می کنیم.
سطح پیچیدگی: 🌕🌑🌑🌑🌑
پیش نیاز: آشنایی مقدماتی
برای: مقدماتی
📝هدف از این پست:( آشنا شدن با یک فراکتال دیگر و آشنایی با روابط بازگشتی در متلب)
یک فراکتال نسبتا زیبا با استفاده از رسم خروجی های معادلات تفاضلی زیر که مجموعه ای از نقاط (Xk,Yk) می باشد، قابل رسم است. نقطه شروع را (0,0) انتخاب می کنیم.
دقت کنید که هنگام رسم، نقاط را به هم متصل نکیند.
%% this program draws a fractal
% initial point
x0 = 0;
y0 = 0;
iter = 1e4; % number of iteration
% vectors to hold new points
x = zeros(1,length(iter));
y = x;
for i = 1:iter
% implementation of the fractal
x(i) = x0;
y(i) = y0;
x1 = y0 * (1 + sin(0.7 * x0)) - 1.2 * sqrt(abs(x0));
y1 = 0.21 - x0;
x0 = x1;
y0 = y1;
end
plot(x,y,'.')
معمولا فراکتال ها با استفاده از روابط بازگشتی بیان می شوند. بسیاری از زیباترین و پرکاربردترین آن ها با ساده ترین روابط قابل بیان هستند.
نویسنده: (#جبار_کمالی)
#For_intermidiate , #Fractal
@MatlabTips
نویسنده: (#جبار_کمالی)
#For_intermidiate , #Fractal
@MatlabTips
🔵معادلات دیفرانسیل stiff🔵
سطح پیچدگی: 🌕🌕🌑🌑🌑
پیشنیاز: آشنایی با کدنویسی متلب و مفاهیم معادلات دیفرانسیل
برای: (متوسط)
📝 هدف از این پست: (در این پست به این سوال پاسخ داده میشود که حرف s در odes به چه معناست و کارش چیست. لذا اگر علاقه ای به این موضوع ندارید اکیدا توصیه میکنم که از این پست رد شوید)
سختی (stiffness) یک مفهوم ظریف، دشوار و مهم در حل عددی معادلات دیفرانسیل است.
این سختی به معادله دیفرانسیل، شرایط اولیه و روش عددی مورد استفاده بستگی دارد. تعریف لغوی کلمه “stiff” عباراتی چون "سخت"، "کله شق" و "مقاوم در برابر خمش" است. البته در این پست با ویژگیهای محاسباتی این عبارت سر و کار داریم.
یک معادله دیفرانسیل معمولی را سخت مینامیم در صورتی که حل تحلیلی آن دارای تغییرات کندی است اما راهحلهای تقریبی وجود دارد که تغییرات سریعی دارند، بنابراین روش عددی باید گامهای خیلی کوچکی را برای حصول یک نتیجه رضایت بخش اتخاذ کند.
سختی مسئله راندامان است. اگر زمان محاسبات برای کاربر اهمیتی نداشته باشد بنابراین مسئله سختی یک معادله دیفرانسیل نیز اهمیتی نخواهد داشت. دقت کنید که روشهای عددی غیرسخت (nonstiff) هم میتوانند مسائل سخت را حل کنند ولی طبیعتا زمان خیلی بیشتری را میگیرند.
برای شفافتر شدن موضوع مدل انتشار شعله را به عنوان یک مثال در نظر میگیریم. هنگامی که یک کبریت را روشن میکنید، گلوله شعله به سرعت رشد میکند تا اینکه به اندازه بحرانی خودش میرسد. از آنجایی که مقدار اکسیژن مصرفی توسط عملیات احتراق درون گلوله نسبت به مقدار اکسیژن موجود در سطح به یک حد تعادل میرسد، اندازه گلوله شعله ثابت خواهد شد. مدل ساده شده این فرایند در زیر آورده شده است:
سطح پیچدگی: 🌕🌕🌑🌑🌑
پیشنیاز: آشنایی با کدنویسی متلب و مفاهیم معادلات دیفرانسیل
برای: (متوسط)
📝 هدف از این پست: (در این پست به این سوال پاسخ داده میشود که حرف s در odes به چه معناست و کارش چیست. لذا اگر علاقه ای به این موضوع ندارید اکیدا توصیه میکنم که از این پست رد شوید)
سختی (stiffness) یک مفهوم ظریف، دشوار و مهم در حل عددی معادلات دیفرانسیل است.
این سختی به معادله دیفرانسیل، شرایط اولیه و روش عددی مورد استفاده بستگی دارد. تعریف لغوی کلمه “stiff” عباراتی چون "سخت"، "کله شق" و "مقاوم در برابر خمش" است. البته در این پست با ویژگیهای محاسباتی این عبارت سر و کار داریم.
یک معادله دیفرانسیل معمولی را سخت مینامیم در صورتی که حل تحلیلی آن دارای تغییرات کندی است اما راهحلهای تقریبی وجود دارد که تغییرات سریعی دارند، بنابراین روش عددی باید گامهای خیلی کوچکی را برای حصول یک نتیجه رضایت بخش اتخاذ کند.
سختی مسئله راندامان است. اگر زمان محاسبات برای کاربر اهمیتی نداشته باشد بنابراین مسئله سختی یک معادله دیفرانسیل نیز اهمیتی نخواهد داشت. دقت کنید که روشهای عددی غیرسخت (nonstiff) هم میتوانند مسائل سخت را حل کنند ولی طبیعتا زمان خیلی بیشتری را میگیرند.
برای شفافتر شدن موضوع مدل انتشار شعله را به عنوان یک مثال در نظر میگیریم. هنگامی که یک کبریت را روشن میکنید، گلوله شعله به سرعت رشد میکند تا اینکه به اندازه بحرانی خودش میرسد. از آنجایی که مقدار اکسیژن مصرفی توسط عملیات احتراق درون گلوله نسبت به مقدار اکسیژن موجود در سطح به یک حد تعادل میرسد، اندازه گلوله شعله ثابت خواهد شد. مدل ساده شده این فرایند در زیر آورده شده است:
متغیر اسکالر( y(t بیانگر شعاع گلوله است. y2 و y3 بهگونهای سطح و حجم را مشخص میکنند. پارامتر بحرانی شعاع اولیه، δ است که مقدار کوچکی دارد. جواب را در بازه ای از زمان جستجو می کنیم که با مقدار δ رابطه عکس دارد.
بد نیست در این مرحله نرم افزار MATLAB را بالا بیاورید و این مثال را اجرا کنید. مسئله را با ODE45 شروع میکنیم. اگر مقدار δ خیلی کوچک نباشد مسئله نیز خیلی سخت نخواهد بود. بنابراین با δ=0.01 شروع می کنیم و خطای نسبی را 1e-4لحاظ می کنیم.
بد نیست در این مرحله نرم افزار MATLAB را بالا بیاورید و این مثال را اجرا کنید. مسئله را با ODE45 شروع میکنیم. اگر مقدار δ خیلی کوچک نباشد مسئله نیز خیلی سخت نخواهد بود. بنابراین با δ=0.01 شروع می کنیم و خطای نسبی را 1e-4لحاظ می کنیم.
delta = 0.01;
F = inline('y^2 - y^3','t','y');
opts = odeset('RelTol',1.e-4);
ode45(F,[0 2/delta],delta,opts);
هنگامی که برای ode45 خروجی در نظر نمیگیریم، در حالی که محاسبات اجرا میشود، همزمان نمودار نیز رسم میشود. نمودار از نقطه y=0.01 شروع میشودو با یک نرخ افزایشی ملایم رشد میکند تا اینکه مقدار T به 50 میرسد. در ان لحظه تا رسیدن به مقدار 1 رشد خیلی سریع اتفاق میافتد و نهاتا در مقدار 1 باقی میماند.
مقدار δ را کوچکتر می کنیم تا میزان سختی این مسئله بیشتر احساس شود:
مقدار δ را کوچکتر می کنیم تا میزان سختی این مسئله بیشتر احساس شود:
delta=0.0001;
ode45(F,[0 2/delta],delta,opts);
خروجی مانند شکل قبل است با این تفاوت که زمان خیلی بیشتری در این مرحله نیاز است. اگر خسته شدید میتوانید از دکمه stop در سمت چپ تصویر استفاده کنید.
این مسئله در ابتدا سخت نیست، ولی به محض اینکه به حالت پایدار میرسد سخت میشود. هر جوابی نزدیک به y(t)=1 به سرعت به جواب مسئله نزدیک میشود.
برمیگردیم به مثال! این بار با یکی از odeهای MATLAB که نام آن با “s” برای "stiff" ختم میشود استفاده میکنیم.
این مسئله در ابتدا سخت نیست، ولی به محض اینکه به حالت پایدار میرسد سخت میشود. هر جوابی نزدیک به y(t)=1 به سرعت به جواب مسئله نزدیک میشود.
برمیگردیم به مثال! این بار با یکی از odeهای MATLAB که نام آن با “s” برای "stiff" ختم میشود استفاده میکنیم.
delta=0.0001;
ode23s(F,[0 2/delta],delta,opts);
میتوانید ببینید که ode23s گامهای کمتری برای حل معادله دیفرانسیل نسبت به ode45 میگیرد. در واقع این مثال یک مسئله ساده برای یک حلکننده "سخت" است. سختی حتی بر روی خروجی گرافیکی نیز تاثیر میگذارد. در صورتی که بخواهید خروجیها را چاپ کنید، کیفیت ode23s خیلی بهتر از ode45 خواهد شد.
یک نکته جالب که در مورد مسئله شعله آتش وجود دارد، وجود تابع W لمبارت، W(z)، است. معادله مذکور یک معادله جداشدنی است. تابع y بر حسب t بصورت زیر بیان میشود:
یک نکته جالب که در مورد مسئله شعله آتش وجود دارد، وجود تابع W لمبارت، W(z)، است. معادله مذکور یک معادله جداشدنی است. تابع y بر حسب t بصورت زیر بیان میشود: