pro simplex,param,dparam,nloops common itern,iterc ; ; Maximises by the simplex method a function of many parameters. ; ; Chris Burrows - StScI 26 Jan 1988 ; print,'Creating starting vertices' np=n_elements(param) simp=dblarr(np+1,np) result=dblarr(np+1) for i=0,np do for j=0,np-1 do simp(i,j)=param(j) for i=1,np do simp(i,i-1)=simp(i,i-1)+dparam(i-1) for i=0,np do begin funspx,simp(i,*),funres result(i)=funres endfor ; ; order the vertices ; ibtr=0 totit=0 for iter=0,abs(nloops) do begin iterc=iter totit=totit+1 if(totit gt 250) then iter=abs(nloops)+1 order,simp,result print,'$(1x,i5,a,f12.5)',iter,' ::',abs(result(0)-result(np)) print,'$(1x,13f10.3)',abs(result) if (ibtr eq 1) then begin printf,68,'$(1x,i5,a,f12.5)',iter,' ::',abs(result(0)-result(np)) printf,68,'$(1x,13f10.3)',abs(result) endif ; reflect,simp,refp funspx,refp,refres if(refres gt result(0))then begin expand,simp,expp funspx,expp,expres if(expres gt result(0)) then begin for i=0,np-1 do simp(np,i)=expp(i) result(np)=expres print,' ... expanded well' if(nloops lt 0) then iterc=0 endif else begin for i=0,np-1 do simp(np,i)=refp(i) result(np)=refres print,' ... reflected well' endelse ibtr=1 endif else begin if(refres gt result(np)) then begin for i=0,np-1 do simp(np,i)=refp(i) result(np)=refres print,' ... reflected badly' endif else begin contract,simp,conp funspx,conp,conres if(conres gt result(np)) then begin for i=0,np-1 do simp(np,i)=conp(i) result(np)=conres if(conres gt result(0)) then print,' ... contracted well' if(conres le result(0)) then print,' ... contracted' endif else begin contrall,simp for i=1,np do begin funspx,simp(i,*),funres result(i)=funres endfor print,' ... contracted all' endelse endelse ibtr=0 endelse iter=iterc endfor for j=0,np-1 do param(j)=simp(0,j) for j=0,np-1 do dparam(j)=simp(np,j)-simp(0,j) nloops=totit return end