MatlabTips
891 subscribers
462 photos
73 videos
54 files
304 links
آموزش MATLAB با "استفاده از ویدئو و متن" در سطوح مبتدی تا پیشرفته
پاسخ به سوالات تخصصی:
@roholazandie
Download Telegram
🔵دستورهای ابتدایی برای تولید اعداد تصادفی🔵
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیش‌نیاز:کدنویسی پایه
برای:مبتدیان


متلب دارای قابلیت تولید اعداد تصادفی است که این قابلیت در توابع 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) انتخاب می کنیم.
Forwarded from Deleted Account
دقت کنید که هنگام رسم، نقاط را به هم متصل نکیند.
%% 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,'.')
Forwarded from Deleted Account
زشت ترین فراکتال دنیا
معمولا فراکتال ها با استفاده از روابط بازگشتی بیان می شوند. بسیاری از زیباترین و پرکاربردترین آن ها با ساده ترین روابط قابل بیان هستند.
نویسنده: (#جبار_کمالی)
#For_intermidiate , #Fractal
@MatlabTips
Forwarded from Clusterhead
Tracce
Einaudi, Ludovico
🔵معادلات دیفرانسیل stiff🔵
سطح پیچدگی: 🌕🌕🌑🌑🌑
پیش‌نیاز: آشنایی با کدنویسی متلب و مفاهیم معادلات دیفرانسیل
برای: (متوسط)
📝 هدف از این پست: (در این پست به این سوال پاسخ داده میشود که حرف s در odes به چه معناست و کارش چیست. لذا اگر علاقه ای به این موضوع ندارید اکیدا توصیه میکنم که از این پست رد شوید)

سختی (stiffness) یک مفهوم ظریف، دشوار و مهم در حل عددی معادلات دیفرانسیل است.
این سختی به معادله دیفرانسیل، شرایط اولیه و روش عددی مورد استفاده بستگی دارد. تعریف لغوی کلمه “stiff” عباراتی چون "سخت"، "کله شق" و "مقاوم در برابر خمش" است. البته در این پست با ویژگی‌های محاسباتی این عبارت سر و کار داریم.
یک معادله دیفرانسیل معمولی را سخت مینامیم در صورتی که حل تحلیلی آن دارای تغییرات کندی است اما راه‌حل‌های تقریبی وجود دارد که تغییرات سریعی دارند، بنابراین روش عددی باید گام‌های خیلی کوچکی را برای حصول یک نتیجه رضایت بخش اتخاذ کند.
سختی مسئله راندامان است. اگر زمان محاسبات برای کاربر اهمیتی نداشته باشد بنابراین مسئله سختی یک معادله دیفرانسیل نیز اهمیتی نخواهد داشت. دقت کنید که روش‌های عددی غیرسخت (nonstiff) هم می‌توانند مسائل سخت را حل کنند ولی طبیعتا زمان خیلی بیشتری را می‌گیرند.
برای شفاف‌تر شدن موضوع مدل انتشار شعله را به عنوان یک مثال در نظر می‌گیریم. هنگامی که یک کبریت را روشن می‌کنید، گلوله شعله به سرعت رشد می‌کند تا اینکه به اندازه بحرانی خودش می‌رسد. از آنجایی که مقدار اکسیژن مصرفی توسط عملیات احتراق درون گلوله نسبت به مقدار اکسیژن موجود در سطح به یک حد تعادل می‌رسد، اندازه گلوله شعله ثابت خواهد شد. مدل ساده شده این فرایند در زیر آورده شده است:
Forwarded from Deleted Account
متغیر اسکالر( y(t بیانگر شعاع گلوله است. y2 و y3 به‌گونه‌ای سطح و حجم را مشخص می‌کنند. پارامتر بحرانی شعاع اولیه، δ است که مقدار کوچکی دارد. جواب را در بازه ای از زمان جستجو می کنیم که با مقدار δ رابطه عکس دارد.
بد نیست در این مرحله نرم افزار 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
هنگامی که برای 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" ختم می‌شود استفاده می‌کنیم.
delta=0.0001;
ode23s(F,[0 2/delta],delta,opts);
می‌توانید ببینید که ode23s گام‌های کمتری برای حل معادله دیفرانسیل نسبت به ode45 می‌گیرد. در واقع این مثال یک مسئله ساده برای یک حل‌کننده "سخت" است. سختی حتی بر روی خروجی گرافیکی نیز تاثیر می‌گذارد. در صورتی که بخواهید خروجی‌ها را چاپ کنید، کیفیت ode23s خیلی بهتر از ode45 خواهد شد.
یک نکته جالب که در مورد مسئله شعله آتش وجود دارد، وجود تابع W لمبارت، W(z)، است. معادله مذکور یک معادله جداشدنی است. تابع y بر حسب t بصورت زیر بیان می‌شود:
این معادله می‌تواند بر حسب y نوشته شود. فرم دقیق تحلیلی مدل شعله بصورت زیر خواهد بود:
که در این معادله a=1/delta-1 . تابع W(z)، تابع W لمبارت است که در واقع حل معادله زیر می‌باشد:
با استفاده از MATLAB و جعبه ابزار Symbolic متصل به Maple، معادله دیفرانسیل مربوط به مدل شعله را حل می‌کنیم تا به یک جواب دقیق برسیم و آن را رسم می‌کنیم.
y = dsolve('Dy = y^2 - y^3','y(0) = 1/100');
y = simplify(y);
pretty(y)
ezplot(y,0,200)

1
-------------------------------
lambertw(0, exp(99 - t) 99) + 1

References
Robert M. Corless, G. H. Gonnet, D. E. G. Hare, D. J. Jeffrey, and D. E. Knuth, “ On the Lambert W Function,” Advances in Computational Mathematics, Volume 5, 1996, pp. 329-359.

نویسنده: (#جبار_کمالی )
#For_intermediate , #ODE, #Stiffness
@MatlabTips
🔵کنترل تولید اعداد تصادفی🔵
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیش‌نیاز:کدنویسی پایه
برای:همه
📝 هدف از این پست: (استفاده حرفه ای تر از تابع رندم و یک گذار به کاربردهای آن در رمزنگاری)


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

>> t = rng      %Stores current settings of rng in t
t =

Type: 'twister'
Seed: 0
State: [625x1 uint32]


همانطور که می بینید نوع ساخت عدد تصادفی Mersenne Twister است و دانه آن برابر با صفر است و وضعیت آن هم در یک ماتریس ذخیره شده است. حالا دستور rand را وارد میکنیم تا نتیجه را ببینیم:

>> rand(1,4)     %Generates a 1x4 random matrix with default initial
%state
ans =

0.8147 0.9058 0.1270 0.9134
>> rand(1,4) %Generates a 1x4 random matrix
%(different from initial random matrix)
ans =

0.6324 0.0975 0.2785 0.5469


سپس تولید اعداد شبه تصادفی را به حالت اول بر میگردانیم و دوباره تابع rand را اجرا میکنیم

>> rng(t)        %Restore settings of rng
>> rand(1,4) %New random matrix same as initial random matrix
ans =

0.8147 0.9058 0.1270 0.9134


همانطور که می بینید دوباره همان اعداد تولید شدند! این برای دیباگ کردن برنامه هایی که از اعداد رندم استفاده میکنند عالی است!
نسخه کنونی متلب از الگوریتم Mersenne Twister برای تولید اعداد شبه تصادفی استفاده میکند[1]. الگوریتم های دیگری هم برای این کار وجود دارند که می توانید در help متلب با تایپ کردن rng بیابید. (مانند SIMD fast Mersenne Twister، Combined Multiple Recursive و Multiplicative Lagged Fibonacci)
هر بار که متلب ریستارت می شود. دانه آن به مقدار قبلی (یعنی صفر) ست می شود!( اگر باور نمی کنید متلب را باز کنید تابع Rand را اجرا کنید مقدار را به خاطر بسپارید و سپس متلب را ببندید و دوباره باز کنید و باز هم Rand را بزنید) برای اینکه این مشکل را حل کنید دستور زیر را وارد کنید:

>> rng('shuffle')     %Seed rng on basis of current time
>> rng
ans =

Type: 'twister'
Seed: 385954034
State: [625x1 uint32]
>> rand(1,4) %New random matrix produced with new seed
ans =

0.5706 0.9136 0.4043 0.8423


این دستور باعث می شد دانه الگوریتم به زمان تنظیم آن ست شود(یک راه حل ساده و هوشمندانه!).
در قسمت قبل شما را تشویق کردم که در مورد تولید اعداد واقعا تصادفی فکر کنید! از آنجا که کامپیوتر های کنونی ماشین های محاسبه متعین(deterministic ) ایی هستند نمی توان هیچ الگوریتمی برای تولید اعداد تصادفی ایجاد کرد. مهمترین روش تولید اعداد تصادفی استفاده از یک فرآیند فیزیکی مانند نویز حرارتی، اثر فوتوالکتریک یا پدیده ای کوانتومی است. این فرآیند ها غیر قابل پیش بینی هستند[2] و بنابراین پایه ای برای تولید اعداد واقعا تصادفی هستند. مثلا میزان گرمای حرارتی پردازنده یا حالت کوانتومی بخشی از حافظه می تواند مورد استفاده قرار گیرد.
سیستم عامل مسیری برای تولید این اعداد را فراهم میسازد. تولید این اعداد از ویندوز 2000 دچار مشکلاتی بود که در سال 2008 برطرف شد[3]. در سیستم عامل های یونکیسی هم از /dev/random استفاده می شود که بسیار مقاوم تر(robust) از نسخه های ویندوزی است. اعداد تصادفی واقعی بیشترین کاربرد را در رمزنگاری و شبیه سازی (مانند Monte carlo) دارند. از آنجا که حمله های مبتنی بر تولید اعداد تصادفی بسیار مهلک هستند تولید اعداد "واقعا" تصادفی بسیار مهم است. سایتی به نام random.org ادعا می کند که اعداد واقعا تصادفی بر اساس نویز اتمسفری تولید میکند که برای استفاده از آن در متلب یک واسط وب طراحی شده است که من تغییراتی در آن داده ام تا قابل استفاده باشد. در زیر می توانید دانلود کنید