from Fitting NURBS to a given set of data points by Vikash Gupta
Given a set of six points a closed NURBS curve is used to approximately fit all the six data points.

main.m
clc; clear all;
tol=1E-7;
format long;
inputfile;
% return;
guessinit={P1 P2 P3 P4 P5 P6 P7 P8 P9};        %initial Simplex

plot(A(:,1),A(:,2),'r*');
hold on;


[fnvalue] = evaluatefunctioninit(guessinit,A);

err=max(fnvalue)-min(fnvalue);
maxiter=1000;
guess=guessinit;
alpha=1;
beta=0.5;
gamma=2;
delta=0.5;
itrnumber=1;
  


while (err>tol) 
	
   	    itrnumber
	    error=err
	  		    
     [xc,indw]=calcentroid(fnvalue,guess);
     [xh,xs,xl,fh,fs,fl]=sorting(guess,fnvalue);
 	    xl	 
     % Reflect
     xr= xc + alpha*(xc-xh);
     fr=evaluatefunction(xr,A);     % Evaluate fr
     
    if ((fl <= fr) && (fr <= fs))
        guess{indw}=xr;
%         break;
    end
    
     % Expand
     if (fr < fl)
         xe=xc + gamma*(xr-xc);
         fe=evaluatefunction(xe,A);
     
        if (fe<fr)
         guess{indw}=xe;
%          break;
        else
         guess{indw}=xr;
%          break;
        end
     end
     
     %Contract Outside
      
     if ((fs<fr) && (fr<fh))
         xu=xc+beta*(xr-xc);
         fu=evaluatefunction(xu,A);
         
         if (fu<fr)
             guess{indw}=xu;
         end
        elseif (fr >= fh)
         %Contract Inside
         xi=xc+beta*(xh-xc);
         fi= evaluatefunction(xi,A);
         if (fi< fh)
             guess{indw}=xi;
         end
     end
    
     %Shrink
            for i=1:9
                guesssh{i}= xl+ delta*(guess{i}-xl);
            end
                  [fnvalue] = evaluatefunctioninit(guesssh,A);
                  err=max(fnvalue)-min(fnvalue);
                  guess=guesssh;
                  itrnumber=itrnumber+1;
                  [x,y]=getbspline(xl);
                    plot(x,y);
                    grid on;
                    pause(0.01);
end


Contact us at files@mathworks.com