جایابی قطب — از صفر تا صد (+ دانلود فیلم آموزش گام به گام)

۳۹۱۳ بازدید
آخرین به‌روزرسانی: ۱۷ اردیبهشت ۱۴۰۲
زمان مطالعه: ۱۰۶ دقیقه
دانلود PDF مقاله
جایابی قطب — از صفر تا صد (+ دانلود فیلم آموزش گام به گام)

در آموزش‌های پیشین مجله فرادرس، با نمایش فضای حالت سیستم‌های کنترل و خطی‌سازی آن‌ها آشنا شدیم. همچنین، برخی از روش‌های تحلیل این سیستم‌ها از قبیل خطای حالت ماندگار، معیار پایداری راث-هرویتز و مکان هندسی ریشه‌ها را بیان کردیم. در این آموزش، با یکی از روش‌های طراحی کنترل کننده در فضای حالت به نام جایابی قطب آشنا می‌شویم. جایابی قطب، یکی از روش‌های کنترل است که در آن، قطب‌های سیستم حلقه‌ بسته در محل‌های مطلوب قرار داده می‌شوند. در ادامه، این روش را توضیح می‌دهیم.

997696
محتوای این مطلب جهت یادگیری بهتر و سریع‌تر آن، در انتهای متن به صورت ویدیویی نیز ارائه شده است.

به طور خلاصه می‌توان گفت که در جایابی قطب (Pole Placement) در فضای حالت، می‌خواهیم بهره فیدبک KK به گونه‌ای محاسبه کنیم که قطب‌های سیستم حلقه بسته در مکان‌های مطلوب قرار گیرند.

کنترل فیدبک حالت

جایابی قطب

سیستم فضای حالت زیر را در نظر بگیرید:

مدل فضای حالت یک سیستم با ورودی <span class=uu و خروجی yy" width="435" height="127">
شکل ۱: مدل فضای حالت یک سیستم با ورودی uu و خروجی yy

که در آن، ماتریس DD را برابر با صفر در نظر گرفته‌ایم. فرض می‌کنیم سیستم مورد نظر کاملاً کنترل پذیر است. سیستم را کنترل پذیر (Controllable) می‌گوییم اگر همیشه یک ورودی کنترل uu وجود داشته باشد که با آن بتوان حالت‌های سیستم را در زمان محدود به وضعیت جدید دیگری انتقال داد.

به طور خاص، یک سیستم LTI کنترل پذیر است اگر و فقط اگر رتبه (Rank) ماتریس کنترل پذیری C\mathcal{C} کامل باشد (یعنی اگر تعداد حالت‌های سیستم را nn فرض کنیم، رتبه ماتریس C\mathcal{C} باید برابر با nn باشد). ماتریس کنترل پذیری (Controllability Matrix) برای سیستمی با ماتریس حالت AA و ماتریس ورودی BB به صورت زیر تعریف می‌شود:

C=[ B      AB      A2B            An1B] \large \mathcal {C} = [  B \;\;\; AB \;\;\; A^2B \;\;\; \cdots \;\;\; A^ {n-1}B]

رتبه یک ماتریس با تعداد سطرها یا ستون‌هایی از ماتریس که از یکدیگر استقلال خطی دارند متناظر است.

به بحث جایابی قطب بر می‌گردیم. تابع تبدیل G(s) G (s) متناظر با شکل ۱ به صورت زیر است:

G(s)=C(sIA)1B. \large G ( s ) = C ( s I - A ) ^ { - 1 } B .

قطب‌های حلقه‌ باز سیستم، مقادیر ویژه ماتریس A A هستند:

det(sIA)=0. \large \det ( s I - A ) = 0 .

در حالت کلی، برای جایابی قطب‌های سیستم، یک کنترل‌ کننده به آن اضافه می‌کنیم و می‌توانیم آن را به صورت‌های مختلف نشان دهیم. برای مثال، در فضای تابع تبدیل، نمایش بلوکی سیستم کنترل فیدبک واحد منفی با سیستم تحت کنترل G(s)G(s) و کنترل کننده KD(s)KD(s) مطابق شکل زیر است.

جایابی قطب با کنترل‌کننده <span class=KD(s) K D ( s ) " width="484" height="127">
شکل ۲: جایابی قطب با کنترل‌کننده KD(s) K D ( s )

در ادامه، روش جایابی قطب را با فیدبک حالت ارائه می‌کنیم.

جایابی قطب در فضای حالت

سیستم تک‌ورودی شکل ۱ را با خروجی  y=1x y = 1 x ‌ در نظر می‌گیریم (فرض می‌کنیم C=1C=1 است):

x˙=Ax+Bu,xRn, uR,y=x. \large \begin {align*} \dot { x } & = A x + B u , \, x \in \mathscr { R } ^ n , \, \, \text{ }\, u \in \mathscr { R } , \\ y & = x . \end{align*}

قانون کنترل فیدبک را به صورت زیر معرفی می‌کنیم:

u=Ky=Kx=(k1k2kn)(x1x2xn)=(k1x1++knxn). \large \begin {align*} u & = - K y \\ & = - K x \\ & = - \left ( \begin {matrix} k _ 1 & k _ 2 & \cdots & k _ n \end {matrix} \right ) \left ( \begin {matrix} x _ 1 \\ x _ 2 \\ \vdots \\ x _ n \end {matrix} \right) \\ & = - ( k _ 1 x _ 1 + \cdots + k _ n x _ n ) . \end{align*}

با اعمال فیدبک، سیستم حلقه‌ بسته به صورت زیر در خواهد آمد:

x˙=AxBKx=(ABK)xy=x. \large \begin {align*} \dot { x } & = A x - B K x \\ & = ( A - B K ) x \\ y & = x . \end {align*}

همان‌طور که می‌بینیم، با افزودن فیدبک، ماتریس AA به ABKA-BK تبدیل شده است. اکنون مطابق شکل ۳، سیستم حلقه‌ باز را با فیدبک KK و مرجع rr کامل می‌کنیم. در نتیجه، تابع تبدیل حلقه‌ بسته YR(s) \frac { Y } { R } ( s ) به صورت زیر قابل محاسبه است:

x˙=Ax+B(rKx)=(ABK)x+Br,y=x.        (1) \large \begin {align*} \dot { x } & = A x + B ( r - K x ) \\ & = ( A - B K ) x + B r , \\ y & = x . \end{align*} \;\;\;\; (1)

فیدبک حالت <span class=KK سیستم (A,B,I,0) (A, B, I, 0) را با مرجع rr می‌بندد. " width="409" height="202">
شکل ۳: فیدبک حالت KK سیستم (A,B,I,0) (A, B, I, 0) را با مرجع rr کامل می‌کند.

با اعمال تبدیل لاپلاس به رابطه (1)، داریم:

sX(s)=(ABK)X(s)+BR(s),Y(s)=X(s).    Y(s)=(sIA+BK)1BGR(s). \large \begin {align*} s X ( s ) & = ( A - B K ) X ( s ) + B R ( s ) , \\ Y ( s ) & = X ( s ) . \\ \implies Y ( s ) & = \underbrace { ( s I -A + B K ) ^ { - 1 } B } _ { G } R ( s ) . \end {align*}

قطب‌های حلقه‌ بسته، همان مقادیر ویژه ماتریس  ABK A-BK هستند. در نتیجه، با یافتن فیدبک KK مناسب می‌توان قطب‌های سیستم حلقه بسته را به سادگی جایابی کرد.

جایابی قطب در فرم کانونی کنترل پذیر

اکنون فرض کنید مدل  (A,B,C,D) (A,B,C,D) سیستم را به فرم کانونی کنترل پذیر در اختیار داریم. فرم‌های کانونی، فرم‌های استانداردی از نمایش سیستم در فضای حالت هستند که محاسبات را ساده‌تر می‌کنند و با استفاده از تبدیلات خاصی می‌توان سیستم را در قالب این فرم‌ها بیان کرد. فرم کانونی کنترل پذیر به صورت زیر است:

A=(010000010000001anan1an2a2a1),B=(0001). \large \begin {align*} A & = \left ( \begin {matrix} 0 & 1 & 0 & \ldots & 0 & 0 \\ 0 & 0 & 1 & \ldots & 0 & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & \ldots & 0 & 1 \\ - a _ n & - a _ { n - 1 } & - a _ { n - 2 } & \ldots & - { a _ 2 } & - { a _ 1 } \end {matrix} \right) , \, B = \left ( \begin {matrix} 0 \\ 0 \\ \vdots \\ 0 \\ 1 \end {matrix} \right) . \end{align*}

با تعریف AA مطابق رابطه اخیر، داریم:

det(sIA)=sn+a1sn1++an1s+an. \large \det ( s I -A ) = s ^ n + a _ 1 s ^ { n - 1 } + \cdots + a _ { n - 1 } s + a _ n .

از جبر خطی می‌دانیم که درایه‌های آخرین سطر ماتریس AA که به فرم کانونی بالا نوشته شده است، قرینه ضرایب معادله مشخصه را نشان می‌دهند. مجدداً سیستم را به فرم کانونی در نظر بگیرید:

x˙=Ax+BuA=(010000010000001anan1an2a2a1),B=(0001) \large \begin {align*} \dot { x } & = A x + B u \\ A & = \left ( \begin {matrix} 0 & 1 & 0 & \ldots & 0 & 0 \\ 0 & 0 & 1 & \ldots & 0 & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & \ldots & 0 & 1 \\ - a _ n & - a _{ n - 1 } & - a _ { n - 2 } & \ldots & - { a _ 2 } & - { a _ 1 } \end {matrix} \right ) , \, B = \left ( \begin {matrix} 0 \\ 0 \\ \vdots \\ 0 \\ 1 \end {matrix} \right ) \end {align*}

سیستم فوق را به صورت معادلات دیفرانسیل می‌نویسیم و از آن‌ها تبدیل لاپلاس می‌گیریم:

x˙1=x2X2=sX1x˙2=x3X3=sX2=s2X1x˙n1=xnXn=sXn1==sn1X1x˙n=i=1nani+1xi+u,sXn=(an+an1s++a1sn1)X1+U. \large \begin {align*} \begin {array} { l } & \dot { x } _ 1 = x _ 2 & X _ 2 = s X _ 1 \\ & \dot { x } _ 2 = x _ 3 & X _ 3 = s X _ 2 = s ^ 2 X _ 1 \\ & \hspace {8mm} \vdots & \hspace {9mm} \vdots \\ & \dot { x } _ { n - 1 } = x _ n & X _ n = s X _ { n - 1 } = \ldots = s ^ { n - 1 } X _ 1 \\ & \dot { x } _ n = - \sum ^ n _ { i = 1 } a _ { n - i + 1 } x _ i + u , & s X _ n = - ( a _ n + a _ { n - 1 } s + \cdots + a _ 1 s ^ { n - 1 } ) X _ 1 + U . \end{array} \end{align*}

نتیجه خط آخر به صورت زیر است:

(sn+a1sn1++an)P(s)X1=U. \large \underbrace { \left ( s ^ n + a _ 1 s ^ { n - 1 } + \cdots + a _ n \right ) } _ { \text {P(s)} } X _ 1 = U .

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

با استفاده از آنچه که گفته شد، می‌توانیم قطب‌های حلقه‌ بسته را با فیدبک حالت جایابی کنیم. با اعمال فیدبک KK به سیستم در فرم کانونی، ماتریس ABKA-BK به صورت زیر محاسبه می‌شود:

A=(010000010000001anan1an2a2a1)BK=(0001)(k1k2kn)=(000000000000000k1k2k3kn1kn)    ABK=(010000010000001(an+k1)(an1+k2)(an2+k3)(a2+kn1)(a1+kn)) \large \begin {align*} A &= \left( \begin {matrix} 0 & 1 & 0 & \ldots & 0 & 0 \\ 0 & 0 & 1 & \ldots & 0 & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & \ldots & 0 & 1 \\ -a_n & -a_{n-1} & -a_{n-2} & \ldots & -{a_2} & -{a_1} \end {matrix} \right) \\ BK &= \left( \begin{matrix} 0 \\ 0 \\ \vdots \\ 0 \\ 1 \end{matrix}\right) \left(\begin{matrix} k_1 & k_2 & \ldots & k_n \end{matrix}\right) \\ &= \left( \begin{matrix} 0 & 0 & 0 & \ldots & 0 & 0 \\ 0 & 0 & 0 & \ldots & 0 & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & \ldots & 0 & 0 \\ k_1 & k_2 & k_3 & \ldots & k_{n-1} & k_n \end{matrix} \right) \\ \implies A-BK &= \left( \begin{matrix} 0 & 1 & 0 & \ldots & 0 & 0 \\ 0 & 0 & 1 & \ldots & 0 & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & \ldots & 0 & 1 \\ -(a_n+k_1) & -(a_{n-1}+k_2) & -(a_{n-2}+k_3) & \ldots & -({a_2}+k_{n-1}) & -(a_1+k_n) \end{matrix} \right) \end{align*}

همان‌طور که می‌بینیم، ABK A - B K نیز یک فضای حالت به فرم کانونی است. در واقع، اکنون که ماتریس حالت سیستم حلقه بسته ABK A - B K است، می‌توانیم با استفاده از  det(sI(ABK))=0 \det \big(sI - (A-BK) \big)= 0 مقادیر ویژه سیستم حلقه بسته را محاسبه کنیم و با انتخاب KK مناسب، آن‌ها را در مکان مطلوب جای دهیم. معادله مشخصه سیستم حلقه بسته برابر است با:

det(sI(ABK))=sn+(a1+kn)sn1++(an1+k2)s+(an+k1). \large \begin {align*} & \det\big ( s I - ( A - B K )\big) = s ^ n + ( a _ 1 + k _ { n } ) s ^ { n - 1 } + \ldots + ( a _ { n - 1 } + k _ 2 ) s + ( a _ n + k _ 1 ) . \end {align*}

مثال زیر، فرایند استفاده از فیدبک حالت برای جایابی قطب را به خوبی نشان می‌دهد.

مثال

سیستم زیر را در نظر بگیرید:

x˙=Ax+Bu, A=(158157),B=(11). \large \begin {align*} \dot { x } & = A x + B u , \text{ }\\ A & = \left ( \begin {matrix} - 1 5 & 8 \\ - 1 5 & 7 \end {matrix} \right) , \, B = \left ( \begin {matrix} 1 \\ 1 \end {matrix} \right) . \end {align*}

فیدبک حالتی را پیدا کنید که قطب‌های حلقه‌ بسته را در  10±j -10\pm j قرار دهد.

حل: ابتدا کنترل‌ پذیری سیستم را بررسی می‌کنیم. ماتریس کنترل پذیری سیستم برابر است با:

C=[1718] \mathcal {C} = \begin{bmatrix} 1 & -7 \\ 1 & -8 \end{bmatrix}

رتبه ماتریس بالا کامل است و در نتیجه، سیستم کنترل پذیر است.

در گام بعدی، برای سادگی در محاسبات، می‌توانیم سیستم را به فرم کانونی کنترل پذیر تبدیل کنیم. بنابراین، از ماتریس تبدیل TT استفاده می‌کنیم (در این‌جا محاسبات مربوط به ماتریس تبدیل TT آورده نشده است. برای آشنایی با نحوه محاسبه این ماتریس، آموزش نمایش فرم‌های کانونی را مطالعه کنید). با اعمال این تبدیل، ماتریس‌های AA و BB در فرم کانونی به دست می‌آیند:

T=(1101)    Aˉ=TAT1=(01158),Bˉ=TB=(01). \large \begin {align*} T & = \left ( \begin {matrix} 1 & -1 \\ 0 & 1 \end {matrix} \right ) \\ \implies \bar { A } & = T A T ^ { - 1 } \\ & = \left ( \begin {matrix} 0 & 1 \\ - 1 5 & - 8 \end {matrix} \right) , \\ \bar { B } & = T B \\ & = \left ( \begin {matrix} 0 \\ 1 \end {matrix} \right ) . \end {align*}

اکنون سیستم (Aˉ,Bˉ)(\bar{A}, \bar{B}) را در اختیار داریم که نمایش کانونی کنترل پذیر است. حال می‌توانیم با اعمال فیدبک  u=Kˉxˉ u = -\bar{K}\bar{x} قطب‌های سیستم را در  10±j -10 \pm j قرار دهیم. با توجه به قطب‌ها، معادله مشخصه مطلوب برابر است با:

(s+10+j)(s+10j)=(s+10)2+1=s2+20s+101. \large \begin {align*} ( s + 1 0 + j ) ( s + 1 0 - j ) & = ( s + 1 0 ) ^ 2 + 1 \\ & = s ^ 2 + 2 0 s + 1 0 1 . \end{align*}

بنابراین، ماتریس سیستم حلقه‌ بسته باید به صورت زیر باشد:

AˉBˉKˉ=(0110120). \large \begin {align*} \bar { A } - \bar { B } \bar { K } = \left ( \begin {matrix} 0 & 1 \\ - 1 0 1 & - 2 0 \end {matrix} \right ) . \end {align*}

از طرف دیگر، می‌دانیم:

AˉBˉKˉ=(01(15+kˉ1)(8+kˉ2)). \large \begin {align*} \bar { A } - \bar { B } \bar { K } & = \left ( \begin {matrix} 0 & 1 \\ - ( 1 5 + \bar { k } _1 ) & - ( 8 + \bar { k } _ 2 ) \end {matrix} \right ) . \end{align*}

با برابر قرار دادن درایه‌های ماتریس‌ها، مقادیر  kˉ1=86 \bar{k}_1 = 86 و  kˉ2=12 \bar{k}_2 = 12 به دست می‌آید. با توجه به این مقادیر، می‌توان قانون کنترل را به صورت زیر نوشت:

u=Kˉxˉ=KˉTKx. \large \begin {align*} u & = -\bar { K } \bar { x } \\ & = - \underbrace { \bar { K } T } _ { K } x . \end {align*}

تا اینجا، قانون کنترل Kˉ\bar{K} را برای فرم کانونی سیستم به دست آورده‌ایم. تنها کاری که باقی می‌ماند، این است که با استفاده از تبدیل TT، فیدبک KK را برای نمایش فضای حالت اصلی محاسبه کنیم:

K=KˉT=(8612)(1101)=(8674). \large \begin {align*} K & = \bar { K } T \\ & = \left ( \begin {matrix} 8 6 & 1 2 \end {matrix} \right ) \left ( \begin {matrix} 1 & -1 \\ 0 & 1 \end {matrix} \right ) \\ & = \left ( \begin {matrix} 8 6 & - 7 4 \end {matrix} \right ) . \end {align*}

در نهایت، قانون کنترل فیدبک حالت مطلوب، برابر است با:

u=(8674)(x1x2). \large \begin {align*} u = \left ( \begin {matrix} - 8 6 & 7 4 \end {matrix} \right ) \left ( \begin {matrix} x _ 1 \\ x _ 2 \end {matrix} \right ) . \end {align*}

جایابی قطب در متلب

فرض کنید سیستمی با فرم کانونی کنترل پذیر زیر در اختیار داریم:

A=(010001156),B=(001). \large \begin{align*} A &= \left( \begin{matrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ -1 & -5 & -6 \end{matrix} \right), \, B = \left( \begin{matrix} 0 \\ 0 \\ 1 \end{matrix}\right). \end{align*}

می‌خواهیم قطب‌های حلقه بسته را در مکان‌های 2+4i-2+4i، 24i-2-4i و 10-10 قرار دهیم. برنامه متلب مربوط به محاسبات فیدبک حالت به صورت زیر است:

1%--------------------------------------------------------------------------
2% State Feedback Controller Design Using Pole Placement
3% Technique
4% By Siddharth Kaul
5%--------------------------------------------------------------------------
6%
7% x. = Ax + Bu
8% y = Cx + Du
9%
10% Given -------------------------------------------------------------------
11MatrixA = [0 1 0;0 0 1;-1 -5 -6];
12MatrixB = [0; 0; 1];
13MatrixC = [1 0 0];
14MatrixD = [0];
15initialX = [1;0;0];
16% Desired Poles are -------------------------------------------------------
17desiredPoles = [-2+4i -2-4i -10];
18% Feedback controller K becomes -------------------------------------------
19% Note:- Using Ackerman Formula instead of Place to remove mismatching
20% -------------------------------------------------------------------------
21GainK = acker(MatrixA,MatrixB,desiredPoles);
22disp('Feedback Gain Matrix: ');
23disp(GainK);
24% -------------------------------------------------------------------------
25% Using this GainK in formula sI - (A- BK) we will get a new MatrixA. Using
26% this new MatrixA finding our new System with this feedback controller
27% gain.
28% -------------------------------------------------------------------------
29newMatrixA = MatrixA - (MatrixB*GainK);
30newMatrixB = eye(3);
31newMatrixC = eye(3);
32newMatrixD = eye(3);
33mysys = ss(newMatrixA,newMatrixB,newMatrixC,newMatrixD);
34% Now Initial REsponse with the GainK -------------------------------------
35timeT = 0:.1:10;
36x = initial(mysys,initialX,timeT);
37x1 = [1 0 0]*x';
38x2 = [0 1 0]*x';
39x3 = [0 0 1]*x';
40% Plotting the response ---------------------------------------------------
41plot(timeT,x1,'r',timeT,x2,'b',timeT,x3,'g');
42title('Response to initial Condition of State Variables');
43xlabel('Time -->');
44ylabel('Magnitude -->');
45% -------------------------------------------------------------------------
46% End of Program. Created By Siddharth Kaul
47% -------------------------------------------------------------------------
48

خروجی این برنامه، برابر است با:

Feedback Gain Matrix: 
199 55 8

همان‌طور که شکل زیر نشان می‌دهد، با اعمال فیدبک به سیستم، حالت‌ها پایدار شده‌اند.

حالت‌های سیستم

علاوه بر این، می‌توانیم از دستو place متلب نیز به صورت زیر استفاده کنیم:

1K = place(A,B,[p1 p2 p3])

ورودی‌‌های تابع place، ماتریس‌های AA و BB نمایش فضای حالت سیستم و p1p_1، p2p_2 و p3 p_3 محل قطب‌های مطلوب است. خروجی این تابع، فیدبک حالت KK است.

اما در متلب، دستوری به نام ctrb نیز وجود دارد که با استفاده از آن می‌توان کنترل پذیری سیستم را بررسی کرد. برای مثال، برنامه زیر را در نظر بگیرید:

1A = [1  1;
2     4 -2];
3B = [1 -1;
4     1 -1];
5Co = ctrb(A,B);
6unco = length(A) - rank(Co)

برنامه بالا، ماتریس کنترل پذیری Co را محاسبه کرده و رتبه آن را با کمک دستور rank از طول ماتریس A کم می‌کند. اگر حاصل unco برابر با صفر باشد، یعنی رتبه کامل است و سیستم کنترل پذیر است. با توجه به خروجی برنامه بالا، در این مثال اخیر، سیستم کنترل پذیر نیست:

unco = 1

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

فیلم‌ های آموزش جایابی قطب — از صفر تا صد (+ دانلود فیلم آموزش گام به گام)

فیلم آموزشی جایابی قطب

دانلود ویدیو

فیلم آموزشی حل مثال از جایابی قطب

دانلود ویدیو

فیلم آموزشی جایابی قطب با فرمول آکرمن

دانلود ویدیو

فیلم آموزشی حل مثال از جایابی قطب با فرمول آکرمن

دانلود ویدیو

فیلم آموزشی جایابی قطب در فرم کانونی کنترل‌پذیر

دانلود ویدیو

فیلم آموزشی تبدیل به فرم کانونی کنترل‌پذیر

دانلود ویدیو

فیلم آموزشی جایابی قطب در متلب

دانلود ویدیو
بر اساس رای ۳ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Control Systemsمجله فرادرس
۳ دیدگاه برای «جایابی قطب — از صفر تا صد (+ دانلود فیلم آموزش گام به گام)»

سلام
خیلی ممنون بابت سایت فوق العادتون.
امکانش هست فایل پی دی اف درسهایی که تو مجله فرادرس گذاشته میشه رو بذارین که خود فایل ها رو داشته باشیم که بعدا بخواین مطالعه کنیم؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *