2102 words
11 minutes
Matlab Tutorial

Bind#

[[meta bind study]]

مطالب#

سرفصل متلب (4 جلسه)#

بخش 1: مبانی و اصول اولیه متلب#

  • مقدمه‌ای بر محیط متلب:
    • پنجره دستور (Command Window)
    • فضای کاری (Workspace)
    • ویرایشگر (Editor) و ایجاد فایل‌های اسکریپت (.m files)
    • پنجره راهنما (Help) و نحوه جستجوی موثر دستورات و توابع
  • متغیرها، آرایه‌ها و ماتریس‌ها:
    • تعریف متغیرها و انواع داده‌های اصلی
    • ایجاد بردارها و ماتریس‌ها: مستقیم، با استفاده از عملگر کولون (:)، توابع linspace, logspace
    • اندیس‌گذاری و دسترسی به عناصر ماتریس‌ها
    • عملیات پایه‌ای روی ماتریس‌ها: جمع، تفریق، ضرب ماتریسی و ضرب درایه‌به‌درایه، ترانهاده، معکوس، دترمینان
  • توابع ریاضی و داخلی مهم:
    • توابع مثلثاتی، نمایی، لگاریتمی، قدر مطلق و …
    • توابع مربوط به ماتریس‌ها: size, length, sum, mean, diag, eye, zeros, ones, rand

بخش 2: برنامه‌نویسی در متلب#

  • ترسیمات دوبعدی پایه:
    • دستور plot و سفارشی‌سازی اولیه: عنوان، برچسب محورها، لجند، شبکه (title, xlabel, ylabel, legend, grid)
    • ترسیم چندین نمودار روی یک شکل (hold on, hold off, subplot)
  • فایل‌های اسکریپت (Script Files) و توابع (Function Files):
    • تفاوت اسکریپت و تابع
    • نحوه تعریف تابع، ورودی‌ها و خروجی‌ها
    • فضای کاری محلی توابع
  • ساختارهای کنترل جریان:
    • دستورات شرطی: if-elseif-else, switch-case
    • عملگرهای رابطه‌ای و منطقی
  • حلقه‌های تکرار:
    • حلقه for
    • حلقه while
    • دستورات break و continue
  • ورود و خروج داده‌ها:
    • خواندن و نوشتن داده‌ها از/به فایل‌های متنی ساده (مانند .txt یا .csv) با توابع load و save یا dlmread/dlmwrite (در صورت وجود زمان)

بخش ۳: جعبه‌ابزار کنترل سیستم (Control System Toolbox)#

  • نمایش سیستم‌های خطی تغییرناپذیر با زمان (LTI):
    • تابع تبدیل (Transfer Function - TF):
      • ایجاد مدل تابع تبدیل با دستور tf
      • مشخص کردن صورت و مخرج
    • فضای حالت (State-Space - SS):
      • ایجاد مدل فضای حالت با دستور ss
      • مشخص کردن ماتریس‌های A,B,C,DA, B, C, D
    • مدل صفر-قطب-بهره (Zero-Pole-Gain - ZPK):
      • ایجاد مدل ZPK با دستور zpk
    • تبدیل بین مدل‌های مختلف (tf, ss, zpk)
  • اتصال سیستم‌ها:
    • اتصال سری (series یا عملگر *)
    • اتصال موازی (parallel یا عملگر +)
    • اتصال فیدبک (feedback)
  • تحلیل پاسخ زمانی:
    • پاسخ پله (step) و تحلیل مشخصات آن (زمان صعود، زمان نشست، بیشینه جهش، زمان پیک)
    • پاسخ ضربه (impulse)
    • پاسخ به ورودی دلخواه (lsim)
    • دستور stepinfo برای استخراج مشخصات پاسخ پله
  • تحلیل پاسخ فرکانسی:
    • نمودار بود (Bode plot) با دستور bode و margin
    • نمودار نایکوئیست (Nyquist plot) با دستور nyquist
    • نمودار نیکولز (Nichols chart) با دستور nichols
  • تحلیل مکان هندسی ریشه‌ها (Root Locus):
    • ترسیم مکان هندسی ریشه‌ها با دستور rlocus
    • ابزار گرافیکی rltool (یا controlSystemDesigner) برای تحلیل و طراحی تعاملی
  • استخراج اطلاعات از مدل‌ها:
    • قطب‌ها و صفرها (pole, zero, pzmap)
    • بهره حالت ماندگار (dcgain)

بخش ۴: طراحی مقدماتی کنترل‌کننده و شبیه‌سازی#

  • مقدمه‌ای بر طراحی کنترل‌کننده‌های PID:
    • زیگلر نیکولز
    • مفهوم عملکرد بخش‌های تناسبی (P)، انتگرالی (I) و مشتقی (D)
    • ایجاد شیء PID با دستور pid
    • تنظیم دستی ضرایب PID و مشاهده اثر آن بر پاسخ سیستم حلقه بسته
    • استفاده از ابزار pidTuner برای تنظیم خودکار ضرایب PID (معرفی و یک مثال)
  • شبیه‌سازی سیستم‌های حلقه بسته:
    • ساخت سیستم حلقه بسته با استفاده از توابع اتصال (مثلاً feedback)
    • تحلیل پاسخ زمانی و فرکانسی سیستم حلقه بسته
  • مفاهیم پایداری:
    • بررسی پایداری از روی قطب‌ها، نمودار نایکوئیست و مکان هندسی ریشه‌ها
  • مقدمه‌ای بر Simulink:
    • معرفی بسیار کوتاه محیط Simulink
    • ساخت یک مدل بلوکی ساده برای یک سیستم LTI و کنترل‌کننده PID
    • اجرای شبیه‌سازی و مشاهده خروجی با بلوک Scope

جلسه 1 1404-03-21#

مدیریت محیط#

  • clc: پاک کردن پنجره دستور (Command Window).
  • clear: پاک کردن همه‌ی متغیرها از حافظه (Workspace).
    • clear A: فقط متغیر A را پاک می‌کند.
  • who: نمایش لیست کوتاه نام متغیرها.
  • whos: نمایش لیست متغیرها با جزئیات کامل (اندازه و نوع).
  • close all: بستن تمام پنجره‌های نمودار (Figure).
  • doc name: نمایش راهنمای کامل و جامع دستور name (بهتر از help).

ساخت ماتریس و بردار#

  • : (کولون): ساخت دنباله عددی با گام ثابت. (مثال: 1:2:10)
  • linspace(a, b, n): ساخت بردار با n نقطه بین a و b (فاصله‌ها یکسان).
  • logspace(a, b, n): ساخت بردار با n نقطه بین 10a10^a و 10b10^b (فاصله‌ها لگاریتمی).
  • zeros(m, n): ساخت ماتریس m×n با تمام درایه‌های صفر.
  • ones(m, n): ساخت ماتریس m×n با تمام درایه‌های یک.
  • eye(n): ساخت ماتریس همانی n×n (قطر اصلی ۱، بقیه صفر).
  • rand(...): اعداد تصادفی با توزیع یکنواخت (بین ۰ و ۱).
  • randn(...): اعداد تصادفی با توزیع نرمال (گوسی).
  • randi([min, max], ...): اعداد صحیح تصادفی در یک بازه مشخص.

توابع ریاضی و محاسباتی#

  • ضرب ماتریسی (*): ضرب استاندارد ماتریس‌ها طبق قوانین ریاضی.
  • ضرب درایه‌به‌درایه (.*): ضرب هر عنصر در عنصر متناظرش. (برای توان و تقسیم هم .^ و ./ وجود دارد).
  • A' (ترانهاده): جابجایی سطر و ستون ماتریس A.
  • inv(A): محاسبه معکوس ماتریس A.
  • det(A): محاسبه دترمینان ماتریس A.
  • sum, mean, max, min: توابع آماری که به طور پیش‌فرض روی ستون‌ها عمل می‌کنند.
    • sum(A, 2): مجموع سطرها.
    • sum(A, 'all'): مجموع کل عناصر.
  • round, floor, ceil: توابع گرد کردن (به ترتیب: به نزدیک‌ترین، به پایین، به بالا).
  • mod(a, m): محاسبه باقیمانده تقسیم a بر m.

جلسه 2 1404-03-22#

دستورات ترسیم نمودار (Plotting)#

  • plot(x, y): دستور اصلی برای ترسیم نمودار دوبعدی y بر حسب x.
  • plot(x, y, '--r*'): ترسیم نمودار با استایل سفارشی (خط‌چین قرمز با نشانگر ستاره).
  • title('...'): افزودن عنوان به بالای نمودار.
  • xlabel('...'): تعیین برچسب برای محور افقی (x).
  • ylabel('...'): تعیین برچسب برای محور عمودی (y).
  • grid on: فعال کردن خطوط راهنمای شبکه‌ای روی نمودار.
  • legend('A', 'B'): ایجاد راهنما برای تشخیص نمودارهای مختلف در یک تصویر.
  • hold on: نگه داشتن نمودار فعلی تا نمودارهای بعدی روی همان محور رسم شوند.
  • hold off: غیرفعال کردن حالت hold on.
  • figure: ایجاد یک پنجره جدید برای رسم نمودار.
  • subplot(m, n, p): تقسیم پنجره به m سطر و n ستون و انتخاب خانه p برای رسم نمودار بعدی.

اسکریپت در مقابل تابع (Script vs. Function)#

  • اسکریپت (Script):

    • یک فایل .m حاوی مجموعه‌ای از دستورات.
    • روی فضای کاری اصلی (Base Workspace) عمل می‌کند (متغیرها بعد از اجرا باقی می‌مانند).
    • ورودی و خروجی رسمی ندارد.
    • برای اجرای یک سری کارهای پشت سر هم استفاده می‌شود.
  • تابع (Function):

    • یک فایل .m که با کلمه کلیدی function شروع می‌شود.
    • فضای کاری محلی و ایزوله خود را دارد (متغیرهای داخلی بعد از اجرا از بین می‌روند).
    • ورودی و خروجی مشخص و رسمی دارد.
    • برای ساخت ابزارهای ماژولار و قابل استفاده مجدد ایده‌آل است.
    • نکته مهم: نام فایل باید دقیقاً با نام تابع یکسان باشد.
  • disp('...'): نمایش یک متن یا مقدار متغیر در پنجره دستور.


دستورات کنترلی و منطقی#

  • **عملگرهای رابطه‌ای: > (بزرگتر)، < (کوچکتر)، == (برابر)، ~= (نابرابر).
  • عملگرهای منطقی: && (و منطقی)، || (یا منطقی)، ~ (نقیض).
  • if-elseif-else: ساختار شرطی برای تصمیم‌گیری و اجرای کد بر اساس درست یا غلط بودن یک شرط.
  • switch-case: ساختار شرطی بهینه‌تر برای مقایسه یک متغیر با چندین مقدار مشخص و گسسته.
  • input('پیام'): نمایش یک پیام و دریافت ورودی از کاربر.

حلقه‌های تکرار#

  • for: حلقه تکرار که برای تعداد دفعات مشخص اجرا می‌شود (مثلاً پیمایش اعضای یک بردار).
    • length(vector): طول (تعداد اعضای) یک بردار را برمی‌گرداند.
  • while: حلقه تکرار که تا زمانی که یک شرط برقرار باشد به اجرا ادامه می‌دهد.
  • break: دستور خروج فوری از حلقه‌ی for یا while.
  • continue: توقف تکرار فعلی و پرش به ابتدای تکرار بعدی حلقه.

ورودی و خروجی داده#

  • save('file.mat', 'var1', ...): ذخیره متغیرهای مشخص شده در یک فایل باینری متلب (.mat).
  • load('file.mat'): بارگذاری متغیرها از یک فایل .mat به فضای کاری.
  • writematrix(A, 'file.csv'): نوشتن یک ماتریس (A) در یک فایل متنی مانند csv. (مناسب برای اکسل).
  • readmatrix('file.csv'): خواندن داده‌های عددی از یک فایل متنی و وارد کردن آن به عنوان یک ماتریس.

جلسه 3 1404-03-22#

ساخت مدل‌های سیستم LTI#

  • tf(num, den): ساخت مدل تابع تبدیل (Transfer Function).
  • s = tf('s'): روش ساده‌تر برای نوشتن توابع تبدیل به صورت جبری.
  • ss(A, B, C, D): ساخت مدل فضای حالت (State-Space).
  • zpk(Z, P, K): ساخت مدل صفر-قطب-بهره (Zero-Pole-Gain).
  • tf(sys)، ss(sys)، zpk(sys): تبدیل یک مدل به نمایش دیگر.

اتصال و ترکیب سیستم‌ها#

  • G2 * G1: اتصال سری (Series).
  • G1 + G2: اتصال موازی (Parallel).
  • feedback(G, H): اتصال فیدبک منفی با مسیر پیش‌رو G و مسیر بازخورد H.

تحلیل پاسخ زمانی#

  • step(sys): رسم و تحلیل پاسخ پله (Step Response).
  • impulse(sys): رسم و تحلیل پاسخ ضربه (Impulse Response).
  • stepinfo(sys): استخراج مشخصات عددی پاسخ پله (زمان نشست، بیشینه جهش و…).
  • lsim(sys, u, t): شبیه‌سازی پاسخ سیستم به یک ورودی دلخواه u.

تحلیل پاسخ فرکانسی#

  • bode(sys): رسم نمودار بود (Bode plot) برای تحلیل اندازه و فاز.
  • margin(sys): نمایش حاشیه بهره (Gain Margin) و حاشیه فاز (Phase Margin) روی نمودار بود.
  • nyquist(sys): رسم نمودار نایکوئیست برای تحلیل پایداری.

تحلیل مکان هندسی ریشه‌ها#

  • rlocus(sys): رسم مکان هندسی ریشه‌ها (Root Locus) برای تحلیل اثر تغییر بهره.
  • controlSystemDesigner(sys): باز کردن ابزار گرافیکی و تعاملی برای طراحی کنترلر.

استخراج اطلاعات از مدل#

  • pole(sys): پیدا کردن قطب‌های سیستم.
  • zero(sys): پیدا کردن صفرهای سیستم.
  • pzmap(sys): رسم نقشه قطب-صفر در صفحه مختلط.
  • dcgain(sys): محاسبه بهره حالت ماندگار سیستم (پاسخ نهایی به ورودی پله).

جلسه 4 1404-03-23#

مبانی کنترل‌کننده PID#

  • بخش تناسبی (P - Proportional):

    • کارکرد: واکنش به خطای لحظه‌ای.
    • اثر: افزایش سرعت پاسخ. ممکن است باعث خطای حالت ماندگار شود.
  • بخش انتگرالی (I - Integral):

    • کارکرد: واکنش به مجموع خطاهای گذشته.
    • اثر: حذف کامل خطای حالت ماندگار. افزایش بیش از حد آن باعث نوسان (Overshoot) می‌شود.
  • بخش مشتقی (D - Derivative):

    • کارکرد: پیش‌بینی رفتار آینده خطا (مثل یک ترمز).
    • اثر: کاهش نوسان و بهبود پایداری. به نویز حساس است.
  • روش زیگلر-نیکولز (Ziegler-Nichols):

    • یک روش تجربی و کلاسیک برای پیدا کردن یک نقطه شروع مناسب برای ضرایب PID. مقادیر آن بهینه نیستند و نیاز به تنظیم دقیق‌تر دارند.

پیاده‌سازی در متلب و تحلیل پایداری#

  • pid(Kp, Ki, Kd): دستور اصلی برای ایجاد یک شیء کنترل‌کننده PID در محیط متلب.
  • pidTuner(P, 'pid'): باز کردن ابزار گرافیکی و خودکار متلب برای تنظیم بهینه ضرایب PID برای پلانت P.
    • اسلایدر Response Time: برای سریع‌تر یا کندتر کردن پاسخ سیستم.
    • اسلایدر Transient Behavior: برای تنظیم بین پاسخ تهاجمی (Aggressive) و مقاوم (Robust).
    • دکمه Export: برای صادر کردن کنترلر طراحی‌شده به محیط کاری (Workspace) متلب.
  • feedback(C*P, 1): ساخت سیستم حلقه-بسته با فیدبک واحد از کنترلر C و پلانت P.
  • تحلیل پایداری از روی قطب‌ها:
    • یک سیستم پایدار است اگر بخش حقیقی تمام قطب‌های حلقه-بسته آن منفی باشد.
    • pole(T): دستور پیدا کردن قطب‌های سیستم حلقه-بسته T.
    • pzmap(T): رسم نقشه قطب-صفر برای مشاهده گرافیکی مکان قطب‌ها.

  • simulink: دستوری که محیط سیمولینک را باز می‌کند.

بلوک‌های کلیدی در Simulink:

  • Step: منبع سیگنال برای ایجاد یک ورودی پله واحد.
  • Transfer Fcn: بلوکی برای تعریف یک سیستم از طریق تابع تبدیل آن.
  • Scope: نمایشگر خروجی برای مشاهده سیگنال‌ها (مانند یک اسیلوسکوپ).
  • Sum: بلوک جمع‌کننده. برای فیدبک منفی، ورودی‌های آن را روی |+- تنظیم می‌کنیم تا خطا را محاسبه کند.
  • PID Controller: بلوک اختصاصی برای کنترل‌کننده PID. ضرایب P, I, D را می‌توان مستقیماً در آن وارد کرد.
  • Mux (Multiplexer): برای ادغام چند سیگنال در یک خط و نمایش همزمان آن‌ها روی یک Scope.

مراحل ساخت مدل حلقه-بسته در Simulink:

  1. ورودی مرجع: از بلوک Step استفاده کنید.
  2. محاسبه خطا: خروجی Step را به ورودی + بلوک Sum و خروجی نهایی سیستم را به ورودی - آن وصل کنید.
  3. اعمال کنترلر: خروجی Sum (که همان خطا است) را به ورودی بلوک PID Controller وصل کنید.
  4. اعمال به پلانت: خروجی PID Controller را به ورودی بلوک Transfer Fcn (پلانت) وصل کنید.
  5. مشاهده خروجی: خروجی Transfer Fcn را به Scope وصل کنید تا پاسخ نهایی را ببینید.
  6. اجرا: روی دکمه Run (▶️) کلیک کنید تا شبیه‌سازی اجرا شود.
  • نکته مهم: دکمه Tune… در تنظیمات بلوک PID Controller، ابزار pidTuner را مستقیماً از داخل سیمولینک باز می‌کند.

تمرین پایانی#

سوال 1: ساخت و محاسبات ماتریسی#

  • یک ماتریس A با ابعاد 4x4 بسازید که شامل اعداد صحیح 1 تا 16 باشد.
  • یک ماتریس همانی B با ابعاد 4x4 بسازید و سپس تمام درایه‌های آن را در عدد 5 ضرب کنید.
  • با استفاده از اندیس‌گذاری، ستون سوم ماتریس A را استخراج کرده و در متغیری به نام col_A ذخیره کنید.
  • حاصل دو عملیات زیر را محاسبه کرده و در متغیرهای C1 و C2 ذخیره کنید:
    • C1 = A .* B (ضرب درایه‌به‌درایه)
    • C2 = A * B (ضرب ماتریسی)
  • به طور خلاصه در یک کامنت (با علامت %) توضیح دهید که چرا مقادیر C1 و C2 با یکدیگر متفاوت هستند.

سوال 2: تحلیل داده‌های ساده#

ماتریس زیر بیانگر میزان فروش (به میلیون تومان) سه محصول مختلف در چهار ماه اول سال است. هر سطر نمایانگر یک ماه و هر ستون نمایانگر یک محصول است.

sales = [22 35 15; 25 38 18; 30 40 20; 28 33 17];
  • اسکریپتی بنویسید که مجموع فروش هر محصول در این چهار ماه را محاسبه و نمایش دهد.
  • میانگین فروش هر محصول در این چهار ماه چقدر بوده است؟
  • مجموع کل فروش در ماه سوم چقدر بوده است؟ (مجموع درایه‌های سطر سوم)
  • د) با استفاده از تابع size، تعداد ماه‌ها و تعداد محصولات را از ماتریس استخراج کرده و در خروجی با دستور disp نمایش دهید.

سوال 3: پروژه کنترلر PID برای سروو موتور#

برای پلانت یک سروو موتور با تابع تبدیل P(s)=1.5s(s+1)(s+5)P(s) = \frac{1.5}{s(s+1)(s+5)}، یک کنترلر PID طراحی کنید به طوری که پاسخ پله حلقه-بسته آن دارای بیشینه جهش (Overshoot) کمتر از ۱۰٪ و زمان نشست (Settling Time) کمتر از ۲.۵ ثانیه باشد.

  • در متلب، با استفاده از ابزار pidTuner کنترلر بهینه را پیدا کرده و آن را به Workspace منتقل کنید.
  • پاسخ پله سیستم نهایی را با step رسم کرده و با stepinfo و margin مشخصات زمانی و پایداری آن را تأیید کنید.
  • در Simulink، همان سیستم حلقه-بسته را با ضرایب PID بدست آمده شبیه‌سازی کرده و خروجی Scope را با نمودار step متلب مقایسه کنید تا از صحت کار خود مطمئن شوید.

سوال 4: پروژه سرکوب اغتشاش#

برای پلانت P(s)=10s2+3s+10P(s) = \frac{10}{s^2 + 3s + 10} که در ورودی آن یک اغتشاش پله (d) وارد می‌شود، یک کنترلر PI طراحی کنید به طوری که حاشیه فاز (Phase Margin) سیستم حلقه-باز حداقل ۶۰ درجه باشد. هدف اصلی، تحلیل و مشاهده توانایی کنترلر در سرکوب اغتشاش است.

  • در متلب، ضرایب یک کنترلر PI را طوری تنظیم کنید که شرط حاشیه فاز برآورده شود.
  • تابع حساسیت (S=1/(1+CP)S = 1/(1+C*P)) که نشان‌دهنده اثر اغتشاش بر خروجی است را محاسبه کرده و پاسخ پله آن را تحلیل کنید.
  • در Simulink، مدل حلقه-بسته را همراه با یک بلوک Step برای اغتشاش (که بعد از کنترلر و قبل از پلانت اضافه می‌شود) بسازید.
  • شبیه‌سازی را اجرا کرده و مشاهده کنید که کنترلر چگونه پس از ورود اغتشاش، خروجی را به حالت مطلوب بازمی‌گرداند. این رفتار را با تحلیل تابع حساسیت در متلب مقایسه کنید.
Matlab Tutorial
https://jamshidzadeh.ir/posts/study/matlab-tutorial/
Author
Ali Jamshidzadeh
Published at
2025-05-18