كتاب برنامه‌نويسي پيشرفته MATLAB با GUI و C/C++

جهت آشنايي با برنامه نويسي مهندسي و همچنين توانمندي‌هاي مطلب در حوزه‌ي شبكه عصبي مي‌توانيد از كتاب برنامه‌نويسي پيشرفته MATLAB با GUI و C/C++ استفاده كنيد:

کنترل زاویه پاندول معکوس به روش فازی در MATLAB

کنترل زاویه پاندول معکوس به روش فازی در مطلب با قطعه کد زیر قابل پیاده سازی است:

clear
clc
a=newfis('pendulum');
a.input(1).name='tetha';
a.input(1).range=[-0.1 0.1];
a.input(1).mf(1).name='NB';
a.input(1).mf(1).type='trapmf';
a.input(1).mf(1).params=[-1 -1 -0.1 0];
a.input(1).mf(2).name='Z';
a.input(1).mf(2).type='trapmf';
a.input(1).mf(2).params=[-0.1 0 0 0.1];
a.input(1).mf(3).name='PB';
a.input(1).mf(3).type='trapmf';
a.input(1).mf(3).params=[0 0.1 1 1];
%--------------------------------------------tdot
a.input(2).name='tdot';
a.input(2).range=[-0.5 0.5];
a.input(2).mf(1).name='NB';
a.input(2).mf(1).type='trapmf';
a.input(2).mf(1).params=[-5 -5 -0.5 0];
a.input(2).mf(2).name='Z';
a.input(2).mf(2).type='trapmf';
a.input(2).mf(2).params=[-0.5 0 0 0.5];
a.input(2).mf(3).name='PB';
a.input(2).mf(3).type='trapmf';
a.input(2).mf(3).params=[0 0.5 5 5];
%--------------------------------------------x
a.input(3).name='x';
a.input(3).range=[-1 1];
a.input(3).mf(1).name='NB';
a.input(3).mf(1).type='trapmf';
a.input(3).mf(1).params=[-10 -10 -1 0];
a.input(3).mf(2).name='Z';
a.input(3).mf(2).type='trapmf';
a.input(3).mf(2).params=[-1 0 0 1];
a.input(3).mf(3).name='PB';
a.input(3).mf(3).type='trapmf';
a.input(3).mf(3).params=[0 1 10 10];
%--------------------------------------------xdot
a.input(4).name='xdot';
a.input(4).range=[-1 1];
a.input(4).mf(1).name='NB';
a.input(4).mf(1).type='trapmf';
a.input(4).mf(1).params=[-10 -10 -1 0];
a.input(4).mf(2).name='Z';
a.input(4).mf(2).type='trapmf';
a.input(4).mf(2).params=[-1 0 0 1];
a.input(4).mf(3).name='PB';
a.input(4).mf(3).type='trapmf';
a.input(4).mf(3).params=[0 1 10 10];
%--------------------------------------------f
a.output(1).name='f';
a.output(1).range=[-100 100];
a.output(1).mf(1).name='NB';
a.output(1).mf(1).type='trapmf';
a.output(1).mf(1).params=[-1000 -1000 -100 0];
a.output(1).mf(2).name='Z';
a.output(1).mf(2).type='trapmf';
a.output(1).mf(2).params=[-100 0 0 100];
a.output(1).mf(3).name='PB';
a.output(1).mf(3).type='trapmf';
a.output(1).mf(3).params=[0 100 1000 1000];
%--------------------------------------------rule1
a.rule(1).antecedent=[3 3 0 0];
a.rule(1).consequent=[3];
a.rule(1).weight=1;
a.rule(1).connection=1;
%--------------------------------------------rule2
a.rule(2).antecedent=[3 2 0 0];
a.rule(2).consequent=[3];
a.rule(2).weight=1;
a.rule(2).connection=1;
%--------------------------------------------rule3
a.rule(3).antecedent=[3 1 0 0];
a.rule(3).consequent=[2];
a.rule(3).weight=1;
a.rule(3).connection=1;
%--------------------------------------------rule4
a.rule(4).antecedent=[2 3 0 0];
a.rule(4).consequent=[3];
a.rule(4).weight=1;
a.rule(4).connection=1;
%--------------------------------------------rule5
a.rule(5).antecedent=[2 2 0 0];
a.rule(5).consequent=[2];
a.rule(5).weight=1;
a.rule(5).connection=1;
%--------------------------------------------rule6
a.rule(6).antecedent=[2 1 0 0];
a.rule(6).consequent=[1];
a.rule(6).weight=1;
a.rule(6).connection=1;
%--------------------------------------------rule7
a.rule(7).antecedent=[1 3 0 0];
a.rule(7).consequent=[2];
a.rule(7).weight=1;
a.rule(7).connection=1;
%--------------------------------------------rule8
a.rule(8).antecedent=[1 2 0 0];
a.rule(8).consequent=[1];
a.rule(8).weight=1;
a.rule(8).connection=1;
%--------------------------------------------rule9
a.rule(9).antecedent=[1 1 0 0];
a.rule(9).consequent=[1];
a.rule(9).weight=1;
a.rule(9).connection=1;
%--------------------------------------------rule10
a.rule(10).antecedent=[0 3 0 0];
a.rule(10).consequent=[3];
a.rule(10).weight=1;
a.rule(10).connection=1;
%--------------------------------------------rule11
a.rule(11).antecedent=[0 1 0 0];
a.rule(11).consequent=[1];
a.rule(11).weight=1;
a.rule(11).connection=1;

شناسایی سیستم با شبکه عصبی

جهت شناسایی سیستم با شبکه عصبی فایل راهنمای زیر با نرم افزار مطلب بسیار فوق العاده است

http://www.google.com/url?sa=t&rct=j&q=neural%20networks%3A%20basics%20using%20matlab%20neural%20network%20toolbox%20heikki&source=web&cd=1&cad=rja&sqi=2&ved=0CCwQFjAA&url=http%3A%2F%2Fpis.unicauca.edu.co%2Fmoodle-2.1.2%2Fpluginfile.php%2F30258%2Fmod_folder%2Fcontent%2F1%2Fclase_29%2FAS-74_3115_neural_networks_-_basics.pdf%3Fforcedownload%3D1&ei=EK7EUPqCFYuY0QW33IC4Cw&usg=AFQjCNH4q_ii-VPlRuMZsEX5739ZYb_yuw

كنترل با شبكه عصبي (پس انتشار)

روش پس انتشار براي كنترل یک سیستم دارای PID  بر مبنای مقاله ی :

Adaptive PID Control With Bp Neural Network Self-Tuning in Exhaust Temperature of Micro Gas Turbine

این مقاله در استخراج معادلات و روابط بسیار ساده و روان و بسیار کاربردی است:

%BP based PID Control
clear all;
close all;

xite=0.25;
alfa=0.05;

S=1; %Signal type

IN=4;H=5;Out=3;  %NN Structure
if S==1  %Step Signal
wi=[-0.6394   -0.2696   -0.3756   -0.7023;
    -0.8603   -0.2013   -0.5024   -0.2596;
    -1.0749    0.5543   -1.6820   -0.5437;
    -0.3625   -0.0724   -0.6463   -0.2859;
     0.1425    0.0279   -0.5406   -0.7660];
%wi=0.50*rands(H,IN);
wi_1=wi;wi_2=wi;wi_3=wi;
wo=[0.7576 0.2616 0.5820 -0.1416 -0.1325;
   -0.1146 0.2949 0.8352  0.2205  0.4508;
    0.7201 0.4566 0.7672  0.4962  0.3632];
%wo=0.50*rands(Out,H);
wo_1=wo;wo_2=wo;wo_3=wo;
end

if S==2  %Sine Signal
wi=[-0.2846    0.2193   -0.5097   -1.0668;
    -0.7484   -0.1210   -0.4708    0.0988;
    -0.7176    0.8297   -1.6000    0.2049;
    -0.0858    0.1925   -0.6346    0.0347;
     0.4358    0.2369   -0.4564   -0.1324];
%wi=0.50*rands(H,IN);
wi_1=wi;wi_2=wi;wi_3=wi;
wo=[1.0438    0.5478    0.8682    0.1446    0.1537;
    0.1716    0.5811    1.1214    0.5067    0.7370;
    1.0063    0.7428    1.0534    0.7824    0.6494];
%wo=0.50*rands(Out,H);
wo_1=wo;wo_2=wo;wo_3=wo;
end

x=[0,0,0];
u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;
y_1=0;y_2=0;y_3=0;

Oh=zeros(H,1);    %Output from NN middle layer
I=Oh;             %Input to NN middle layer
error_2=0;
error_1=0;

ts=0.001;
for k=1:1:6000
time(k)=k*ts;

if S==1
   rin(k)=1.0;
elseif S==2
   rin(k)=sin(1*2*pi*k*ts);
end

%Unlinear model
a(k)=1.2*(1-0.8*exp(-0.1*k));
yout(k)=a(k)*y_1/(1+y_1^2)+u_1;

error(k)=rin(k)-yout(k);

xi=[rin(k),yout(k),error(k),1];

x(1)=error(k)-error_1;
x(2)=error(k);
x(3)=error(k)-2*error_1+error_2;

epid=[x(1);x(2);x(3)];
I=xi*wi';
for j=1:1:H
    Oh(j)=(exp(I(j))-exp(-I(j)))/(exp(I(j))+exp(-I(j))); %Middle Layer
end
K=wo*Oh;             %Output Layer
for l=1:1:Out
    K(l)=exp(K(l))/(exp(K(l))+exp(-K(l)));        %Getting kp,ki,kd
end
kp(k)=K(1);ki(k)=K(2);kd(k)=K(3);
Kpid=[kp(k),ki(k),kd(k)];

du(k)=Kpid*epid;
u(k)=u_1+du(k);
if u(k)>=10       % Restricting the output of controller
   u(k)=10;
end
if u(k)<=-10
   u(k)=-10;
end

dyu(k)=sign((yout(k)-y_1)/(u(k)-u_1+0.0000001));

%Output layer
for j=1:1:Out
    dK(j)=2/(exp(K(j))+exp(-K(j)))^2;
end
for l=1:1:Out
    delta3(l)=error(k)*dyu(k)*epid(l)*dK(l);
end

for l=1:1:Out
   for i=1:1:H
       d_wo=xite*delta3(l)*Oh(i)+alfa*(wo_1-wo_2);
   end
end
    wo=wo_1+d_wo+alfa*(wo_1-wo_2);
%Hidden layer
for i=1:1:H
    dO(i)=4/(exp(I(i))+exp(-I(i)))^2;
end
    segma=delta3*wo;
for i=1:1:H
   delta2(i)=dO(i)*segma(i);
end

d_wi=xite*delta2'*xi;
wi=wi_1+d_wi+alfa*(wi_1-wi_2);

%Parameters Update
u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k);   
y_2=y_1;y_1=yout(k);
   
wo_3=wo_2;
wo_2=wo_1;
wo_1=wo;
   
wi_3=wi_2;
wi_2=wi_1;
wi_1=wi;

error_2=error_1;
error_1=error(k);
end
figure(1);
plot(time,rin,'r',time,yout,'b');
xlabel('time(s)');ylabel('rin,yout');
figure(2);
plot(time,error,'r');
xlabel('time(s)');ylabel('error');
figure(3);
plot(time,u,'r');
xlabel('time(s)');ylabel('u');
figure(4);
subplot(311);
plot(time,kp,'r');
xlabel('time(s)');ylabel('kp');
subplot(312);
plot(time,ki,'g');
xlabel('time(s)');ylabel('ki');
subplot(313);
plot(time,kd,'b');
xlabel('time(s)');ylabel('kd'); ...

پروژه کنترلی با شبکه عصبی

جهت دانلود پروژه کنترلی جالب با شبکه عصبی فایل زیر را دانلود کنید:

www.iau.dtu.dk/nnbook/Files/course5.doc

کدهای این پروژه را نیز از سایت زیر دانلود نمائید

http://www.codeforge.com/read/177616/siggener.m__html

کلاس شبکه عصبی، فازی و ژنتیک الگوریتم با MATLAB  در جهاد دانشگاهی امیرکبیر

کلاس تخصصی شبکه عصبی، فازی ژنتیک الگوریتم با MATLAB

جهت ثبت نام در کلاس  با جهاد دانشگاهی امیرکبیر به شماره زیر تماس بگیرید:

88895969 خانم احمدی- جهاد دانشگاهی امیرکبیر


زمان تشکیل کلاس ها: ابتدای هر فصل در روزهای پنج شنبه از ساعت 8 تا 12 و یا 12 تا 16

سرفصل ها

1- مقدمات شامل کار با توابع

2- دو جلسه شبکه عصبی

3- دو جلسه فازی

4- دو جلسه ژنتیک الگوریتم

5- یک جلسه پردازش تصویر

جزوه مقدماتی کلاس را نیز می توانید از سایت زیر دانلود نمائید

http://mathworks.ir/persian-ebooks/295-neural-network-fuzzy-ga

آموزش دسته ای (batch training) اموزش افزایشی (Increasing training)

دو دستور train و adapt‌ در مطلب جهت آموزش یک شبکه عصبی بکار می روند جهت درک این دو دستور به دو مثال زیر دقت کنید:

دستور batch با هر ورودی، وزن ها و بایاس را به روز می کند (batch training)

clear
clc
Wo=[0 0];
bo=0;
alfa=.01;
p=[[1;2] [2;1] [2;3] [3;1]];
t=[4 5 7 7];
%use error , weight and bias in each iteration
for j=1:2
for i=1:4
    a(i)=Wo*p(:,i)+bo;
    e=t(:,i)-a(i);
    Wo=Wo+alfa*e*p(:,i)';
    bo=bo+alfa*e;
end
end

اما دستور train‌ به روش Increasing training اموزش می دهد یعنی پس اتمام یک گذر از ورودی ها، وزن ها و بایاس ها را به روز می کند

clear
clc
Wo=[0 0];
bo=0;
Wn=[0 0];
bn=0;
alfa=.01;
p=[[1;2] [2;1] [2;3] [3;1]];
t=[4 5 7 7];
for j=1:2
for i=1:4
    a(i)=Wn*p(:,i)+bn;
    e=t(:,i)-a(i);
    Wo=Wo+alfa*e*p(:,i)';
    bo=bo+alfa*e;
end
   Wn=Wo;
   bn=bo;
end


سایت دانلود رایگان کتاب مهندسی از سایت های روسی

پس از آن‌که library.nu، توقیف شد، معلوم گردید که خیلی‌ها در سراسر دنیا، از آن استفاده می‌کردند. ما هم استفاده می‌کردیم و در آستانه نمایشگاه کتاب، متحیر بودیم از اینکه کسانی کتاب خارجی، به زحمت می‌خرند، در حالی که library.nu هست.این دامین، پس از آن‌که مدت‌ها مسدود بود، ظاهراً توسط گوگل، بازگشایی شده است، ولی به خودbooks.google.com ارجاع می‌دهد. پیشنهاد جایگزین که البته مثل library.nu نیست، www.bookfi.org است. البته بدون آن‌که امنیت این سایت را احراز کنم. در عین حال، دو سایت دیگر، یعنی libgen.info و gen.lib.rus.ec هستند؛ مع‌الوصف، bookfi.org، به نحو مشهودی بهتر است.هر سه سایت روسی هستند.
در این سه سایت، به قیاس library.nu، یک چیز، بهتر است، و آن اینکه دانلود کتاب دو مرحله‌ای نیست، و مستقیم از روی هاست خود سایت برداشت می‌شود.

منبع

http://hamidmassoudi.blogfa.com/post-76.aspx

تنظیم بهره PID‌ با شبکه عصبی

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

این برنامه را به محیط مطلب ببرید، اجرا کنید و از نتایج آن لذت ببرید. فقط برای تغییر هر روش عدد  M‌ رابرابر با 1 یا 2 یا 3 یا 4 قرار دهید.

با این روش می توانید ضرایب یک سیستم PID‌را با شبکه عصبی تنظیم کنید و یک سیستم تطبیقی بسازید.

منبع: http://www.codeforge.com/read/58255/CHAP4_1.M__html

%Single Neural Adaptive PID Controller
clear all;
close all;

x=[0,0,0]';

xiteP=0.40;
xiteI=0.35;
xiteD=0.40;

%Initilizing kp,ki and kd
wkp_1=0.10;
wki_1=0.10;
wkd_1=0.10;
%wkp_1=rand;
%wki_1=rand;
%wkd_1=rand;

error_1=0;
error_2=0;
y_1=0;y_2=0;y_3=0;
u_1=0;u_2=0;u_3=0;

ts=0.001;
for k=1:1:1000
    time(k)=k*ts;
    rin(k)=0.5*sign(sin(2*2*pi*k*ts));
    yout(k)=0.368*y_1+0.26*y_2+0.1*u_1+0.632*u_2;
    error(k)=rin(k)-yout(k);
  
%Adjusting Weight Value by hebb learning algorithm
M=4;
if M==1              %No Supervised Heb learning algorithm
   wkp(k)=wkp_1+xiteP*u_1*x(1);  %P
   wki(k)=wki_1+xiteI*u_1*x(2);  %I
   wkd(k)=wkd_1+xiteD*u_1*x(3);  %D
   K=0.06;  
elseif M==2          %Supervised Delta learning algorithm
   wkp(k)=wkp_1+xiteP*error(k)*u_1;  %P
   wki(k)=wki_1+xiteI*error(k)*u_1;  %I
   wkd(k)=wkd_1+xiteD*error(k)*u_1;  %D
   K=0.12;  
elseif M==3          %Supervised Heb learning algorithm
   wkp(k)=wkp_1+xiteP*error(k)*u_1*x(1);  %P
   wki(k)=wki_1+xiteI*error(k)*u_1*x(2);  %I
   wkd(k)=wkd_1+xiteD*error(k)*u_1*x(3);  %D
   K=0.12;  
elseif M==4          %Improved Heb learning algorithm
   wkp(k)=wkp_1+xiteP*error(k)*u_1*(2*error(k)-error_1);
   wki(k)=wki_1+xiteI*error(k)*u_1*(2*error(k)-error_1);
   wkd(k)=wkd_1+xiteD*error(k)*u_1*(2*error(k)-error_1);
   K=0.12;  
end
  
   x(1)=error(k)-error_1;             %P
   x(2)=error(k);                     %I
   x(3)=error(k)-2*error_1+error_2;   %D

   wadd(k)=abs(wkp(k))+abs(wki(k))+abs(wkd(k));
   w11(k)=wkp(k)/wadd(k);
   w22(k)=wki(k)/wadd(k);
   w33(k)=wkd(k)/wadd(k);
   w=[w11(k),w22(k),w33(k)];

    u(k)=u_1+K*w*x;     %Control law

if u(k)>10
   u(k)=10;
end  
if u(k)<-10
   u(k)=-10;
end  
 
error_2=error_1;
error_1=error(k);
  
u_3=u_2;u_2=u_1;u_1=u(k);
y_3=y_2;y_2=y_1;y_1=yout(k);
  
wkp_1=wkp(k);
wkd_1=wkd(k);
wki_1=wki(k);
end
figure(1);
plot(time,rin,'b',time,yout,'r');
xlabel('time(s)');ylabel('rin,yout');
figure(2);
plot(time,error,'r');
xlabel('time(s)');ylabel('error');
figure(3);
plot(time,u,'r');
xlabel('time(s)');ylabel('u'); ...

کنترل با شبکه عصبی

جهت کنترل یک سیستم دینامیکی با شبکه عصبی داده های ورودی و خروجی جهت آموزش از قبل مشخص نیستند. لذا نمی توان بصورت مستقیم سیستم کنترلی را آموزش داد. بلکه باید خطای سیستم محاسبه شود و بر مبنای این خطای سیستم ، وزن ها و بایاس ها به روز گردند.

متاسفانه در مطلب حتما باید ورودی و خروجی ها از قبل مشخص باشند لذا دستور مستقیمی برای این روش در مطلب وجود ندارد.

جهت کنترل یک سیستم دینامیکی با شبکه عصبی از الگوریتم مقاله زیر استفاده نمائید

http://profdoc.um.ac.ir/paper-abstract-1007222.html