آموزش کامل کنترل LQR در MATLAB به زبان ساده (به همراه مثال عددی و کد آماده)
آموزش کامل کنترل LQR در MATLAB به زبان ساده (به همراه مثال عددی و کد آماده)
🧠 1. مقدمه: کنترل بهینه چیست و چرا LQR مهم است؟
در دنیای مهندسی کنترل، همیشه یک چالش اساسی وجود دارد:
چطور میتوان سیستمی را طوری کنترل کرد که عملکرد سریع و دقیق داشته باشد، اما انرژی یا تلاش کنترلی کمتری مصرف کند؟
اینجاست که مفهوم کنترل بهینه (Optimal Control) وارد میدان میشود.
🎯 مفهوم کنترل بهینه (Optimal Control)
کنترل بهینه شاخهای از کنترل مدرن است که هدف آن یافتن بهترین ورودی کنترلی برای یک سیستم دینامیکی است؛ بهگونهای که یک تابع هزینه (Cost Function) به حداقل برسد.
به زبان سادهتر، در کنترل بهینه ما به دنبال تعادلی بین پاسخ سریع سیستم و مصرف کم انرژی کنترلکننده هستیم.
یکی از معروفترین و پرکاربردترین روشهای کنترل بهینه، کنترلکننده LQR (Linear Quadratic Regulator) است.
این روش در بسیاری از منابع آموزشی به عنوان پایهی طراحی کنترلکنندههای مدرن معرفی میشود.
در MATLAB نیز ابزارها و توابع قدرتمندی برای طراحی و شبیهسازی کنترل LQR در اختیار کاربران قرار دارد.
⚖️ تفاوت کنترل کلاسیک و کنترل مدرن
در کنترل کلاسیک (مانند PID یا روشهای مبتنی بر پاسخ فرکانسی)، تمرکز معمولاً روی خروجی سیستم است و مدل ریاضی داخلی سیستم در نظر گرفته نمیشود.
اما در کنترل مدرن، سیستم بهصورت مدل فضای حالت (State-Space) توصیف میشود، و طراحی کنترلکننده بر اساس متغیرهای حالت داخلی انجام میگیرد.
در کنترل مدرن، ما مستقیماً رفتار دینامیکی سیستم را با استفاده از معادلات حالت کنترل میکنیم، و میتوانیم حتی برای سیستمهای چندورودی و چندخروجی (MIMO) نیز کنترل بهینه طراحی کنیم.
در این میان، کنترل LQR در MATLAB یکی از ابزارهای اصلی برای طراحی چنین کنترلکنندههایی است که هم از نظر دقت و هم از نظر پایداری عملکرد بسیار بالایی دارد.
🚀 کاربردهای کنترل LQR در سیستمهای واقعی
کنترل LQR در بسیاری از سیستمهای واقعی و صنعتی مورد استفاده قرار میگیرد.
برخی از مهمترین کاربردهای آن عبارتند از:
-
کنترل پهپادها و هواپیماها: طراحی مسیر بهینه و پایدارسازی زاویه پرواز
-
رباتهای صنعتی: حرکت نرم و دقیق بازوهای ربات با حداقل مصرف انرژی
-
خودروهای خودران و سیستمهای تعلیق فعال: بهبود پایداری و راحتی رانندگی
-
فضاپیماها و ماهوارهها: کنترل وضعیت (Attitude Control) و حفظ تعادل در مانورهای مداری
-
پاندول معکوس (Inverted Pendulum): یکی از مثالهای معروف آموزشی برای تست عملکرد LQR در MATLAB
در آموزشهای کنترل مدرن، مثال پاندول معکوس تقریباً همیشه برای نمایش قدرت کنترلکننده LQR استفاده میشود.
با طراحی مناسب ماتریسهای وزندهی Q و R، میتوان دید که سیستم ناپایدار بهراحتی به حالت تعادل بازمیگردد.
⚙️ 2. مروری کوتاه بر مدل فضای حالت (State-Space)
یکی از بزرگترین تفاوتهای کنترل مدرن با کنترل کلاسیک، نحوهی مدلسازی سیستم است.
در کنترل کلاسیک معمولاً با توابع انتقال (Transfer Function) کار میکنیم، اما در کنترل مدرن از مدل فضای حالت (State-Space Model) استفاده میشود که اطلاعات کاملتری از رفتار درونی سیستم در اختیار ما میگذارد.
🧩 فرم کلی معادلات حالت
مدل فضای حالت، رفتار دینامیکی سیستم را با استفاده از دو معادله اصلی توصیف میکند:
AX(t) + Bu(t) = Ẋ(t)
CX(t) + Du(t) = y(t)
که در آن:
| نماد | توضیح |
|---|---|
| ( x(t) ) | بردار حالتها (States) — متغیرهای داخلی سیستم که وضعیت فعلی آن را مشخص میکنند. |
| ( u(t) ) | بردار ورودیها (Inputs) — سیگنالهای کنترلی اعمالشده به سیستم. |
| ( y(t) ) | بردار خروجیها (Outputs) — متغیرهایی که ما از سیستم مشاهده میکنیم. |
| ( A ) | ماتریس دینامیکی سیستم که ارتباط بین حالتها را مشخص میکند. |
| ( B ) | ماتریس ورودیها که نشان میدهد هر ورودی روی کدام حالت تأثیر دارد. |
| ( C ) | ماتریس خروجیها که حالتها را به خروجی تبدیل میکند. |
| ( D ) | ماتریس مستقیم ورودی به خروجی (در بسیاری از سیستمها صفر است). |
این مدل، پایهی طراحی کنترلکننده LQR در MATLAB است؛ زیرا تابع هزینهی LQR مستقیماً بر اساس متغیرهای حالت ( x(t) ) تعریف میشود.
🔢 مثال ساده از مدل فضای حالت
فرض کنید یک سیستم مرتبهدوم داریم که معادلهاش به صورت زیر است:
![]()
میخواهیم آن را به فرم فضای حالت بنویسیم.
- تعریف حالتها:
x1 = y
x2 = ẏ -
نوشتن معادلات حالت:
ẋ1 = x2
ẋ2 = -2×1 – 3×2 + u - فرم ماتریسی:
A = [0 1;
-2 -3]B = [0;
1]C = [1 0]
D = [0]
در نتیجه مدل کامل به صورت زیر نوشته می شود:
A X(t) + B u(t) = Ẋ(t)
C X(t) + D u(t) = y(t)
💻 مثال در MATLAB
میتوان این سیستم را در MATLAB بهصورت زیر تعریف کرد:
A = [0 1; -2 -3];
B = [0; 1];
C = [1 0];
D = 0;
sys = ss(A, B, C, D);
step(sys)
🔹 دستور ss مدل فضای حالت را ایجاد میکند.
🔹 دستور step(sys) پاسخ زمانی سیستم به ورودی پله را نشان میدهد.
با همین مدل میتوان در مراحل بعدی، کنترلکننده LQR را طراحی کرد و با دستور lqr(A,B,Q,R) بهرهی بهینه را به دست آورد.
💡 نکات کلیدی
- در کنترل مدرن، هر سیستمی (حتی غیرخطی) معمولاً ابتدا به فرم فضای حالت نوشته میشود.
- اگر سیستم با چند ورودی و خروجی (MIMO) باشد، ماتریسهای A، B، C و D ابعاد بزرگتری خواهند داشت.
- مدل فضای حالت نهتنها برای شبیهسازی در MATLAB بلکه برای طراحی LQR، LQG، و Kalman Filter ضروری است.
🎯 3. ایده اصلی کنترل LQR (Linear Quadratic Regulator)
هدف کنترلکنندهی LQR در MATLAB اینه که برای یک سیستم دینامیکی خطی، ورودی کنترلی بهینهای پیدا کنه تا هم پاسخ سریع و دقیق داشته باشه و هم انرژی سیگنال کنترلی تا حد ممکن کم مصرف بشه.
به عبارت دیگر، LQR به دنبال یک تعادل هوشمند بین عملکرد مطلوب سیستم و صرفهجویی در انرژی است.
🧠 تعریف تابع هزینه (Cost Function)
در کنترل LQR، عملکرد سیستم با یک تابع به نام تابع هزینه یا Cost Function سنجیده میشود.
این تابع معمولاً به صورت زیر تعریف میشود:
J = ∫ [ Xᵀ(t) Q X(t) + uᵀ(t) R u(t) ] dt
که در آن:
| نماد | توضیح |
|---|---|
| J | تابع هزینه (مقداری که باید حداقل شود) |
| X(t) | بردار حالتهای سیستم |
| u(t) | بردار ورودی کنترلی |
| Q | ماتریس وزندهی حالتها |
| R | ماتریس وزندهی ورودیها |
🔹 هدف کنترل LQR این است که مقدار تابع هزینه J حداقل شود.
یعنی سیستمی داشته باشیم که نه بیش از حد نوسان کند و نه انرژی زیادی برای کنترل صرف کند.
⚖️ مفهوم وزندهی ماتریسهای Q و R
در طراحی LQR controller، انتخاب مناسب ماتریسهای Q و R بسیار حیاتی است؛ چون تعیین میکند کنترلکننده روی چه چیزی تمرکز بیشتری داشته باشد:
▪ ماتریس Q → اهمیت حالتها
- عناصر بزرگتر در Q باعث میشوند حالتهای سیستم سریعتر و دقیقتر به مقدار مطلوب برسند.
- اگر Q خیلی بزرگ انتخاب شود، کنترلکننده سیستم را به شدت سختگیرانه تنظیم میکند و ورودیها ممکن است بزرگ شوند.
▪ ماتریس R → اهمیت انرژی کنترلی
- R بیانگر هزینهی انرژی سیگنال کنترلی u(t) است.
- هر چه R بزرگتر باشد، سیستم تمایل دارد ورودیهای کوچکتر و نرمتر تولید کند (کنترل ملایمتر ولی کندتر).
🧩 مثال شهودی:
اگر Q را زیاد و R را کم انتخاب کنیم ⇒ عملکرد سریع ولی کنترل تند و پرانرژی داریم.
اگر Q را کم و R را زیاد انتخاب کنیم ⇒ عملکرد آرامتر ولی مصرف انرژی کمتر خواهیم داشت.
در واقع، تنظیم Q و R مثل میزان حساسیت و صرفهجویی سیستم است.
⚙️ هدف نهایی LQR: تعادل بین عملکرد و انرژی مصرفی
هدف اصلی در طراحی LQR این است که بهرهی کنترلی ( K ) را طوری انتخاب کنیم که تابع هزینه ( J ) حداقل شود.
بهصورت خلاصه:
هدف: کمینهسازی
J = ∫ ( Xᵀ Q X + uᵀ R u ) dt
با فرض اینکه
Ẋ(t) = A X(t) + B u(t)
با استفاده از روشهای ریاضی (از جمله معادلهی آلفا–ریکاتی)، میتوان نشان داد که ورودی کنترلی بهینه بهصورت زیر است:
u(t) = -K X(t)
که در آن:
K = R⁻¹ Bᵀ P
و ماتریس P حاصل حل معادله ریکاتی (Riccati Equation) است.
💻 در MATLAB:
در محیط MATLAB، محاسبهی بهرهی بهینه K بسیار ساده است. کافی است از دستور زیر استفاده کنیم:
K = lqr(A, B, Q, R);
این دستور بهصورت خودکار معادلهی ریکاتی را حل میکند و K بهینه را برمیگرداند.
سپس میتوان ورودی کنترل را به صورت زیر اعمال کرد:
u = -K * X;
⚙️ 4. استخراج قانون کنترل بهینه (معادله ریکاتی)
در بخش قبل گفتیم هدف کنترل LQR، پیدا کردن ورودی کنترلی ( u(t) ) است که تابع هزینه زیر را کمینه کند:
J = ∫ [ Xᵀ(t) Q X(t) + uᵀ(t) R u(t) ] dt
با توجه به مدل فضای حالت:
Ẋ(t) = A X(t) + B u(t)
برای رسیدن به قانون کنترل بهینه، از مفهومی به نام اصل بهینگی بلمن (Bellman Optimality Principle) استفاده میکنیم.
🧠 1. تشریح معادله آلفا–بلمن (Bellman Equation)
اصل بلمن میگوید:
“مسیر بهینه در هر لحظه، باید شامل تصمیم بهینه از آن لحظه تا انتها باشد.”
این اصل را میتوان به شکل ریاضی برای کنترل بهینه پیوسته (Continuous-Time Optimal Control) به صورت زیر نوشت:
0 = min₍u₎ [ Xᵀ Q X + uᵀ R u + (∂V/∂X)ᵀ (A X + B u) ]
که در آن ( V(X) ) تابع ارزش (Value Function) است و هزینهی آیندهی سیستم را بیان میکند.
📘 2. معادله آلفا–ریکاتی (Algebraic Riccati Equation – ARE)
برای سیستم خطی و تابع هزینهی درجه دوم، فرض میکنیم تابع ارزش به صورت زیر باشد:
V(X) = Xᵀ P X
با جایگذاری این فرض در معادله بلمن، و کمینهسازی نسبت به ( u )، به معادله ریکاتی جبری (ARE) میرسیم:
Aᵀ P + P A - P B R⁻¹ Bᵀ P + Q = 0
این معادله، پایه و اساس کنترل LQR است.
ماتریس ( P ) از حل این معادله به دست میآید و اطلاعات تعادل بین دقت و انرژی را در خود دارد.
🧩 3. محاسبه بهره بهینه K
وقتی ماتریس ( P ) از معادله ریکاتی بدست آمد، قانون کنترل بهینه به شکل زیر تعریف میشود:
u(t) = -K X(t)
که در آن بهرهی بهینه ( K ) برابر است با:
K = R⁻¹ Bᵀ P
به این ترتیب، ( K ) تعیین میکند که در هر لحظه سیستم چقدر از هر حالت ( X_i ) برای اصلاح ورودی استفاده کند.
💻 4. پیادهسازی در MATLAB
در MATLAB، نیازی نیست معادله ریکاتی را بهصورت دستی حل کنید. دستور lqr همهی این مراحل را خودکار انجام میدهد:
% تعریف ماتریسهای سیستم
A = [0 1; -2 -3];
B = [0; 1];
% تعریف ماتریسهای وزندهی
Q = [1 0; 0 1];
R = 1;
% محاسبه بهره بهینه
[K, P, eigVals] = lqr(A, B, Q, R);
disp('بهره بهینه K =');
disp(K);
disp('ماتریس P =');
disp(P);
🔹 خروجی این کد:
K→ ماتریس بهرهی کنترلی بهینهP→ جواب معادله ریکاتیeigVals→ مقادیر ویژهی سیستم حلقه بسته (برای بررسی پایداری)
- معادله بلمن پایهی نظری کنترل LQR است.
- با فرض تابع ارزش درجه دوم، به معادله ریکاتی جبری (ARE) میرسیم.
- حل این معادله، ماتریس ( P ) را به دست میدهد و از آن، بهرهی بهینه ( K ) استخراج میشود.
- MATLAB ابزار قدرتمندی برای محاسبهی مستقیم ( K ) و ( P ) از طریق دستور
lqrفراهم میکند.
💻 5. پیادهسازی کنترل LQR در MATLAB
در این بخش یاد میگیری چطور با چند خط کد ساده، کنترلکننده بهینه LQR رو در MATLAB طراحی و تست کنی.
🔹 1. نحوه استفاده از دستور lqr(A, B, Q, R)
در MATLAB، تابع زیر برای طراحی کنترلکننده LQR استفاده میشود:
[K, P, eigVals] = lqr(A, B, Q, R)
📘 در این دستور:
AوB→ ماتریسهای مدل فضای حالتQ→ وزندهی به خطای حالتهاR→ وزندهی به توان سیگنال کنترلK→ بهره کنترلی بهینه (خروجی اصلی)P→ جواب معادله ریکاتیeigVals→ مقادیر ویژهی سیستم حلقه بسته
🔍 2. مثال ساده
فرض کنید سیستم دینامیکی زیر را داریم:
Ẋ(t) = A X(t) + B u(t)
با ماتریسها:
A = [0 1; -2 -3];
B = [0; 1];
اکنون میخواهیم یک کنترلکنندهی LQR طراحی کنیم تا سیستم سریع و پایدار شود.
% --- طراحی کنترلکننده LQR ---
Q = [10 0; 0 1]; % وزندهی به خطای حالتها
R = 1; % وزندهی به سیگنال کنترل
[K, P, eigVals] = lqr(A, B, Q, R);
disp('بهرهی بهینه K =');
disp(K);
disp('مقادیر ویژه سیستم حلقه بسته =');
disp(eigVals);
خروجی این دستور، بهرهی ( K ) و مقادیر ویژهی سیستم کنترلشده است.
اگر مقادیر ویژه دارای قسمت حقیقی منفی باشند، سیستم حلقه بسته پایدار است ✅
⚖️ 3. توضیح مفهومی ورودیها و خروجیها
| نام پارامتر | نوع | توضیح کاربردی |
|---|---|---|
| A | ماتریس ( n×n ) | دینامیک سیستم (Dynamics) |
| B | ماتریس ( n×m ) | اثر ورودی روی حالتها |
| Q | ماتریس ( n×n ) | وزندهی به انحراف حالتها |
| R | ماتریس ( m×m ) | وزندهی به شدت ورودی کنترل |
| K | ماتریس ( m×n ) | بهرهی کنترلکننده LQR |
| P | ماتریس ( n×n ) | جواب معادله ریکاتی |
| eigVals | بردار | مقادیر ویژه حلقه بسته |
🧠 4. نکات مهم در انتخاب Q و R
انتخاب مناسب ( Q ) و ( R ) بسیار حیاتی است چون مستقیماً روی رفتار سیستم تأثیر دارد:
| هدف طراح | انتخاب Q و R | نتیجه |
|---|---|---|
| پاسخ سریعتر | مقدار عناصر Q را زیاد کن | افزایش سرعت، ولی کنترل قویتر و مصرف انرژی بیشتر |
| پاسخ نرمتر | مقدار R را زیاد کن | کاهش انرژی مصرفی، ولی کندتر شدن پاسخ |
| تمرکز روی حالت خاص | فقط عنصر مربوط در Q را افزایش بده | حالت موردنظر دقیقتر کنترل میشود |
| تعادل بین دقت و انرژی | مقیاسهای Q و R را طوری انتخاب کن که مقادیر خروجی و ورودی قابل مقایسه باشند | بهترین عملکرد کلی |
📌 نکته:
- ماتریس Q باید نیمهمثبت قطعی (Positive Semi-Definite) باشد.
- ماتریس R باید مثبت قطعی (Positive Definite) باشد.
- در عمل، معمولاً از مقادیر قطری برای Q و R استفاده میشود.
🧩 5. شبیهسازی پاسخ حلقه بسته
بعد از محاسبهی ( K )، میتوانید رفتار سیستم حلقه بسته رو شبیهسازی کنید:
A_cl = A - B*K; % ماتریس حلقه بسته
sys_cl = ss(A_cl, B, [1 0], 0); % سیستم فضای حالت
step(sys_cl) % رسم پاسخ پله
title('پاسخ پله سیستم با کنترل LQR')
🔹 این کد نمودار پاسخ پلهی سیستم حلقه بسته را نمایش میدهد.
میتوانید با تغییر Q و R ببینید پاسخ چطور سریعتر یا نرمتر میشود.
⚡ جمعبندی
- دستور
lqr(A,B,Q,R)سادهترین روش برای طراحی کنترلکننده LQR در MATLAB است. - انتخاب درست ماتریسهای Q و R تعیینکنندهی عملکرد نهایی سیستم است.
- میتوان با تغییر آنها بین دقت بالا و مصرف انرژی کمتر تعادل برقرار کرد.
⚙️ 6. مثال عددی کامل از طراحی کنترل LQR در MATLAB
🎯 هدف
در این مثال، یک سیستم دومرتبهای (که میتواند نمایندهی سادهای از یک پاندول معکوس باشد) را کنترل میکنیم.
میخواهیم سیستم ناپایدار را با استفاده از کنترلکنندهی LQR پایدار و سریع کنیم.
🧩 1. تعریف مدل سیستم
فرض کنید سیستم دینامیکی ما طبق معادله زیر است:
Ẍ + 3Ẋ + 2Y = u
برای نمایش در فضای حالت، متغیرهای حالت را تعریف میکنیم:
x₁ = y
x₂ = ẏ
پس مدل فضای حالت به شکل زیر درمیآید:
Ẋ = A X + B u
که در آن:
A = [0 1
-2 -3]
B = [0
1]
C = [1 0]
D = 0
💻 2. نوشتن کد کامل در MATLAB
%% طراحی کنترلکننده LQR برای سیستم دومرتبهای
clc; clear; close all;
% --- 1. تعریف مدل سیستم ---
A = [0 1; -2 -3];
B = [0; 1];
C = [1 0];
D = 0;
% --- 2. تعریف ماتریسهای وزندهی ---
Q = [10 0; 0 1]; % وزندهی به انحراف حالتها
R = 1; % وزندهی به توان ورودی کنترل
% --- 3. طراحی کنترلکننده LQR ---
[K, P, eigVals] = lqr(A, B, Q, R);
disp('بهرهی بهینه K =');
disp(K);
disp('مقادیر ویژه سیستم حلقه بسته =');
disp(eigVals);
% --- 4. ساخت سیستم حلقه باز و حلقه بسته ---
sys_open = ss(A, B, C, D); % سیستم بدون کنترل
A_cl = A - B*K; % سیستم حلقه بسته
sys_closed = ss(A_cl, B, C, D); % سیستم با کنترلکننده LQR
% --- 5. رسم پاسخ زمانی ---
t = 0:0.01:10;
[y_open, t] = step(sys_open, t);
[y_closed, ~] = step(sys_closed, t);
figure;
plot(t, y_open, 'r--', 'LineWidth', 1.5); hold on;
plot(t, y_closed, 'b-', 'LineWidth', 2);
grid on;
xlabel('زمان (ثانیه)');
ylabel('پاسخ خروجی y(t)');
title('مقایسه پاسخ سیستم قبل و بعد از اعمال کنترلکننده LQR');
legend('سیستم بدون کنترل', 'سیستم با کنترل LQR', 'Location', 'Best');
🔍 3. توضیح خطبهخط کد
| بخش | توضیح |
|---|---|
A, B, C, D |
تعریف ماتریسهای مدل فضای حالت |
Q, R |
تعیین اهمیت دقت و انرژی کنترل |
lqr(A,B,Q,R) |
حل معادله ریکاتی و محاسبه بهرهی بهینه K |
A - B*K |
تشکیل سیستم حلقه بسته با بازخورد حالت |
ss() |
ساخت مدل فضای حالت در MATLAB |
step() |
رسم پاسخ پله برای مقایسه عملکرد سیستمها |
plot() |
رسم نمودار خروجیها با رنگ و ضخامت متفاوت |
📈 4. تحلیل نتایج شبیهسازی
نتیجه شبیه سازی با متلب به صورت زیر است:

- منحنی قرمز (—) → پاسخ سیستم بدون کنترلکننده
🔸 دارای نوسان زیاد و ممکن است ناپایدار باشد. - منحنی آبی (—) → پاسخ سیستم با کنترل LQR
✅ سریعتر به حالت تعادل میرسد
✅ نوسانات کمتر دارد
✅ ورودی کنترل با انرژی مناسب تولید شده است
بله ✅ خروجی کاملاً درسته و از نظر مفهومی دقیقاً مطابق رفتار مورد انتظار کنترلکنندهی LQR هست.
این نمودار یه مثال عالی برای آموزش تأثیر LQR بر پایداری و سرعت پاسخ سیستمهای خطی محسوب میشه.
در ادامه میتونی از این تحلیل آماده برای متن وبلاگ استفاده کنی 👇
🔍در شکل بالا، پاسخ زمانی سیستم دومرتبهای قبل و بعد از طراحی کنترلکنندهی LQR (Linear Quadratic Regulator) نمایش داده شده است.
- منحنی قرمز (—) مربوط به سیستم بدون کنترلکننده (حلقه باز) است.
مشاهده میشود که پاسخ سیستم به ورودی پله، بهآرامی افزایش یافته و در مقدار حدود ۰٫۵ پایدار میشود.
این رفتار نشان میدهد که سیستم اگرچه پایدار است، اما خطای ماندگار بالا دارد و سرعت پاسخ نسبتاً پایین است. - منحنی آبی (—) مربوط به سیستم پس از اعمال کنترلکنندهی LQR (حلقه بسته) است.
سیستم کنترلشده دارای ویژگیهای زیر است:- پاسخ سریعتر و نرمتر نسبت به حالت بدون کنترل
- کاهش قابل توجه نوسانات و اورشوت
- پایداری بهتر و همگرایی سریعتر به مقدار حالت تعادلی (حدود ۰٫۲۶)
- کاهش انرژی مصرفی در سیگنال کنترل (بهواسطهی وزندهی ماتریس R)
با اعمال کنترلکنندهی LQR، پاسخ سیستم بهینهسازی شده است تا بین دو هدف اصلی تعادل برقرار شود:
- بهبود عملکرد دینامیکی سیستم (سرعت همگرایی و پایداری)
- کاهش انرژی مصرفی کنترل
به عبارت دیگر، LQR با استفاده از حل معادله ریکاتی (ARE) بهترین بردار بهرهی K را بهدست آورده و سیستم را به سمت حالت مطلوب هدایت کرده است.
✳️ نکته آموزشی:
اگر هدف این باشد که خروجی سیستم دقیقاً به مقدار مرجع (مثلاً ۱) برسد، باید نسخهی LQI (LQR با انتگرالگیر) طراحی شود تا خطای ماندگار صفر شود.
اما در این مثال، تمرکز صرفاً روی بهینهسازی پاسخ و پایداری است، که با LQR بهخوبی حاصل شده است.
⚖️ 5. تأثیر انتخاب Q و R
برای مشاهده اثر تنظیم پارامترها:
Q = [100 0; 0 1]; % افزایش وزن خطا → پاسخ سریعتر
R = 0.1; % کاهش هزینه کنترل → انرژی مصرفی بیشتر
📊 نتیجه: سیستم سریعتر ولی کنترل قویتر میشود.
برعکس، اگر R را افزایش دهید، پاسخ کندتر ولی نرمتر میشود.
🧠 بخش 7: انتخاب بهینه Q و R با رویکرد تجربی و هوش مصنوعی (AI-Based Tuning)
یکی از مهمترین چالشها در طراحی کنترلکنندهی LQR (Linear Quadratic Regulator)، انتخاب مناسب ماتریسهای وزندهی Q و R است.
این دو ماتریس تأثیر مستقیم بر عملکرد سیستم و انرژی مصرفی کنترل دارند.
🎯 1. روش دستی انتخاب Q و R (تجربی)
در روش کلاسیک، مهندس کنترل معمولاً Q و R را به صورت تجربی یا با آزمون و خطا انتخاب میکند.
🔹 مثال ساده:
Q = [10 0; 0 1]; % وزن بیشتر برای خطای موقعیت
R = 1; % مصرف انرژی معمولی
K = lqr(A, B, Q, R);
در اینجا چون Q(1,1)=10 است، کنترلکننده اهمیت بیشتری به خطای موقعیت نسبت به سرعت داده است.
🤖 2. استفاده از الگوریتمهای هوش مصنوعی برای تنظیم خودکار LQR
با ظهور هوش مصنوعی و بهینهسازیهای تکاملی، میتوان بهصورت خودکار بهترین Q و R را یافت تا تابع هزینه (Cost Function) کمینه شود.
الگوریتمهایی مانند:
- Genetic Algorithm (GA) → الگوریتم ژنتیک
- Particle Swarm Optimization (PSO) → بهینهسازی ازدحام ذرات
- Artificial Bee Colony (ABC) → الگوریتم زنبور مصنوعی
میتوانند مقادیر بهینهی Q و R را بر اساس هدفی مشخص (مثلاً مینیمم شدن خطای انتگرالی یا زمان نشست) پیدا کنند.
🧩 3. مثال کوتاه از بهینهسازی Q و R با الگوریتم ژنتیک در MATLAB
در این مثال فرضی، هدف ما کمینه کردن خطای انتگرالی مربعی (ISE) برای یک سیستم ساده است:
🔹 Objective Function — LQR_cost.m
function cost = LQR_cost(params)
% پارامترهای ورودی الگوریتم ژنتیک (به عنوان Q و R)
q1 = params(1);
q2 = params(2);
r = params(3);
% مدل سیستم
A = [0 1; -2 -3];
B = [0; 1];
C = [1 0];
D = 0;
% جلوگیری از مقادیر منفی
if q1 <= 0 || q2 <= 0 || r <= 0
cost = inf;
return
end
% محاسبه بهره LQR
Q = diag([q1 q2]);
R = r;
K = lqr(A,B,Q,R);
% سیستم حلقه بسته
sys_cl = ss(A-B*K,B,C,D);
% تابع هزینه: انتگرال مربعی خطا (ISE)
[y,t] = step(sys_cl);
e = 1 - y;
cost = trapz(t, e.^2);
end
🔹 Main Script — LQR_GA_Optimization.m
clc
clear all
close all
%% محدوده جستجو برای Q و R
lb = [0.1 0.1 0.1]; % حد پایین برای [q1 q2 r]
ub = [100 100 10]; % حد بالا
%% تنظیمات الگوریتم ژنتیک
opts = optimoptions('ga',...
'Display','iter',...
'PopulationSize',30,...
'MaxGenerations',40,...
'PlotFcn',@gaplotbestf); % نمایش روند بهبود هزینه
%% اجرای الگوریتم ژنتیک
best_params = ga(@LQR_cost,3,[],[],[],[],lb,ub,[],opts);
disp('Best parameters [q1 q2 r] = ');
disp(best_params);
%% بازسازی سیستم با پارامترهای بهینه
q1 = best_params(1);
q2 = best_params(2);
r = best_params(3);
A = [0 1; -2 -3];
B = [0; 1];
C = [1 0];
D = 0;
Q = diag([q1 q2]);
R = r;
K_opt = lqr(A,B,Q,R);
%% مقایسه پاسخ سیستم قبل و بعد از بهینهسازی
sys_open = ss(A,B,C,D); % سیستم بدون کنترل
sys_cl_opt = ss(A-B*K_opt,B,C,D); % سیستم کنترلشده با LQR بهینه
t = 0:0.01:10;
[y_open,t] = step(sys_open,t);
[y_opt,~] = step(sys_cl_opt,t);
%% رسم نتایج
figure('Name','LQR Optimization Result','NumberTitle','off');
plot(t, y_open, 'r--', 'LineWidth', 1.8); hold on
plot(t, y_opt, 'b-', 'LineWidth', 2);
grid on
xlabel('Time (seconds)');
ylabel('Output response y(t)');
title('Comparison of system response before and after LQR tuning using Genetic Algorithm');
legend('Open-loop system','Optimized LQR with GA','Location','southeast');
%% نمایش مقادیر نهایی روی نمودار
text(6, y_opt(end), sprintf('q1=%.2f, q2=%.2f, r=%.2f', q1, q2, r), ...
'FontSize', 11, 'BackgroundColor', 'w', 'EdgeColor', 'k');
%% محاسبه و نمایش هزینه نهایی
J_final = LQR_cost(best_params);
disp(['Final cost function J = ', num2str(J_final)]);
🧩 خروجی نهایی:
- در پنجرهی الگوریتم ژنتیک، منحنی gaplotbestf روند کاهش تابع هزینه رو نشون میده.
- در پایان، نمودار پاسخ زمانی نمایش داده میشه:
🔴 منحنی قرمز → سیستم بدون کنترل
🔵 منحنی آبی → سیستم با LQR بهینهسازیشده با GA -
مقادیر بهینهی Q و R روی نمودار چاپ میشوند.
الگوریتم ژنتیک با شبیهسازی تکامل طبیعی، بهصورت هوشمندانه پارامترهایی را پیدا میکند که باعث بهترین پایداری، سرعت پاسخ و کمترین انرژی مصرفی کنترل میشود.
- انتخاب دستی Q و R برای آموزش و پروژههای ساده مناسب است.
- اما در پروژههای صنعتی و پژوهشی، استفاده از AI برای تنظیم خودکار LQR باعث عملکرد بسیار بهتر و تطبیقپذیری بالا با سیستمهای غیرخطی میشود.
- ترکیب MATLAB با الگوریتمهای بهینهسازی هوشمند، ابزار قدرتمندی برای طراحی کنترلکنندههای هوشمند و خودتنظیم (Adaptive Intelligent Controllers) فراهم میکند.
🔹 ۷.۳ بهینهسازی LQR با الگوریتم ازدحام ذرات (PSO)
الگوریتم PSO یا Particle Swarm Optimization یکی از روشهای پرکاربرد هوش مصنوعی در بهینهسازی است که با الهام از رفتار گروهی پرندگان یا ماهیها توسعه یافته است.
در این روش، هر “ذره” موقعیت و سرعتی در فضای جستجو دارد و با توجه به بهترین تجربهی خود و گروه، به سمت پاسخ بهینه حرکت میکند.
هدف ما این است که پارامترهای ( Q ) و ( R ) را طوری انتخاب کنیم که عملکرد سیستم کنترل LQR بهینه شود.
💻 فایل اول: main_LQR_PSO.m
clc
clear all
close all
%% تعریف مسئله بهینهسازی
CostFunction = @(x) LQR_cost(x); % تابع هزینه (همان تابع قبلی)
nVar = 3; % تعداد متغیرها [q1 q2 r]
VarSize = [1 nVar]; % اندازه متغیرها
VarMin = [0.1 0.1 0.1]; % حد پایین جستجو
VarMax = [100 100 10]; % حد بالای جستجو
%% پارامترهای الگوریتم PSO
MaxIt = 50; % حداکثر تعداد تکرارها
nPop = 30; % اندازه جمعیت (تعداد ذرات)
w = 0.72; % ضریب لختی (Inertia Weight)
c1 = 1.5; % ضریب شتاب شخصی (Personal Coefficient)
c2 = 1.5; % ضریب شتاب اجتماعی (Social Coefficient)
%% مقداردهی اولیه جمعیت
empty_particle.Position = [];
empty_particle.Velocity = [];
empty_particle.Cost = [];
empty_particle.Best.Position = [];
empty_particle.Best.Cost = [];
particle = repmat(empty_particle, nPop, 1); % ایجاد ساختار ذرات
GlobalBest.Cost = inf; % بهترین جواب سراسری (مقدار اولیه)
for i = 1:nPop
particle(i).Position = unifrnd(VarMin, VarMax, VarSize); % موقعیت اولیه تصادفی
particle(i).Velocity = zeros(VarSize); % سرعت اولیه صفر
particle(i).Cost = CostFunction(particle(i).Position); % محاسبه هزینه اولیه
particle(i).Best.Position = particle(i).Position; % بهترین موقعیت شخصی
particle(i).Best.Cost = particle(i).Cost;
% بهروزرسانی بهترین جواب کلی
if particle(i).Best.Cost < GlobalBest.Cost
GlobalBest = particle(i).Best;
end
end
BestCost = zeros(MaxIt, 1); % ذخیره بهترین هزینه در هر تکرار
%% حلقه اصلی PSO
for it = 1:MaxIt
for i = 1:nPop
% --- بهروزرسانی سرعت ذرات ---
particle(i).Velocity = w*particle(i).Velocity ...
+ c1*rand(VarSize).*(particle(i).Best.Position - particle(i).Position) ...
+ c2*rand(VarSize).*(GlobalBest.Position - particle(i).Position);
% --- بهروزرسانی موقعیت ذرات ---
particle(i).Position = particle(i).Position + particle(i).Velocity;
% --- اعمال محدودیتها ---
particle(i).Position = max(particle(i).Position, VarMin);
particle(i).Position = min(particle(i).Position, VarMax);
% --- ارزیابی تابع هزینه ---
particle(i).Cost = CostFunction(particle(i).Position);
% --- بهروزرسانی بهترین موقعیت شخصی ---
if particle(i).Cost < particle(i).Best.Cost
particle(i).Best.Position = particle(i).Position;
particle(i).Best.Cost = particle(i).Cost;
% --- بهروزرسانی بهترین جواب کلی ---
if particle(i).Best.Cost < GlobalBest.Cost
GlobalBest = particle(i).Best;
end
end
end
% ذخیره بهترین مقدار هزینه در این تکرار
BestCost(it) = GlobalBest.Cost;
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
end
% نمایش بهترین پارامترهای پیدا شده
best_params = GlobalBest.Position;
disp('بهترین پارامترها [q1 q2 r] = ');
disp(best_params);
%% ارزیابی سیستم با پارامترهای بهینه
[q1, q2, r] = deal(best_params(1), best_params(2), best_params(3));
% تعریف مدل سیستم
A = [0 1; -2 -3];
B = [0; 1];
C = [1 0];
D = 0;
% طراحی کنترلکننده LQR
Q = [q1 0; 0 q2];
R = r;
K = lqr(A,B,Q,R);
% سیستم حلقه باز و بسته
sys_ol = ss(A,B,C,D);
sys_cl = ss(A-B*K,B,C,D);
% پاسخ پله سیستمها
t = 0:0.01:10;
[y_ol,t_ol] = step(sys_ol,t);
[y_cl,t_cl] = step(sys_cl,t);
% رسم نمودار پاسخها
figure;
plot(t_ol,y_ol,'r--','LineWidth',1.5); hold on;
plot(t_cl,y_cl,'b','LineWidth',2);
xlabel('زمان (ثانیه)');
ylabel('پاسخ سیستم');
title('مقایسه پاسخ سیستم قبل و بعد از بهینهسازی LQR با PSO');
legend('قبل از بهینهسازی','بعد از بهینهسازی');
grid on;
💡 فایل دوم: LQR_cost.m
(بدون تغییر نسبت به نسخه GA)
function J = LQR_cost(params)
% تابع هزینه برای کنترلکننده LQR
% هدف: کمینه کردن انتگرال مربعات خطا (ISE)
q1 = params(1);
q2 = params(2);
r = params(3);
% مدل سیستم
A = [0 1; -2 -3];
B = [0; 1];
C = [1 0];
D = 0;
% طراحی کنترلکننده
Q = diag([q1 q2]);
R = r;
try
K = lqr(A,B,Q,R);
catch
% اگر مقادیر باعث ناپایداری شوند، هزینه بزرگ بده
J = 1e6;
return
end
% سیستم حلقه بسته
sys_cl = ss(A-B*K,B,C,D);
% ورودی پله واحد
t = 0:0.01:5;
u = ones(size(t));
% شبیهسازی پاسخ سیستم
y = lsim(sys_cl,u,t);
% محاسبه خطا
e = 1 - y;
% تابع هزینه: انتگرال مربعات خطا
J = trapz(t,e.^2);
end
📈 نمودار خروچی پاسخ سیستم با و بدون کنترل LQR با الگوریتم PSO و تحلیل نتایج

🔹 در خروجی، دو منحنی مشاهده میشود:
- قرمز: پاسخ سیستم قبل از بهینهسازی (پارامترهای پیشفرض Q و R)
- آبی: پاسخ سیستم بعد از بهینهسازی با الگوریتم PSO
✅ پاسخ بهینهشده دارای:
- سرعت همگرایی بیشتر
- نوسانات کمتر
- خطای ماندگار ناچیز
- مصرف انرژی ورودی مناسبتر
در بهینهسازی کنترلکننده LQR:
- اگر سرعت و سادگی پیادهسازی مدنظر باشد، الگوریتم PSO گزینهی مناسبتری است.
- اگر دقت نهایی و پرهیز از مینیمم محلی اهمیت بیشتری دارد، الگوریتم GA عملکرد بهتری دارد.
در عمل، بسیاری از پژوهشگران از ترکیب GA و PSO (Hybrid GA-PSO) نیز استفاده میکنند تا از مزایای هر دو بهرهمند شوند.
🔹 ۸. مقایسه کنترلکننده LQR با کنترلکننده PID
کنترلکنندهها قلب هر سیستم دینامیکی هستند؛ از موتورهای الکتریکی گرفته تا فضاپیماها و پهپادها.
دو روش پرکاربرد در این حوزه عبارتاند از کنترلکننده PID (تناسبی–انتگرالی–مشتقی) و کنترلکننده بهینه LQR (Linear Quadratic Regulator).
هرکدام فلسفه طراحی، پیچیدگی و دامنه کاربرد متفاوتی دارند.
⚙️ ۱. مروری کوتاه بر هر روش
✅ کنترلکننده PID
PID قدیمیترین و پرکاربردترین روش کنترل در صنعت است. ساختار آن ساده است و خروجی کنترل بر اساس ترکیب سه جزء تعیین میشود:
که در آن ( e(t) ) خطای سیستم است.
🔸 ویژگیها:
- طراحی ساده و شهودی
- مناسب برای سیستمهای مرتبه پایین
- نیازمند تنظیم تجربی ضرایب (Tuning)
آموزش کنترل PID در متلب نیز یکی دیگر از آموزش های متلبی است.
✅ کنترلکننده LQR
LQR یک روش بهینهسازی ریاضی است که از مدل حالت-فضا استفاده میکند.
در این روش، با انتخاب ماتریسهای ( Q ) و ( R )، عملکرد سیستم طوری تنظیم میشود که تابع هزینه زیر حداقل گردد:
🔸 ویژگیها:
- مبتنی بر مدل ریاضی دقیق سیستم
- تضمینکننده پایداری و مینیمم انرژی کنترل
- قابل توسعه به سیستمهای چندورودی–چندخروجی (MIMO)
⚖️ ۲. مقایسه جامع LQR و PID
| ویژگی | کنترلکننده PID | کنترلکننده LQR |
|---|---|---|
| مبنای طراحی | تجربی، بر اساس پاسخ حلقه بسته | تحلیلی، بر اساس مدل حالت-فضا |
| پیچیدگی طراحی | ساده | پیچیدهتر |
| پایداری | تضمینشده نیست (بستگی به تنظیم ضرایب دارد) | ریاضیاتی تضمینشده ✅ |
| کاربرد در سیستمهای چندمتغیره (MIMO) | دشوار یا غیرممکن | بسیار مناسب ✅ |
| مقاومت در برابر اغتشاشات و نویز | خوب در صورت تنظیم دقیق | وابسته به مدل سیستم |
| تطبیقپذیری با سیستمهای غیرخطی | محدود | قابل ترکیب با Linearization یا Adaptive Control |
| تعداد پارامترهای تنظیمی | ۳ (Kp, Ki, Kd) | تعداد زیادتر (عناصر Q و R) |
| هزینه محاسباتی | کم ✅ | بیشتر |
| قابلیت پیادهسازی صنعتی | بالا ✅ | بیشتر در سیستمهای پژوهشی یا پیشرفته |
| عملکرد در حضور محدودیتها | قابل تنظیم با Anti-windup | نیازمند LQR محدود (CLQR) |
🔍 ۳. تحلیل عملکرد و نتیجهگیری
- LQR نسبت به PID از دید نظری برتر است چون طراحی آن بر پایه بهینهسازی ریاضی و پایداری لیاپانوف انجام میشود.
- PID همچنان در صنعت محبوبتر است زیرا پیادهسازی آن سریع، ارزان و بدون نیاز به مدل دقیق سیستم است.
- LQR برای سیستمهای چندورودی–چندخروجی، رباتها، پهپادها، خودروهای خودران و سیستمهای فضاپیما انتخاب بسیار بهتری است.
- در مقابل، PID در کنترل دما، فشار، سرعت موتور و فرآیندهای صنعتی همچنان حرف اول را میزند.
📘 ۴. خلاصه کاربردها
| نوع سیستم | کنترلکننده مناسب | دلیل انتخاب |
|---|---|---|
| سیستمهای ساده و صنعتی (دما، فشار، سطح مایع) | PID | سادگی و هزینه پایین ✅ |
| سیستمهای دقیق با مدل شناختهشده (پهپاد، ربات، هواپیما) | LQR | بهینه و پایدار ✅ |
| سیستمهای غیرخطی یا تطبیقی | LQR (با Linearization) یا PID تطبیقی | انعطافپذیری بالا |
| سیستمهای چندمتغیره و کوپله | LQR | توانایی کنترل همزمان چند حالت ✅ |
💬در یک جمله:
PID برای مهندسان عملگرا و LQR برای مهندسان تحلیلگراست.
اگر هدف، کنترل سریع و ساده باشد → PID انتخاب منطقی است.
اما اگر هدف، پاسخ بهینه، انرژی کم و تضمین پایداری باشد → LQR بهترین گزینه است.
🔹 ۹. نتیجهگیری و نکات نهایی
در این آموزش یاد گرفتیم که چگونه با استفاده از کنترلکنندهی بهینه LQR (Linear Quadratic Regulator) میتوان عملکرد سیستمهای دینامیکی را به شکل بهینه کنترل کرد.
از تعریف مدل حالت–فضا و تابع هزینه گرفته تا محاسبهی بهرهی بهینه ( K ) و پیادهسازی در MATLAB، همه مراحل بهصورت گامبهگام بررسی شد.
🧩 جمعبندی مفاهیم کلیدی
| مفهوم | توضیح خلاصه |
|---|---|
| کنترل بهینه (Optimal Control) | طراحی کنترلکننده برای کمینه کردن یک تابع هزینه شامل خطا و انرژی کنترل |
| LQR | یکی از روشهای اصلی کنترل مدرن برای سیستمهای خطی و زمانناوردا |
| ماتریسهای Q و R | نقش کلیدی در وزندهی بین دقت و انرژی کنترلکننده دارند |
| معادله ریکاتی | معادله کلیدی برای محاسبه بهرهی بهینه K |
| دستور lqr در MATLAB | ابزار آمادهی متلب برای طراحی سریع LQR |
| بهینهسازی با هوش مصنوعی (GA, PSO) | روشی برای تنظیم خودکار Q و R جهت دستیابی به عملکرد بهتر |
💡 نکات مهم برای پروژههای پژوهشی و صنعتی
- مدل دقیق سیستم بسیار مهم است.
عملکرد LQR کاملاً وابسته به صحت مدل حالت–فضا است. قبل از طراحی، سیستم را شناسایی (System Identification) کنید. - انتخاب Q و R را با هدف انجام دهید.
اگر پاسخ سریعتر میخواهید، Q را بزرگتر کنید. اگر مصرف انرژی یا سیگنال کنترل نرمتر میخواهید، R را افزایش دهید. - پایداری همیشه تضمینشده است.
تا زمانی که سیستم کنترلپذیر (Controllable) باشد، LQR پایداری را بهصورت ذاتی تضمین میکند. - در پروژههای صنعتی، ترکیب LQR با PID یا Kalman Filter رایج است.
این روش ترکیبی میتواند عملکرد واقعی سیستم را در حضور نویز و عدم قطعیت بهبود دهد. - در MATLAB از دستورهای آماده بهره بگیرید.
دستوراتlqr,place,care,dlqr, وlsqrdابزارهای قوی برای کنترل بهینه هستند.
🔗 لینکهای پیشنهادی برای یادگیری بیشتر
- 📘 مستند رسمی LQR در MATLAB (MathWorks)
- 🎥 ویدیو آموزشی: LQR Controller Design in MATLAB در YouTube
- 📄 شبیه سازی آماده مقالات با کنترل LQR که در فروشگاه متلبی وجود دارد
نمونه پروژه های آماده متلب که در آن کنترلر LQR استفاده شده است:
- کنترل مقاوم و تطبیقی + LQR برای دنبالهروی مسیر کشتی کمعملگر
- کنترل بهینه سیستم MIMO روتور دوقلو با استفاده از تکنیک LQR
- تنظیم کنترل فیدبک حالت برای سیستم سرکوب لکههای مایع با استفاده از رویکرد LQR-LMI
- کنترل بهینه سیستم چند ورودی چند خروجی پرنده دو روتور با روش LQR
- طراحی کنترلر بهینه LQR و LQG برای سیستم آونگ معکوس با متلب
- طراحی کنترل کننده LQR و LQG و فیلتر کالمن برای زیردریایی فونیکس
- طراحی کنترلر LQR , PID و LQR-PID برای کوادکوپتر
موارد بیشتر را در فروشگاه متلبی جستجو نمایید.
🏁 نتیجه نهایی
کنترل LQR ابزاری قدرتمند برای طراحی سیستمهای دقیق، پایدار و بهینه است.
اگر در مسیر یادگیری کنترل مدرن قدم گذاشتهاید، تسلط بر LQR نقطهی شروع فوقالعادهای برای درک کنترلهای پیشرفتهتر مانند LQG, MPC و Adaptive Control است.






دیدگاه خود را ثبت کنید
تمایل دارید در گفتگوها شرکت کنید؟در گفتگو ها شرکت کنید.