📄 greathome.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%本程序为补偿模糊神经网络程序
clear;
clc;
tspan=[0 20];x0=[1.0 1.0];
global kk;kk=0;
[t,x]=ode45('g2',tspan,x0),kk %解方程 g2为自编函数名
x1=x(:,1); x2=x(:,2);
siz=size(x); %求输入矩阵x的维数
nu=siz(:,1); %求输入矩阵x的行数
for d=1:1:nu
y(d,1)=sin(x1(d,:)+x2(d,:)); %求函数y的解
end
rule=25; %定义模糊规则数
uA=zeros(rule,2);
uA1=uA(:,1);
uA2=uA(:,2);
c=zeros(rule,2);
c1=c(:,1);c2=x(:,2);number=0;
for i=1:1:rule
c1(i,1)=0.5;c2(i,1)=0.5; %定义初始输入隶属函数宽度
d(i,:)=0.5; %定义初始输出隶属函数宽度
g(i,1)=0.1;
h(i,1)=0.1;
m(i,1)=(g(i,:)^2)/(g(i,1)^2+h(i,1)^2); %定义初始补偿度
q(i,:)=1-m(i,:)+m(i,:)/2;
a1(i,1)=0.5+0.5*ceil(i/5); %定义初始输入隶属函数中心
a2(i,1)=0.5+0.25*rem(i,5); %定义初始输入隶属函数中心
end
n=0.95;
ww=zeros(rule,1);mkik=zeros(rule,1);b=zeros(rule,1);
xspan1=[0.5,0.75,1.25,1.75,2.25,2.5];
xspan2=[0.4,0.625,0.875,1.125,1.375,1.5]
for s=1:1:nu
x11=x1(s,:);x22=x2(s,:);yy=y(s,:);k=0;
for i1=1:1:5
for i2=1:1:5
k=k+1;
if (x11>=xspan1(i1)&x11<=xspan1(i1+1)&x22>=xspan2(i2)&x22<=xspan2(i2+1))
ww(k,1)=ww(k,1)+1;
mkik(k,1)=yy^s;
b(k,:)=b(k,:)+mkik(k,1);
end
end
end
end
for i=1:1:rule
if (ww(i,1)==0)
b(i,:)=0.5;
else
b(i,:)=b(i,:)/ww(i,1);
end
end
e=ones(1,nu);eee=1;
while(eee>=0.005)
eeh=0;
for s=1:1:nu
x11=x1(s,:);x22=x2(s,:);yy=y(s,:);
s1=0;s2=0;
for i=1:1:rule
uA1(i,:)=exp(-((x11-a1(i,:))/c1(i,:))^2);
uA2(i,:)=exp(-((x22-a2(i,:))/c2(i,:))^2);
z(i,:)=(uA1(i,:)*uA2(i,:))^q(i,:);
s1=s1+b(i,:)*d(i,:)*z(i,:);
s2=s2+d(i,:)*z(i,:);
end
f(s,:)=s1/s2;
e(1,s)=((f(s,:)-yy)^2)/2;
eeh=eeh+e(1,s);
for j=1:1:rule;
%计算输出隶属函数的中心
dyb(j,:)=-((f(s,:)-yy)*d(j,:)*z(j,:))/s2;
%计算输出隶属函数的宽度
dyd(j,:)=-((f(s,:)-yy)*(b(j,:)-f(s,:))*z(j,:))/2;
%计算输入隶属函数的中心
dya1(j,:)=-(2*(f(s,:)-yy)*(b(j,:)-f(s,:))*(x11-a1(j,:))*q(j,:)*d(j,:)*z(j,:))/((c1(j,:)^2)*s2);
dya2(j,:)=-(2*(f(s,:)-yy)*(b(j,:)-f(s,:))*(x22-a2(j,:))*q(j,:)*d(j,:)*z(j,:))/((c2(j,:)^2)*s2);
%计算输入隶属函数的宽度
dyc1(j,:)=-(2*(f(s,:)-yy)*(b(j,:)-f(s,:))*(x11-a1(j,:))^2*q(j,:)*d(j,:)*z(j,:))/((c1(j,:)^3)*s2);
dyc2(j,:)=-(2*(f(s,:)-yy)*(b(j,:)-f(s,:))*(x22-a2(j,:))^2*q(j,:)*d(j,:)*z(j,:))/((c2(j,:)^3)*s2);
if((uA1(j,:)*uA2(j,:))~=0)
tt(j,:)=-((f(s,:)-yy)*(b(j,:)-f(s,:))*d(j,:)*z(j,:)*(log(uA1(j,:)*uA2(j,:))))/(2*s2);
g(j,:)=g(j,:)-(2*n*g(j,:)*(h(j,:)^2)*tt(j,:))/((g(j,:)^2+h(j,:)^2)^2);
h(j,:)=h(j,:)-(2*n*h(j,:)*(g(j,:)^2)*tt(j,:))/((g(j,:)^2+h(j,:)^2)^2);
m(j,:)=(g(j,:)^2)/(g(j,:)^2+h(j,:)^2);
q(j,:)=1-m(j,:)+m(j,:)/2;
end
%调整输入\输出隶属函数的中心和宽度
b(j,:)=b(j,:)+n*dyb(j,:);
d(j,:)=d(j,:)+n*dyb(j,:);
a1(j,:)=a1(j,:)+n*dya1(j,:);
a2(j,:)=a2(j,:)+n*dya2(j,:);
c1(j,:)=c1(j,:)+n*dyc1(j,:);
c2(j,:)=c2(j,:)+n*dyc2(j,:);
end
end
eee=eeh;
number=number+1;
num(number,:)=number;
eeee(number,:)=eee;
end
figure(1)
plot(t,y,'r',t,f,'b');
figure(2)
plot(num,eeee);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -