clear;clc;close all;
Data=importdata('Data.mat');
%Initialize training data
F=Data.F; ynew=Data.ynew; 
BSk=[2 2]; BSm=[10 10]; ynewa=[];
x=1:size(ynew,1); y=1:size(ynew,2);
for i=1:size(ynew,3)
    f(:,:)=ynew(:,:,i);
    aa = myBS2Df2a(f,x,y,BSk,BSm);
    ynewa=[ynewa,aa];
end
xnet=[];ynet=[];

for i=1:size(F,1)
   xnet(:,i)  = F(i,:);
   ynet(:,i)  = ynewa(:,i);
end
[xnet,Sxtmp]=mapminmax(xnet); 
[ynet,Sytmp]=mapminmax(ynet);

%Net parameters setting-up

net=newff(minmax(xnet),[8,10,12,BSm(1)*BSm(2)],{'tansig','tansig','purelin','purelin'},'trainlm');
net.trainParam.epochs=100;
net.trainParam.goal=1e-4;

net.trainParam.lr=0.01;
net.trainParam.mc=0.90;

net.performFcn='sse';
net=init(net);
[net,tr]=train(net,xnet,ynet);

%verification
xtest(:,1)=[80 50]';
xtest=mapminmax.apply(xtest,Sxtmp); 
ytest=sim(net,xtest); 
ytest=mapminmax.reverse(ytest,Sytmp); 
ftest=myBS2Da2f(ytest,BSm, BSk, x, y); 


function f=myBS2Da2f(a,mxy,kxy,x,y)

if size(x,1)<size(x,2) 
    x=x';
end
if size(y,1)<size(y,2) 
    y=y';
end
for xyi=1:2
    if xyi==1
        tmpx=x;
    else
        tmpx=y;
    end
    m=mxy(xyi); k=kxy(xyi);
    t=zeros([m+k+1,1]);
    xmin=min(tmpx); xmax=max(tmpx);
    for j=1:length(t)
        t(j)=(xmax-xmin)/(m-k)*(j-k-1)+xmin;
    end
    Nik=zeros([size(tmpx,1),m+k]);
    Niktmp=zeros([size(tmpx,1),1]);
    for ki=0:k
       if ki==0
           for j=1:m+k
               Nik(tmpx>=t(j)&tmpx<t(j+1),j)=1;
               Nik(~(tmpx>=t(j)&tmpx<t(j+1)),j)=0;
           end       
       else
           for j=1:m+k-ki 
               Niktmp(:)=0;
               
                    Niktmp=Niktmp+(tmpx-t(j))/(t(j+ki)-t(j)).*Nik(:,j);
               
                    Niktmp=Niktmp+(t(j+ki+1)-tmpx)/(t(j+ki+1)-t(j+1)).*Nik(:,j+1);
              
               Nik(:,j)=Niktmp;
           end
       end
    end
    if xyi==1
        Nikx=Nik(:,1:m);
    else
        Niky=Nik(:,1:m);
    end
end
AA=[]; ff=[];  nx=length(x); ny=length(y);
for p=1:ny
    for i=1:nx
        for l=1:mxy(2)
            for j=1:mxy(1)
                AA((p-1)*nx+i,(l-1)*mxy(1)+j)=Niky(p,l)*Nikx(i,j);
            end
        end
    end
end
ff=AA*a; f=[];
for p=1:ny
    for i=1:nx
        f(p,i)=ff((p-1)*nx+i,1);
    end
end
end

function a=myBS2Df2a(f,x,y,kxy,mxy)


if size(x,1)<size(x,2)
    x=x';
end
if size(y,1)<size(y,2) 
    y=y';
end
a=zeros([mxy(1)*mxy(2),1]); 
for xyi=1:2
    if xyi==1
        tmpx=x;
    else
        tmpx=y;
    end
    m=mxy(xyi); k=kxy(xyi);
    t=zeros([m+k+1,1]);
    xmin=min(tmpx); xmax=max(tmpx);
    for j=1:length(t)
        t(j)=(xmax-xmin)/(m-k)*(j-k-1)+xmin;
    end
    Nik=zeros([size(tmpx,1),m+k]);
    Niktmp=zeros([size(tmpx,1),1]);
    for ki=0:k
       if ki==0
           for j=1:m+k
               Nik(tmpx>=t(j)&tmpx<t(j+1),j)=1;
               Nik(~(tmpx>=t(j)&tmpx<t(j+1)),j)=0;
           end       
       else
           for j=1:m+k-ki 
               Niktmp(:)=0;
               
                    Niktmp=Niktmp+(tmpx-t(j))/(t(j+ki)-t(j)).*Nik(:,j);
               
                    Niktmp=Niktmp+(t(j+ki+1)-tmpx)/(t(j+ki+1)-t(j+1)).*Nik(:,j+1);
               
               Nik(:,j)=Niktmp;
           end
       end
    end
    if xyi==1
        Nikx=Nik(:,1:m);
    else
        Niky=Nik(:,1:m);
    end
end
AA=[]; ff=[];  nx=length(x); ny=length(y);
for p=1:ny
    for i=1:nx
        for l=1:mxy(2)
            for j=1:mxy(1)
                AA((p-1)*nx+i,(l-1)*mxy(1)+j)=Niky(p,l)*Nikx(i,j);
            end
        end
        ff((p-1)*nx+i,1)=f(p,i);
    end
end
a=(AA'*AA)\(AA'*ff);
end