- ۰ نظر
- ۱۴۴۷ نمایش
در اکثر زبانهای برنامه نویسی مفهومی به اسم متغیر سراسری و متغیر محلی وجود دارد.در مطلب برای تعریف نتغیر سراسری از دستور global استفاده می شود.استفاده از متغیرهای سراسری ساده ترین کار در هنگام کار با فضای حالت است اما همیشه ساده ترین راه قشنگ ترین راه نیست.
توابعی که در پست قبلی استفاده کردیم را با کمی تغیر دوباره مورد استفاده قرار می دهیم
function b=testcaller
testcurrent
m=67;
r=m+l
-------------
function testcurrent
assignin('caller','b',23)
assignin('base','t',33)
m=34;
evalin('base','b=t+2') % 1
evalin('caller','l=b+2') % 2
r= evalin('base','b+3')+evalin('caller','b+2')+m %3
دستور 1 متغیر b را برابر با جمع t و 2 قرار می دهد (این متغیرها در فضای base- فضای کار اصلی مطلب- قرار دارند)
دستور2 متغیر b را که در فضای کار تابع testcaller قرار دارد با 2 جمع کرده و در متغیر l قرار می دهد.
دستور 3 متغیر b که در base قرار دارد را با نتغیر b که در caller قرار دارد و متغیر محلی m را جمع کرده و در r قرار می دهد.
حال دستور h=testcaller را اجرا کنید بعد از پایان برنامه باید متغیرهای t,h,b در فضای baseوجود داشته باشند.
چطور می شود معادلات سمبولیک را به عدد تبدیل کرد و گفتند که در نسخه های قبل از متلب ۷ با دستور numeric ٬ این کار قابل انجام بوده است.
اگر بخواهیم مقدار عددی یک عبارت سبمبولیک را پیدا کنیم از دستور subs استفاده می کنیم
syms x
y = int(x^2)
subs(y,x,3)
قالب کلی اسن دستور به این صورت است
R = subs(S)
R = subs(S,new)
R = subs(S,old,new)
در مثال بالا از حالت سوم دستور استفاده کردیم.
هر عبارت سمبولیک یک متغیر پیش فرض دارد که این متغیر اولین متغیری است که در خروجی دستور findsym دیده می شود.
syms x y z
f = z+y+x
findsym(f)
subs(f,2)
مثال زیر نحوه استفاده از حالات اول دستور را نشان میدهد.
y = dsolve('Dy=y+a')
a = 1000
C1 = 2
subs(y)a
تبدیل لاپلاس یکی از روشهای حل معادلات دیفرانسیل است که در حل معدلات دیفرانسیل معمولی و جزیی کاربرد فروانی دارد.برای لاپلاس گرفتن از دستور laplace استفاده می شود.
برای استفاده از این دستور ابتدا باید متغیر مستقل را تعریف کرد:
syms t
البته هر متغیر دلخواه دیگری را هم می شود تعریف کرد و تابع برگشتی هم بر حسب s می باشد.
r = laplace(t)
برای لاپلاس معکوس گرفتن هم از دستور ilaplace استفاده می شود.
ilaplace(r)
حالا فرض کنید بخواهید از تابع 1 لاپلاس بگیرید و بنویسید
laplace(1)
نوشتن این دستور به این شکل اشتباه است و موجب خطا می شود، برای این کار باید 1 را به صورت نماد تعریف کنیم
m=sym(1)
ilaplace(m)
یکی از گله های دائمی کاربران متلب، سرعت بسیار پایین اجرای برنامه ها در متلب است. زبان متلب، یک زبان مفسری است و برنامه های نوشته شده در آن، کامپایل نمی شوند. بنابراین طبیعی است که سرعت اجرای برنامه های متلب، در مقایسه با زبان های کامپایلری، مانند C، پایین باشد. اما آیا واقعا، همه تقصیرها متوجه متلب است؟ در این مقاله آموزشی کوچک، می خواهیم نشان دهیم که چگونه می توان با رعایت اصول ساده، حداکثر سرعت قابل دسترسی در متلب را، برای برنامه ها به دست آوریم.
یکی از اشتباه هایی که بسیاری از برنامه نویسان متلب مرتکب می شوند، عدم تخصیص فضای مناسب برای آرایه ها و ماتریس ها، قبل از مقدار دهی است. زبان هایی مانند C یا #C (بخوانید سی شارپ)، در هنگام تعریف آرایه ها، اندازه آرایه ها را به صورت اجباری از برنامه نویس می خواهند و هر گاه در طول اجرای برنامه، بخواهیم که مقدار آرایه را در جایی که بیش از طول آرایه است، تغییر دهیم، برنامه خطا می دهد. اما متلب، از آن جا که سادگی را به عنوان محور اولیه در نظر گرفته است، چنین ضرورت هایی را به برنامه نویسی تحمیل نمی کند. اما مشکل دقیقا از همین جا شروع می شود. برای آرایه های کوچک، همه چیز به خوبی و خوشی تمام می شود. اما وقتی آرایه ها، از یک حد بزرگ تر می شوند، ایم مسأله واقعا دردسر ساز می شود.
در متلب، برای تخصیص فضای اولیه (Pre-Allocation)، از توابع مختلفی استفاده می شود. ازمیان این توابع، پر کاربردترین آن ها، تابع zeros است. این تابع ابعاد ماتریس مورد نظر را می گیرید، و بخشی از حافظه را به همان اندازه، برای آرایه موزذ نظر تخصیص می دهد. این کار، در زبان C، با تابع malloc انجام می شود. برای آگاهی بیشتر از چگونگی کارکرد این تابع، به راهنمای آن در هلپ متلب، مراجعه کنید.
دو برنامه زیر را در نظر بگیرید. این برنامه ها برای محاسبه تعداد زیادی از جملات سری فیبوناچی (Fibonacci)، نوشته شده است. در سری فیبوناچی، هر جمله با مجموع دو جمله قبل از خودش برابر است. جمله اول و دوم نیز، طبق قرارداد برابر با صفر و یک در نظر گرفته می شوند.
برنامه اول:
clear;
n=300000;
x(1)=0;
x(2)=1;
for k=3:n
x(k)=x(k-1)+x(k-2);
end
برنامه دوم:
clear;
n=300000;
x=zeros(1,n); % Pre-Allocation
x(1)=0;
x(2)=1;
for k=3:n
x(k)=x(k-1)+x(k-2);
end
این دو برنامه، فقط در مورد تخصیص اولیه (خط سوم از برنامه دوم)، با هم اختلاف دارند. اما جالب است بدانید که مدت اجرای برنامه اول، بر روی کامپیوتر من، در حدود 4 دقیقه بود. در حالی برنامه دوم، در کمتر از یک ثانیه اجرا می شود. حال فرض کنید که در یک برنامه بزرگ، این مشکلات چقدر می تواند حادتر و شدیدتر باشد.
متلب قابلیت های گرافیکی بالایی دارد که امکانات فراوانی از جمله پردازش تصویر و طراحی و تحلیل گرافیکی را به سادگی در اختیارتان قرار می دهد. در برنامه ی امروز به صورت دستی و بدون استفاده از دستورات اختصاصی متلب انیمیشنی از یک توپ که در مسیر سینوسی حرکت می کند برنامه نویسی می کنیم.
برنامه از فرمان fill برای ترسیم توپی به رنگ قرمز استفاده می کند و با تنظیم محدوده ی رسم نمودار با کمک فرمان axis صحنه ی نمایش همیشه ثابت می ماند .
اما مسئله سرعت بالای ترسیم گرافیکی در متلب است که باعث می شود فیلم هنوز شروع نشده به پایان برسد و شما متوجه آنچه روی داده نشوید . برای غلبه بر این مشکل از فرمان pause استفاده شده است که به اندازه ی عددی که در داخل آن مشخص می کنید اجرای برنامه های متلب را متوقف می کند.
استفاده از فرمان pause در مواردی کاربرد دارد که شما می خواهید سرعت اجرای عملیاتی را در متلب کاهش دهید و تغییرات را با دقت بیشتری مورد بررسی قرار دهید.
متن برنامه :
clc;
clf;
% define a x,y
x=0:.1:2*pi;
y=sin(x);
for n=1:length(y)
%{
hold on
plot(x,y)
%}
% define ball shape
fill(x(n)+.1*cos(x),y(n)+.1*sin(x),'r')
axis([0 2*pi -pi pi])
% wait for 0.1 miliseconds
pause(0.1)
end
هرچه بیشتر روی امکانات گرافیکی متلب وقت بگذارید کار با آن جالبتر و هیجان آورتر می شود. امروز قرار است با کمک متلب محیط بسته بین دو نمودار را با رنگ خاصی پر کنیم.
فرض کنید قرار است محیط بسته ای که دو معادله ی زیر با هم می سازند با رنگ سبز (بدون منظور خاصی !) پر کنیم :
y=x+1
y=x^2
بسیاری از کاربران متلب خیلی ساده می دانند که برای پر کردن محیط بسته با رنگ خاص در متلب می توان از فرمان fill استفاده کرد اما روش درست استفاده از آن کمی پیچیده است
ابتدا دستور hold را فعال کرده و دو نمودار را رسم می کنیم :
hold on;
ezplot('x+1');
ezplot('x^2');
برای رسم دقیق قسمت پر کننده شما نیاز به دانستن محل تقاطع دو خط دارید و برای این کار هم لازم است معادله ی آن دو با هم حل شود :
s=solve('y=x+1','y=x^2');
شکل کلی فرمان fill به صور ت زیر است:
fill(X,Y,ColorSpec)
که در آن x و y مجموعه ی نقاطی هستند که یک محیط بسته ی دو بعدی را تشکیل می دهند و نیز رنگ زمینه را هم در قسمت آخر همانند دستور plot تعیین می کنید
باقی کار چندان مشکل نیست فقط شما نیاز دارید که x ها در بین دو نقطه ی تقاطع منحنی جای بگیرند و y ها هم از روی یکی از معادلات به طور دقیق محاسبه شوند، هر چه تعداد نقاط بیشتر باشد هاشور دقیقتر شکل می گیرد
f2=x^2;
x=linspace(subs(s.x(1)),subs(s.x(2)),3);
y2=subs(f2,x);
fill(x,y2,'g');
plot(x,y2,'r+')
axis([-2 2 -1 4])
برای درنظر گرفتن تعداد نقاط بیشتر می توانید در فرمان linspace بجای عدد 3 از 30 یا 40 استفاده کنید و ببینید تغییرات به چه صورت خواهد بود.
متن کامل برنامه به صورت زیر است :
clc;
clear;
clf;
hold on;
ezplot('x+1');
ezplot('x^2');
s=solve('y=x+1','y=x^2');
syms x;
f2=x^2;
x=linspace(subs(s.x(1)),subs(s.x(2)),3);
y2=subs(f2,x);
fill(x,y2,'g');
plot(x,y2,'r+')
axis([-2 2 -1 4])
امروزه استفاده از نرمافزار MATLAB در علوم مهندسی آنچنان رایج شدهاست که کمتر کتابی میتوان یافت که حداقل یکبار از کلمهی MATLAB استفاده نکرده باشد. در تبلیغهای سالهای نه چندان دور آموزشگاهها، عدم تسلط بر زبان انگلیسی و بعدها عدم تسلط با کامپیوتر مصادف با بیسواد بود. اما امروزه صحبت از بیسوادی مهندسهایی است که با زبان MATLAB آشنایی ندارند.
در کشور عزیز ما ایران نیز این نرم افزار بسیار محبوب است و دانشجویان و صنعتگران به وفور از آن استفاده میکنند. در این مقاله قصد داریم، معتبرترین کتابها، نویسندگان، موسسات و سایتهای MATLAB را بهطور اختصار به شما معرفی کنیم:
در بین آموزشگاههای حقیقی، به نظر جهاد دانشگاهیهای امیرکبیر، تهران، شریف، علم و صنعت و ... و موسساتی مانند مجتمع فنی تهران با شعبههای متنوع، معتبرترینها هستند. البته معیار انتخاب این کلاسها به مدرس، زمان کلاس، هزینه کلاس و امکانات سختافزاری نیز وابسته است. مثلا جهاد دانشگاهی امیرکبیر دورهی 60 ساعته برگزار میکند در حالی که تقریبا با همان هزینه در موسسات دیگر کلاسهای 30 ساعته برگزار میگردد البته از نظر امکانات سختافزاری مثلا مجتمع فنی تهران به مراتب بهتر از جهاد دانشگاهیها است.
در بین آمورشگاههای مجازی یا همان سایتهای اینترنتی، سایت جامع www.mathworks.ir با سایتwww.matlabsite.com در حوزهی هوش مصنوعی و محاسبات نرم با مدیریت سید مصطفی کلامی هریس بسیار محبوب و پر خدمات هستند. سایت انگلیسی ctms.engin.umich.eduu متعلق به دانشگاه میشیگان در حوزهی کنترل نیز بسیار پر کیفیت است و مثالهای متنوعی دارد.
نویسندگان ایرانی مطلب نیز بسیار هستند و معمولا هر یک در بخشی از نرمافزار وسیع MATLAB به نگارش میپردازند. نیما جمشیدی و همکارنش تقریبا جز پیشگامان کتابهای عمومی MATLAB و سیمولینک محسوب میشوند. سید مصطفی کیا در حوزهی هوش مصنوعی و محاسبات نرم شامل شبکههای عصبی، فازی، ژنتیک الگوریتم و پردازش تصویر پیشتاز است. محمد فتحی و زمانی نیز در حوزه بخشهای تخصصی MATLAB شامل برنامهنویسی پیشرفته GUI و C/C++، جعبه ابزار کنترل مقاوم، انیمیشنسازی - واقعیت مجازی و سیمولینک عمومی و پیشرفته، جز پیشروان هستند. البته آقای علی اکبر علمداری و همکارانش را با کتابهای MATLAB عمومی و سیمولینک نیز نمیتوان جز نویسندگان پر کار و معروف در نظر نگرفت.
اگر به کتابهای عمومی MATLAB نیز نگاهی بیاندازیم ترجمه دو کتاب انگلیسی Mastering MATLAB و MATLAB Programming For Engineers بسیار موفق هستند. همچنین کتابهای پر محتوای و با کیفیت آقای نیما جمشیدی و علی اکبر علمداری نیز قابل توصیه هستند. تمرکز بیشتر این چهار کتاب و اکثر کتابهای عمومی بازار بر روی دستورات و توابع MATLAB است اما چنانچه به دنبال آموزش برنامهنویسی هستید ویرایش دوم کتاب برنامهنویسی پیشرفته MATLAB نوشتهی محمد فتحی که در جهاد دانشگاهی امیرکبیر نیز تدریس میشود، توصیه میگردد.
در حوزهی هوش مصنوعی و محاسبات نرم شامل شبکههای عصبی، فازی، ژنتیک الگوریتم و پردازش تصویر، کتابهای سید مصطفی کیا علیرغم ایرادهایی که در ویرایش اول آنها وجود داشت، قابل تقدیر است و بازار را انحصاری نمودهاند. اگرچه کارهای روان نیما جمشیدی و کارهای برنامهنویسی محمد فتحی نیز به چاپ رسیدهاست. به هر حال در کتابهای این بخش، من اصل کتاب Neural Network Design نوشتهی آقای Hagan را در حوزه شبکه عصبی و کتاب Digital Image Processing Using MATLAB نوشتهی آقای Gonzalez را در حوزه پردازش تصویر بسیار میپسندم و کتاب مختصر بهینهسازی غیر خطی نوشتهی رضا نریمانی و احمد نریمانی را توصیه میکنم.
در حوزهی کنترل؛ شاخهی مکان هندسی ریشهها و پاسخ فرکانسی مثالهای کتاب آقای علیاکبر علمداری با MATLAB کاربردی است و کتاب کنترل مدرن آقای اوگاتا نیز بسیار معتبر است. کتاب کنترل مقاوم Hinf (نرم بینهایت) نوشتهی دکتر تقیراد، فتحی و زمانی شامل مباحث تئوری و دستورات جعبه ابزار مقاوم MATLAB نیز مرجع دانشگاهی میباشد.
در حوزهی سیمولینک کتاب Mastering Simulink بسیار عالی است و کتاب مختصر نیما جمشیدی بسیار روان است. کتاب آقای علی اکبر علمداری نیز اگرچه جنبه آموزشی کمتری دارد اما مرجع بلوکهای سیمولینک است. به هر حال در این حوزه محمد فتحی و همکارانش با دو کتاب مرجع کاربردی سیمولینک و سیمولینک پیشرفته و کتاب تئوری و معروف مدلسازی و شبیهسازی دینامیک وسایل هوافضایی ترجمهی اثر آقای zipfel بسیار پرکار و پیشتاز هستند.
در حوزهی جعبه ابزار Simpower نیز تنها کتاب دکتر علی اکبر مطیع بیرجندی با نام شبیهسازی مدارهای الکترونیک قدرت با Simpower system MATLAB و کتاب شبیهسازی سیستمهای قدرت با استفاده از نرمافزار MATLAB نوشتهی دکتر عباس کتابی را دیدهام.
در حوزهی واقعیت مجازی و انیمیشن تنها کتاب محمد فتحی و کتاب شبیهسازی سیستمهای مکانیکی (SimMechanics) ترجمهی محمود نوروزی و همکارش نیز قبلا در بازار موجود بود اما جدیدا تجدید چاپ نشدهاند.
در حوزهی اقتصاد و اقتصادسنجی، شناسایی سیستم، MATLAB توانمندی گستردهای دارد که متاسفانه در این حوزه کار چندانی نشدهاست و جای کار زیادی وجود دارد.
جزوه کاربرد ریاضیات در مهندسی شیمی دکتر فاطمی دانشگاه تهران: