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

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

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
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
کدهای این پروژه را نیز از سایت زیر دانلود نمائید
کلاس تخصصی شبکه عصبی، فازی ژنتیک الگوریتم با MATLAB
جهت ثبت نام در کلاس با جهاد دانشگاهی امیرکبیر به شماره زیر تماس بگیرید:
88895969 خانم احمدی- جهاد دانشگاهی امیرکبیر
زمان تشکیل کلاس ها: ابتدای هر فصل در روزهای پنج شنبه از ساعت 8 تا 12 و یا 12 تا 16
سرفصل ها
1- مقدمات شامل کار با توابع
2- دو جلسه شبکه عصبی
3- دو جلسه فازی
4- دو جلسه ژنتیک الگوریتم
5- یک جلسه پردازش تصویر
جزوه مقدماتی کلاس را نیز می توانید از سایت زیر دانلود نمائید
http://mathworks.ir/persian-ebooks/295-neural-network-fuzzy-ga
دو دستور 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
این برنامه را به محیط مطلب ببرید، اجرا کنید و از نتایج آن لذت ببرید. فقط برای تغییر هر روش عدد 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