From: Alan Weiss on
You might want to use some built-in MATLAB functions.
fminsearch performs the Nelder-Mead simplex algorithm.
It accepts a single vector of inputs, say x = [x(1),x(2),x(3)], and
works on your objective function that should take x and return f(x),
where f(x) is the function to minimize. For your problem, take x =
[L,A,dn], and write your objective function in terms of x.

It seems to me that your code is doing some very inefficient
root-finding as well. Take a look at the fzero function for a solid
root-finding implementation.

fminsearch reference:
http://www.mathworks.com/access/helpdesk/help/techdoc/ref/fminsearch.html

fminsearch example:
http://www.mathworks.com/access/helpdesk/help/techdoc/math/bsgpq6p-10.html

fzero reference:
http://www.mathworks.com/access/helpdesk/help/techdoc/ref/fzero.html

fzero example:
http://www.mathworks.com/access/helpdesk/help/techdoc/math/bsgpq6q-44.html

Alan Weiss
MATLAB mathematical toolbox documentation

kuffal al wrote:
> can someone help me to optimize the fiber bragg grating(fbg) using
> nelder mead simplex algoritm. i have both codes (both codes working
> well) the fbg n nelder mead but i fail to integrate them. the parameter
> that i want to optimize are the length (L), period (A) and the induced
> index change (dn). so here are the codes
>
> (1)the fbg code
> %==========================================================================
> % matlab script for solving the coupled-mode equation using % the
> transfer matrix method
> %==========================================================================
>
> clear all
> close all
> clc
>
> %==========================================================================
> % fibre simulation parameters
> %==========================================================================
>
> L = 0.0100; % Grating Length
>
> dn = 1.0e-4; % Induced index change
>
> design_lambda = 1550e-9; % design wavelength
>
> %==========================================================================
> % finding neff(effective reflective index) for the designed fibre
> %==========================================================================
>
> format long
> n=40;
> a=0.5;
> increment=2;
> tolerance=1e-4;
>
> nco=1.447; % nco-core index
> ncl=1.444; % ncl-cladding index
> xstart=((ncl-0.0112)+nco)/2;
> x=xstart;
> dx=increment;
>
> %==========================================================================
> % to find the root of neff(effective reflective index)
> %==========================================================================
>
>
> for m=1:n
> neff= sqrt((ncl^2)+(a*x)*(nco^2-ncl^2));
> while dx/x>tolerance
> if neff~=sqrt((ncl^2)+(a*(x+dx))*(nco^2-ncl^2));
> dx=dx/2;
> else
> x=x+dx;
> end
> end
> route(m)=x;
> dx=increment;
> x=1.0001*x;
> end
> neff=route(40:end);
>
> V =(2*pi/design_lambda)*a*sqrt(nco^2-ncl^2); % normalize frequency
>
> A=design_lambda/(2*neff); % Grating period 5.36e-7;
>
> lambda=(1549.50e-9:0.005e-9:1550.50e-9); % Spectra range
>
>
> %==========================================================================
> % Coupled-mode Theory
> %==========================================================================
>
> v=1; % visibility, v assumed to be 1
>
> k=(pi./lambda)*v*dn; % AC coupling coefficient
>
> % DC(period averaged) coupling coefficient
>
> % for stronger grating, sigma_dc assumed to be 0
>
> sigma_dc =0; %(2*pi./lambda).*dn;
>
> % general DC coupling coefficient
>
> sigma = 2*pi*neff.*(1./lambda - 1/(2*neff*A)) + sigma_dc;
>
>
> %==========================================================================
> % Power Reflection coefficients(R)
> %==========================================================================
>
> K2 = k.*k;
>
> sigma2 = sigma.*sigma;
>
> difference = K2-sigma2;
>
> up = sinh(L*sqrt(difference)).^2;
>
> down = cosh(L*sqrt(difference)).^2 - sigma2./K2;
>
> R = up./down;
>
> Rt = transpose(R);
>
> %==========================================================================
> % saving the points
> %==========================================================================
>
> save 'fileToRead1.txt' Rt -ascii
>
> %==========================================================================
> % plots for reflection spectra for Bragg reflector
> %==========================================================================
>
> figure(1)
>
> plot(lambda,R,'b');
>
> axis( [1549.50e-9, 1550.50e-9, 0, 1]);
>
> title('Reflection Spectra of Bragg grating');
>
> xlabel('Wavelength(m)');
>
> ylabel('Reflectivity(p.u)');
>
> figure(2)
> stairs(lambda,R,'r');figure(gcf)
> axis( [1549.50e-9, 1550.50e-9, 0, 1]);
>
> --------------------------------------------------------------------------------------------------------------------
>
>
> (2) the nelder-mead code
>
> %*******************************************
> %* Nelder and Mead Technique *
> %* Siamak Faridani *
> %* University of Oklahoma *
> %* 16 Oct 2005 *
> %* www.PitchUp.com *
> %*******************************************
>
>
> clc;
> clear all; close all;
> N=2;
> alpha=2;
> beta=.25;
> gamma=2.5;
> Precision=.00001
>
> %Insert your starting point and the function here
> x01=1.5505*1e-6;
> x02=1.550e-6;
> func=(a)Modified_fbg
>
>
> %do not modify the following lines
> %==============================
>
> x=[[x01,x02]];
>
>
>
> delta1=(((N+1)^.5+N-1)/(N*sqrt(2)))*alpha;
>
> delta2=(((N+1)^.5-1)/(N*sqrt(2)))*alpha
> x=[x;[x(1,1)+delta1,x(1,2)+delta2];[x(1,1)+delta2,x(1,2)+delta1]];
> x_archive=[x
> [func(x(1,1),x(1,2));func(x(2,1),x(2,2));func(x(3,1),x(3,2))]];
> l=0
> x
> disp('start================');
> Precision_inverse=Precision^-1;
> while
> ~(isequal(round(x(1,:)*Precision_inverse),round(x(2,:)*Precision_inverse),round(x(3,:)*Precision_inverse)))
>
> l=l+1;
> values=[func(x(1,1),x(1,2));func(x(2,1),x(2,2));func(x(3,1),x(3,2))];
>
> sorted=[find(values==max(values)),6-find(values==max(values))-find(values==min(values)),find(values==min(values))];
>
> xc=(1/N)*(x(sorted(1,2),:)+x(sorted(1,3),:));
> disp('trying Normal Reflection');
> xnew=x(sorted(1,1),:)+(1+alpha)*(xc-x(sorted(1,1),:))
> isitok=0;
> func(xnew(1,1),xnew(1,2))
> while isitok==0
> if ((func(xnew(1,1),xnew(1,2))>values(sorted(1,3),:)) &&
> (func(xnew(1,1),xnew(1,2))<values(sorted(1,2),:)))
> disp('f(l)<f(x_new)<f(g)')
> isitok=1;
> elseif (func(xnew(1,1),xnew(1,2))<values(sorted(1,3),:))
> disp('lets Expand...');
> xnew1=x(sorted(1,1),:)+(1+gamma)*(xc-x(sorted(1,1),:))
> func(xnew1(1,1),xnew1(1,2))
> if (func(xnew1(1,1),xnew1(1,2))<func(xnew(1,1),xnew(1,2)))
> xnew=xnew1
> end
> isitok=1;
> elseif (func(xnew(1,1),xnew(1,2))>values(sorted(1,2),:)) &&
> (func(xnew(1,1),xnew(1,2))>values(sorted(1,1),:))
> disp('lets Contract with teta=-beta...');
> xnew1=x(sorted(1,1),:)+(1-beta)*(xc-x(sorted(1,1),:))
> func(xnew1(1,1),xnew1(1,2))
> if (func(xnew1(1,1),xnew1(1,2))<func(xnew(1,1),xnew(1,2)))
> xnew=xnew1
> end
> isitok=1;
> elseif (func(xnew(1,1),xnew(1,2))>values(sorted(1,2),:)) &&
> (func(xnew(1,1),xnew(1,2))<values(sorted(1,1),:))
> disp('lets Contract with teta=beta...');
> xnew1=x(sorted(1,1),:)+(1+beta)*(xc-x(sorted(1,1),:))
> func(xnew1(1,1),xnew1(1,2))
> if (func(xnew1(1,1),xnew1(1,2))<func(xnew(1,1),xnew(1,2)))
> xnew=xnew1
> end isitok=1;
> end
> end
> x(sorted(1,1),:)=xnew;
> x
> disp('Finished================');
> x_archive=[x_archive;[x
> [func(x(1,1),x(1,2));func(x(2,1),x(2,2));func(x(3,1),x(3,2))]]];
> end
>
> subplot(1,2,1)
> plot(x_archive(:,1),x_archive(:,2),'o-r')
> subplot(1,2,2)
> patch(x_archive(:,1),x_archive(:,2),x_archive(:,3),'r')
> view(3)
>
> values=[func(x(1,1),x(1,2));func(x(2,1),x(2,2));func(x(3,1),x(3,2))];
>
> sorted=[find(values==max(values)),6-find(values==max(values))-find(values==min(values)),find(values==min(values))];
>
> disp(sprintf('Number of iteration= %10d\n',l))
> disp(sprintf('minimum of f(x) is %10.5f that occurs at
> x=[%10.5f,%10.5f]\n',min(values),x(find(values==min(values)),1),x(find(values==min(values)),2)))
>