با سلام!
در اين تاپيك سورس ها و آموزش هاي مطلب قرار داده ميشه.
سورس معمولا" مربوط به M-File ها هستش و سعي شده كه اين كد ها در اكثر نسخه هاي Matlab قابل اجرا باشن.
در ادامه آموزش هاي كامل و كاربردي هم از Matlab قرار داده ميشه.
موفق باشيد:give_rose:
Printable View
با سلام!
در اين تاپيك سورس ها و آموزش هاي مطلب قرار داده ميشه.
سورس معمولا" مربوط به M-File ها هستش و سعي شده كه اين كد ها در اكثر نسخه هاي Matlab قابل اجرا باشن.
در ادامه آموزش هاي كامل و كاربردي هم از Matlab قرار داده ميشه.
موفق باشيد:give_rose:
با قرار دادن دستور زير دريك mfile و اجراي آن يه شش ضلعي در پنجره ي Figure ترسيم مي شود.
کد:x=[1.5 3 1.5 -1.5 -3 -1.5 1.5];
y=[1.5*(3)^0.5 0 -1.5*(3)^0.5 -1.5*(3)^0.5 0 1.5*(3)^0.5 1.5*(3)^0.5];
plot(x,y)
با كپي كردن كد زير در Mfile و اجراي كد يه مكعب ترسيم مي شود:
کد:clf
hold on
[x,y]=meshgrid(-2:2);
z=zeros(5) + 2;
surf(x,y,z)
[x,z]=meshgrid(-2:2);
y=zeros(5) + 2;
surf(x,y,z)
[y,z]=meshgrid(-2:2);
x=zeros(5) + 2;
surf(x,y,z)
[x,y]=meshgrid(-2:2);
z=zeros(5) - 2;
surf(x,y,z)
[x,z]=meshgrid(-2:2);
y=zeros(5) - 2;
surf(x,y,z)
[y,z]=meshgrid(-2:2);
x=zeros(5) - 2;
surf(x,y,z)
view(30,30)
اين سورس مربوط به MFile ، مقدار h را از كاربر (توسط پنجره Commnad) گرفته و به تعداد h پله ي عرش را كه تعبيري شهودي از دنباله ي واگراي n^-1 است را ترسيم مي كند:
کد:clc
h=input('Please insert a positive integer: ');
clc
if h>0
clf
hold on
x=[0 0 1];
y=[0 1 1];
plot(x,y)
for i=2:h
x=x+[(i-1)^-1 (i-1)^-1 i^-1];
y=y+[(i-1)^-1 i^-1 i^-1];
plot(x,y)
end
else
error(':-(')
end
اين سورس مقدار ضلع مربع و يك مقدار حدي را از طريق پنجره ي Command از كاربر دريافت كرده و مربعات ارشميدس را تشكيل مي دهد تا مقدار ضلع كوچك ترين مربع به عدد حدي تعيين شده برسد:
کد:clc
r=input('Plz determine R: ');
a=input('Now plz insert A: ');
b=a;
clc
clf
hold on
while abs(a)>=r
x=[-b a a];
y=[b b -a];
plot(x,y)
b=-a;
a=-.8*a;
end
اين كد MFile حركت دو بعدي يه توپ را روي منحني |sint/t| شبيه سازي مي كند:
کد:clear all
s=clock;
clc
x=linspace(0,50,500);
y=(abs(sin(x))./x);
for i=1:500
clf
hold on
plot(x(1:i),y(1:i),'-')
plot(x(i),y(i),'o r')
axis([-1,51,-0.1,1.1])
m(i)=getframe;
end
f=clock-s;
fprintf('Finished in %g second(s) \n',(f(4)*3600 + f(5)*60 + f(6)))
clear all
با قراردادن سورس زير در يك MFile جديد و اجراي آن مي توانيد اين شبيه سازي را در پنجره ي Figure مشاهده كنيد:
کد:clear all
clc
clf
dt=linspace(0,pi,120);
for i=1:120
surfl(peaks)
shading interp;
for j=1:round(abs( sin(dt(i))*20))
light('Position',[cos(dt(i))*50 0 sin(dt(i))*10],'Style','infinite');
end
if i<20
title('Hello World')
elseif i>20 && i<50
title('Morning')
elseif i>50 && i<70
title('Noon')
elseif i>70 && i<100
title('Afternoon')
else
title('Evening')
end
m(i)=getframe();
end
title('Thats a simple day!')
movie(m,1,12)
سورس زير رو مي تونيد تو يه MFile بريزيد و اجرا كنيد. با اجراي كد برنامه مقدار n رو از طريق Command Windows از كاربر دريافت مي كنه و سپس n عدد از كاربر دريافت مي كند و سپس آن ها را به صورت صعودي به نزولي نمايش مي دهد. در اين قطعه كد از توابع Sorting مطلب استفاده نشده چون هدف نمايش الگوريتم و منطق اين مرتب سازي بوده است:great::
کد:clear all
clc
n=input('How many numbers you want to insert: ');
for i=1:n
clc
m(i)=input('Please insert number: ');
end
clc
c=n;
for i=1:n
p=m(1);
inx=1;
for j=2:c
if p<m(j)
p=m(j);
inx=j;
end
end
m(inx)=m(c);
c=c-1;
fprintf('%g \n',p)
end
براي تعريف يك تابع در MATLAB بايد يك MFile جديد ايجاد كنيد. سپس دستورات را اين گونه داخل تابع وارد كنيد:
کد:function FuncName(a,b,c,...,n)
%دستورات
end
FuncName نام تابع است.
مقادير a تا n نيز نام آرگومان ها هستند. (توجه كنيم كه منظور از n اين است كه به مقدار دلخواه مي توان براي تابع پارامتر تعريف كرد.)
سپس بايد MFile را با نام تابع (در اين جا FuncName) در Work Path ذخيره كرد. در اين صورت همواره به تابع دسترسي داريم.
توجه كنيد كه متغير هاي تعريف شده در درون تابع پس اجراي دستورات درون function پاك مي شوند. پس اگر به مقادير اين متغير ها نياز داريد با نوع متغير را global انتخاب كنيد.
در آينده سعي مي شود كه بيش تر در اين مورد توضيح دهيم.
به عنوان يك مثال ساده، تابع اي با نام kore تعريف مي كنيم كه با گرفتن مقادير a , b و c به عنوان مركز كره و مقدار r براي شعاع، آن كره را ترسيم مي كند:
حال با دستور زير يك كره با شكل دلخواه رسم مي شود:کد:function kore(a,b,c,r)
[x,y,z]=sphere(30);
x=x*r+a;
y=y*r+b;
z=z*r+c;
surfl(x,y,z)
end
کد:kore(1,2,3,0.5)
با تو جه به تابع كره در برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]در اين قسمت مي تونيم حركت يه كره بر مسير دايره اي رو شبيه سازي كنيم:
کد:clear all
k=linspace(0,2*pi,100);
for j=1:100
z(j)=5;
end
for t=1:100
clf
plot3(5*sin(k),5*cos(k),z,'-.')
hold on
kore(5*sin(t),5*cos(t),5,0.3)
axis([-6,6,-6,6,4,6])
m(t)=getframe();
end
در اين مثال هم از تابع kore استفاده مي كنيم و حركت نوساني يك توپ رو كه در مسيري فنري شكل حركت مي كنه رو نمايش مي دهيم. كافيه كه سورس زير رو در يه mfile قرار بديم و با اجراي كد شبيه سازي رو تو پنجره ي figure مشاهده كنيم:
کد:clear all
k=linspace(0,2*pi,100);
for t=1:100
clf
plot3(5*sin(k),5*cos(k),k,'-.')
hold on
kore(5*sin(k(t)),5*cos(k(t)),k(t)+(sin(t)/t)*3,0.5)
axis([-6,6,-6,6,-1,7])
m(t)=getframe();
end
اين سورس Mfile بيش تر جنبه ي مكانيكي-فيزيكي داره و نوسان يك فنر رو نشون ميده. بعد با دستور subplot نمودار هاي مكان-زمان و سرعت-زمان رو ترسيم مي كنه.
کد:clear all
clc
t=linspace(0,8*pi,400);
x=sin(t);
y=cos(t);
figure(1)
for i=1:400
plot3(x,y,t+t*(sin(t(i))/t(i))*2*pi)
axis([-1 1 -1 1 -10 50])
m(i)=getframe;
end
figure(2)
subplot(1,2,1)
plot(t,t+t.*(sin(t)./t)*2*pi)
subplot(1,2,2)
plot(t,(cos(t)-sin(t).*t).*t.^2)
title('Position/Time - Velocity/Time')
با سلام خدمت دوستان ..
چنتا سوال دارم:
1- این سورسها در چه ورژنی آزمایش میشن؟
2-معنی این چیه؟
در مربع ارشمیدس یه جا نوشتید b=a و در انتها نوشتید b=-a !! این یعنی چی ؟ چجوری ممکنه؟
3-ظاهرا kore در متلب ورژن R8 تغییر کرده چون ارور میده ؟ میدونین باید چه چیزی به جاش نوشت؟
............................
خیلی ممنونم
من سوالات زیادی دارم واسه همین عضو شدم امیدوارم پاسخ بدید.
با سلام!نقل قول:
دوست عزيز عضويت شما در PCN رو تبريك ميگم.
1-نسخه ي 2008
2-خب الگوريتم ترسيم به اين شكل هست. براي بار اول دستور b=a اجرا ميشه تا دو خط از مربع رسم شه. بعد برنامه وارد يه حلقه ي while ميشه و در انتهاي هر بار اجراي حلقه دستور b=-a اجرا ميشه. در واقع فقط در يك ترسيم نياز به b=a و در بقيه موارد b=-a نياز است. اجراش كرده بودم درست كار مي كرد. با اين حال اگر تو هر جاييش مشكل داريد بفرماييد تا توضيح بدم خدمتتون.
3-دستوري به اسم kore در هيچ يك از نسخه هاي متلب نيست. بنده خودم يه بار چنين دستوري رو در يك mfile تعريف كردم و بعد اون kore.m رو داخل شاخه ي work قرار دادم. بدين شكل دستور kore براي متلب تعريف ميشه. چون رسم كره يه چيز كاربرديه تصميم گرفتم يه بار تابع ترسيمش رو تعريف كنم تا كار راحت تر بشه.
موفق باشيد
آرمين
ممنونم..نقل قول:
با اين حال اگر تو هر جاييش مشكل داريد بفرماييد تا توضيح بدم خدمتتون.
میشه این دستور رو بذارید تا من هم استفاده کنم..نقل قول:
بنده خودم يه بار چنين دستوري رو در يك mfile تعريف كردم و بعد اون kore.m رو داخل شاخه ي work قرار دادم
------------------------------------------------------------
سوالات دیگه:
1-چرا مینویسیم m(i)=getframe چرا با g یا u اجرا نمیشه؟ از پیش فرضهای نرم افزاره؟ ( به مانند اینکه حروف باید کوچک باشند -در برخی موارد-)
2- s=clock; در مورد این کمی توضیح میدید؟و f=clock-s;
.
.
من باز سوال دارم ..
بسیار ممنونم
خواهش مي كنم!نقل قول:
تابع مربوط به رسم كره دربرای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ] بود.
------------------------------------------------------------
1-اين سوال رو متوجه نميشم. ميشه دقيق تر توضيج بديد. تابع getframe درواقع عكسي رو از پنجره ي figure ميگيره و در آرايه ي m ذخيره مي كنه. متغير m يك آرايه است يعني متغير شامل تعداد متناهي عنصر. با دستور m(i) به عنصر i ام اين آرايه ميشه دسترسي پيدا كرد. حالا سوالتون دقيقا" در كدام مورد است؟
2-دستور clock در واقع زمان سيستم رو به هنگام اجراي دستور بر مي گردونه. كلا" اون كد براي تعيين مقدار زمان اجراي يك كد در mfile به كار ميره. ابتدا زمان شروع به كار برنامه در متغير s ذخيره ميشه سپس با پايان كد، مقدار s از زمان فعلي سيستم (clock) كه زمان پايان كار محسوب ميشه، كم ميشه و حاصل در متغير f قرار ميگيره. البته ميشه به جاي f=clock-s دستور etime(clock,s) رو هم به كار برد.
.
.
سوالات ديگه تون رو هم بفرماييد؛ تا اون جا كه مي تونم پاسخ ميدم:wink:.
آرمين
پيچ ارشميدوس همون طور كه مي دونيد يه خم باز و ساده به شكل دايره اي هست كه به تدريج شعاع اون كم ميشه. صرف نظر از ظاهر جالب اين پيچ، كاربرد هاي مفيدي رو در بخش مكانيك داره. بنده سعي كردم يه كد ساده براش بنويسم كه البته كمي دقتش پايينه. ترسيم اين پيچ در مختصات قطبي خيلي ساده تر ميشه براي همين از دستور polar استفاده كردم:
همين طور كه ملاحظه مي كنيد اول شعاع رو تعريف كردم و مقدار اون رو از 10 تا صفر تغيير دادم و بعد مقدار زاويه تتا رو از 0 تا ده پي تغيير دادم تا تعداد دور هاي پيچ به 5 برسه كه البته مي تونيد بر حسب نياز خودتون اين مقادير رو تغيير بديد.کد:r=linspace(10,0,101);
theta=linspace(0,10*pi,101);
polar(theta,r)
نمونه ي سورس سري فوريه در نرم افزار MATLAB پيوست شده. اين سورس تابع f رو دريافت مي كنه در در بازه از a تا b به اندازه ي k تعداد جملات سري فوريه تابع را محاسبه مي كنه. البته رسم نمودارش يكم نياز به بهينه سازي داره...
اين كد براي تحليل ارتعاش يك صفحه ي مرتعش هستش. PDE مربوط به چنين ارتعاشي نياز به حل انتگرال هاي دوگانه داره كه در اين جا از حل عددي انتگرال خود نرم افزار بهره گرفته شده. در ضمن پس از حل معادله ي ديفرانسيل پاره مي تونيد نحوه ي ارتعاش پوسته رو به صورت پويانمايي مشاهده كنيم. سورس اين امكان رو براي شما فراهم مي كنه تا شرايط اوليه رو بر حسب نياز خودتون تغيير بديد.
اين سورس اختصاص به حل عددي PDE به روش Mesh بندي داره. يك معادله ي گرما به روش عددي (Numerical) و دقيق (Exact) حل ميشه تا شما بتونيد دو روش رو با هم مقايسه كنيد.
اين سورس متلب بر اساس جنس انتخابي شما، در يك بازه ي معين قطر مفتول هاي مناسب براي طراحي فنر تحت بار استاتيكي فشاري و پارامتر هاي وابسته به آن (مانند طول بحراني، دور هاي موثر و ...) را نمايش مي دهد. در نهايت طراح با توجه به معيار هايي كه در نظر دارد مناسب ترين قطر را انتخاب مي كند. به علاوه اين سورس خروجي اكسل نيز دارد.
سورسي كه در اين پست قرار داده شده مربوط به تحليل ارتعاشات يك سيستم دو درجه آزادي است. مسئله ي مربوطه از كتاب ارتعاشات ستو انتخاب شده است. اين مسئله با روش انرژي لاگرانژ حل و سپس خطي سازي شده است درنتيجه جواب مسئله براي سرعت هاي نسبتا" زياد با خطا همراه خواهد بود.
سورس هاي پيوست شده برنامه هايي هستند كه با توجه به اجزايي كه روي شفت قرار داده مي شوند، طراح را در جهت تعيين قطر مناسب شفت ياري مي كنند.
بخشي از برنامه نمودار گشتاور خمشي شفت را با توجه به مكان عناصري چون چرخ دنده، چرخ زنجير، بيرينگ و پولي ترسيم مي كند. كاربر مي تواند با تعيين مكان اين اجزا و توان انتقالي به عنوان ورودي، نمودار گشتاور خمشي را ملاحظه كند.
بخش ديگر برنامه يافتن قطر متوسط شفت است. اين كار بر اساس ضرايب مارين، رابطه ي Heywood براي تمركز تنش و همچنين تركيب معيار هاي von Mises و Soderberg صورت مي گيرد.
بسته ي پيوست شده شامل 5 سورس متلب در زمينه ي مقاومت مصالح است. اين سورس در واقع حل مسايل كامپيوتري برگزيده ي كتاب مقاومت بير-جانستون است كه بخش هاي زير را در بر مي گيرد:
- طراحي ستون بر اساس فرمول اويلر
- ذخيره ي انرژي كرنشي در ميله
- تغيير مكان تير ها
- معيار شكست von Mises و Tresca
- كرنش پيچشي در چرخدنده ها
سورس پيوست شده مربوط به شبيه سازي يك سيستم آزادي يك درجه آزادي است. سيستم جرم و فنر به ميله ي دواري متصل شده كه با سرعت ثابت مي چرخد. چرخش ميله سبب ايجاد شتاب كريوليس در سيستم شده كه اين امر معادله ي قانون دوم نيوتون را ناهمگن مي كند همانند آن چه كه در ارتعاشات اجباري روي مي دهد. اين معادله ي ديفرانسيل با روش عددي ode45 در متلب حل شده و پاسخ به كمك توابع گرافيكي رسم مي شود.
Simulink از جمله ابزار هاي قدرتمند نرم افزار MATLAB جهت شبيه سازي سيستم هاي مختلف نظير سيستم هاي ديناميكي، كنترلي و الكتريكي است.
در اين پست نمونه اي از شبيه سازي يك سيستم كنترلي Velocity Feedback با Simulink نشان داده شده است. در اين سيستم از خروجي يك فيدبك گرفته شده و اين مقدار در يك عدد به عنوان Gain ضرب مي شود. كاربر مي تواند با تغيير Gain ها، سعي كند سيستم مرتبه ي II را به طور بهينه كنترل كند.
نسخه ي 2008 Simulink اين سيستم پيوست شده است.
function kore(a,b,c,r)
با سلام ،
آرایه رو می تونیم به عنوان آرگومان ورودی به تابع بدیم( تو matlab )
با سلام!نقل قول:
عضويت شما رو در SSA تبريك مي گم.
بله چنين چيزي امكان پذير است.
موفق باشيدکد:function kore(arr)
a=arr(1);
b=arr(2);
c=arr(3);
r=arr(4);
end
آرمين
ممنون از راهنمایی تون ، همون طور که مطلع هستین تو آرایه ما با اندیس کار می کنیم تو مطلب هم همینطوره با خیر؟ و اینکه کتاب خوبی در مورد matlab سراغ دارید
ممنون
خواهش مي كنم.نقل قول:
بله دقيقا" انديس براي آرايه در متلب هم وجود داره (در كدي هم كه به عنوان مثال قرار داده شده بود، از انديس هاي 1 تا 4 براي گرفتن درايه هاي يه آرايه استفاده شد!).
به علاوه براي آرايه هاي چند بعدي هم ميشه انديس هاي هر بعد رو با علامت ويرگول ( , ) از هم جدا كرد.
در زمينه ي كتاب بايد عرض كنم كه نرم افزار متلب بخش هاي متنوعي داره و منطقي هستش كه براي آشنايي بهتر با هر كدوم از اين بخش ها كتاب مربوط به اون بخش تهيه بشه.
با اين حال در زمينه ي كليات كار با MATLAB به نظر بنده كتاب MATLAB Demystified از David McMahon (انتشارات McGraw-Hill) مي تونه مفيد باشه. يك كتاب فارسي هم در بازار موجوده كه متاسفانه اسم نويسنده اش رو فراموش كردم (سعي مي كنم اسمش رو بپرسم).
يه PDF فارسي و خلاصه از متلب هم ضميمه شده كه اميدوارم براي شروع كار كمكتون كنه.
موفق باشيد
آرمين
Root Locus روشی در مهندسی کنترل جهت تحلیل رفتار یک سیستم به ازای تغییر مقدار یک Gain به شمار می آید. در MATLAB کافیست تنها با تعریف ضرایب چند جمله های صورت و مخرج تابع تبدیل حلقه باز، مکان هندسی ریشه ها را رسم نمود:
در مثال فوق 1s + 2 در صورت کسر و 1s^2 + 2s + 3 در مخرج کسر قرار دارد.کد:a=[0 1 2];
b=[1 2 3];
rlocus(a,b)
نمودار بوده (Bode Diagram) نموداري مفيد براي تحليل سيستم ها در نظريه ي كنترل است. بر اساس اين نمودار مي توان پاسخ يه سيستم نسبت به فركانس هاي مختلف را پيش بيني كرد و دريافت كه سيستم چه فركانس هايي را فيلتر مي كند.
براي رسم نمودار بود همانند مثال مكان هندسي، صورت و مخرج تابع تبديل را تعيين كرده و سپس با دستور bode نمودار دامنه و فاز رسم مي گردد:کد:
a=[0 1 2];
b=[1 2 3];
bode(a,b)
با رسم تابع تبديل حلقه باز يك سيستم در فضاي فركانسي و كمك گرفتن از قضيه ي نگاشت (Mapping) مي توان پايداري آن سيستم را بررسي كرد. با دستور زير و مطابق مثال هاي گذشته مي توان نمودار نايكوئيست يك تابع تبديل را رسم كرد و طبق معيار پايداري نايكوئيست، پايداري سيستم را بررسي نمود:کد:a=[0 1 2];
b=[1 2 3];
nyquist(a,b)
با دستور زير مي توانيد تابع تبديل (Transfer Function) يك سيستم را به نمايش فضاي حالت (State Space) تبديل كنيد:كه num صورت تابع تبديل و den مخرج آن است.کد:[A,B,C,D]=tf2ss(num,den)
همچنين اگر يك نمايش فضاي حالت به صورت:
xdot=Ax+Bu
y=Cx+Du
داشته باشيم (اين شكل نمايش در نظريه ي كنترل نوين بسيار كاربرد دارد)، با دستور زير مي توان تابع تبديل اين فضاي حالت را به دست آورد:
کد:[num,den]=ss2tf(A,B,C,D)
سورس متلب پیوست شده نمونه ای از روش تشخیص حروف انگلیسی دست نوشته (OCR) با شبکه ی عصبی است.
برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]
در چرخدنده هاي مارپيچ (Helical) توان به تدريج روي دنده ها اثر مي كند و همين امر باعث كاهش ضربه و كاهش سر و صدا مي مي شود. فرآيند طراحي يك جعبه دنده ي هليكال (Helical Gearbox) شايد كمي زمان بر باشد. به علاوه چنين گيربكسي با تغيير نسبت هاي تبديل (Transmission Ratio) و مدول (Module) چرخدنده ها نياز به بهينه سازي (Optimization) دارد. سورس پيوست شده ي متلب در اين پست، با دريافت پارامتر هاي ورودي نظير نسبت تبديل كلي، توان ورودي و جنس چرخدنده ها، پارامتر هاي طراحي يك گيربكس هليكال دو مرحله اي را در اختيار كاربر قرار مي دهد و براساس معيار حجم گيربكس، آن را بهينه مي كند. لازم به ذكر است كه اين سورس تحليل خمش و تحليل خستگي سطحي را پوشش مي دهد.
روش سيمپسون يكي از روش هاي متداول براي انتگرال گيري عددي است. براي استفاده از اين روش در انتگرال يگانه ي معين در متلب مي توان از دستور quad استفاده كرد:
مثال فوق انتگرال تابع exp(x^2)*cos(x)^3 را بازه ي -0.1 تا 1.4 محاسبه مي كند.کد:F = @(x)exp(x.^2).*(cos(x).^3);
Q = quad(F,-0.1,1.4)
سورس متلب پيوست شده با دريافت ماتريس A و B در دستگاه معادلات:AX=B
ابتدا ماتريس ضرايب-A-را به صورت حاصل ضرب يك ماتريس پايين مثلثي (Lower Triangular Matrix) و يك ماتريس بالا مثلثي (Upper Triangular Matrix) نمايش مي دهد و سپس به كمك اين ماتريس هاي مثلثي جواب دستگاه را حساب مي كند. همچنين اين سورس دستگاه را بار ديگر به روش ماتريس معكوس و با استفاده از دستور inv حل مي كند:
A-1(AX=B) => X=A-1B
و نتيجه را با روش قبلي مقايسه خواهد كرد.
دستور fzero در متلب در حل عددی معادله ی f(x)=0 کاربرد دارد. فرضا" اگر تابع f به صورت x2 - 1 باشد آن گاه تابع بر حسب متغیر x به شکل زیر تعریف می شود:
سپس یک جواب تقریبی معادله را حدس می زنیم؛ فرضا" 2 . آن گاه جواب معادله به شکل زیر به دست می آید:کد:f=@(x)x.^2-1
کد:fzero(f,2)
Simulink® 7
Getting Started Guide
از MathWorks
در 93 صفحه به زبان انگليسي