124 MODULE PROCEDURE nelminrange_dp, nelminrange_sp
136 function nelmin(func, pstart, varmin, step, konvge, maxeval, &
137 funcmin, neval, numrestart, ierror, history)
145 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: pp
149 real(dp),
intent(IN) :: pstart(:)
150 real(dp),
optional,
intent(IN) :: varmin
151 real(dp),
optional,
intent(IN) :: step(:)
152 integer(i4),
optional,
intent(IN) :: konvge
153 integer(i4),
optional,
intent(IN) :: maxeval
154 real(dp),
optional,
intent(OUT) :: funcmin
155 integer(i4),
optional,
intent(OUT) :: neval
156 integer(i4),
optional,
intent(OUT) :: numrestart
157 integer(i4),
optional,
intent(OUT) :: ierror
158 real(dp),
optional,
intent(OUT),
allocatable :: history(:)
159 real(dp) ::
nelmin(size(pstart))
161 real(dp),
parameter :: ccoeff = 0.5_dp
162 real(dp),
parameter :: ecoeff = 2.0_dp
163 real(dp),
parameter :: rcoeff = 1.0_dp
164 real(dp),
parameter :: eps = 0.001_dp
165 real(dp) :: ipstart(size(pstart))
168 real(dp) :: istep(size(pstart))
169 integer(i4) :: ikonvge
170 integer(i4) :: imaxeval
171 integer(i4) :: ineval
172 integer(i4) :: inumrestart
173 integer(i4) :: iierror
179 integer(i4) :: jcount
182 real(dp) :: p(size(pstart),size(pstart)+1)
183 real(dp) :: p2star(size(pstart))
184 real(dp) :: pbar(size(pstart))
185 real(dp) :: pstar(size(pstart))
188 real(dp) :: y(size(pstart)+1)
194 real(dp) :: p0(size(pstart)), y0
195 real(dp),
allocatable :: history_tmp(:)
200 if (
present(varmin))
then
201 if (varmin <= 0.0_dp) stop
'Error nelmin: varmin<0'
207 if (
present(maxeval))
then
208 if (maxeval <= 1) stop
'Error nelmin: maxeval<=1'
214 if (
present(history))
then
216 allocate(history_tmp(imaxeval+3*
size(ipstart)+1))
218 if (
present(konvge))
then
221 ikonvge = imaxeval / 10
223 if (ikonvge < 1) stop
'Error nelmin: konvg<1'
225 if (
present(step))
then
231 if (
ne(p0(i),0.0_dp))
then
232 p0(i) = 1.01_dp*p0(i)
236 istep(i) = abs(func(p0) - y0)
259 p(1:n,nn) = ipstart(1:n)
260 y(nn) = func(ipstart)
262 if (
present(history)) history_tmp(ineval) = y(nn)
268 ipstart(j) = ipstart(j) + istep(j) * del
269 p(1:n,j) = ipstart(1:n)
273 if (
present(history)) history_tmp(ineval) = min( y(j), history_tmp(ineval-1) )
279 ilo = minloc(y(1:n+1), 1)
284 do while ( ineval < imaxeval )
288 ihi = maxloc(y(1:n+1), 1)
295 pbar(i) = ( sum(p(i,1:n+1)) - p(i,ihi) ) / dn
300 pstar(1:n) = pbar(1:n) + rcoeff * ( pbar(1:n) - p(1:n,ihi) )
303 if (
present(history)) history_tmp(ineval) = min( ystar, history_tmp(ineval-1) )
307 if ( ystar < ylo )
then
309 p2star(1:n) = pbar(1:n) + ecoeff * ( pstar(1:n) - pbar(1:n) )
310 y2star = func(p2star)
312 if (
present(history)) history_tmp(ineval) = min( y2star, history_tmp(ineval-1) )
316 if ( ystar < y2star )
then
317 p(1:n,ihi) = pstar(1:n)
320 p(1:n,ihi) = p2star(1:n)
329 if ( ystar < y(i) ) l = l + 1
333 p(1:n,ihi) = pstar(1:n)
338 else if ( l == 0 )
then
339 p2star(1:n) = pbar(1:n) + ccoeff * ( p(1:n,ihi) - pbar(1:n) )
340 y2star = func(p2star)
342 if (
present(history)) history_tmp(ineval) = min( y2star, history_tmp(ineval-1) )
346 if ( y(ihi) < y2star )
then
348 p(1:n,j) = ( p(1:n,j) + p(1:n,ilo) ) * 0.5_dp
352 if (
present(history)) history_tmp(ineval) = min( y(j), history_tmp(ineval-1) )
354 ilo = minloc(y(1:n+1), 1)
362 p(1:n,ihi) = p2star(1:n)
368 else if ( l == 1 )
then
370 p2star(1:n) = pbar(1:n) + ccoeff * ( pstar(1:n) - pbar(1:n) )
371 y2star = func(p2star)
373 if (
present(history)) history_tmp(ineval) = min( y2star, history_tmp(ineval-1) )
377 if ( y2star <= ystar )
then
378 p(1:n,ihi) = p2star(1:n)
381 p(1:n,ihi) = pstar(1:n)
391 if ( y(ihi) < ylo )
then
398 if ( 0 < jcount ) cycle
402 if ( ineval <= imaxeval )
then
404 x = sum( y(1:n+1) ) / dnn
405 z = sum( ( y(1:n+1) - x )**2 )
416 if ( imaxeval < ineval )
then
428 if (
present(history)) history_tmp(ineval) = min( z, history_tmp(ineval-1) )
429 if ( z < ifuncmin )
then
436 if (
present(history)) history_tmp(ineval) = min( z, history_tmp(ineval-1) )
437 if ( z < ifuncmin )
then
444 if ( iierror == 0 )
exit
448 ipstart(1:n) =
nelmin(1:n)
450 inumrestart = inumrestart + 1
454 if (
present(funcmin))
then
457 if (
present(neval))
then
460 if (
present(numrestart))
then
461 numrestart = inumrestart
463 if (
present(ierror))
then
466 if (
present(history))
then
467 allocate(history(ineval))
468 history(:) = history_tmp(1:ineval)
475 function nelminxy(func, pstart, xx, yy, varmin, step, konvge, maxeval, &
476 funcmin, neval, numrestart, ierror, history)
481 FUNCTION func(pp, xxx, yyy)
484 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: pp
485 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: xxx
486 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: yyy
490 real(dp),
intent(IN) :: pstart(:)
491 real(dp),
intent(IN) :: xx(:)
492 real(dp),
intent(IN) :: yy(:)
493 real(dp),
optional,
intent(OUT) :: funcmin
494 real(dp),
optional,
intent(IN) :: varmin
495 real(dp),
optional,
intent(IN) :: step(:)
496 integer(i4),
optional,
intent(IN) :: konvge
497 integer(i4),
optional,
intent(IN) :: maxeval
498 integer(i4),
optional,
intent(OUT) :: neval
499 integer(i4),
optional,
intent(OUT) :: numrestart
500 integer(i4),
optional,
intent(OUT) :: ierror
501 real(dp),
optional,
intent(OUT),
allocatable :: history(:)
504 real(dp),
parameter :: ccoeff = 0.5_dp
505 real(dp),
parameter :: ecoeff = 2.0_dp
506 real(dp),
parameter :: rcoeff = 1.0_dp
507 real(dp),
parameter :: eps = 0.001_dp
508 real(dp) :: ipstart(size(pstart))
511 real(dp) :: istep(size(pstart))
512 integer(i4) :: ikonvge
513 integer(i4) :: imaxeval
514 integer(i4) :: ineval
515 integer(i4) :: inumrestart
516 integer(i4) :: iierror
522 integer(i4) :: jcount
525 real(dp) :: p(size(pstart),size(pstart)+1)
526 real(dp) :: p2star(size(pstart))
527 real(dp) :: pbar(size(pstart))
528 real(dp) :: pstar(size(pstart))
531 real(dp) :: y(size(pstart)+1)
537 real(dp) :: p0(size(pstart)), y0
538 real(dp),
allocatable :: history_tmp(:)
543 if (
present(varmin))
then
544 if (varmin <= 0.0_dp) stop
'Error nelminxy: varmin<0'
550 if (
present(maxeval))
then
551 if (maxeval <= 1) stop
'Error nelminxy: maxeval<=1'
557 if (
present(history))
then
559 allocate(history_tmp(imaxeval+3*
size(ipstart)+1))
561 if (
present(konvge))
then
564 ikonvge = imaxeval / 10
566 if (ikonvge < 1) stop
'Error nelminxy: konvg<1'
567 if (
size(xx) /=
size(yy)) stop
'Error nelminxy: size(xx) /= size(yy)'
569 if (
present(step))
then
572 y0 = func(pstart, xx, yy)
575 if (
ne(p0(i),0.0_dp))
then
576 p0(i) = 1.01_dp*p0(i)
580 istep(i) = abs(func(p0, xx, yy) - y0)
603 p(1:n,nn) = ipstart(1:n)
604 y(nn) = func(ipstart, xx, yy)
606 if (
present(history)) history_tmp(ineval) = y(nn)
612 ipstart(j) = ipstart(j) + istep(j) * del
613 p(1:n,j) = ipstart(1:n)
614 y(j) = func(ipstart, xx, yy)
617 if (
present(history)) history_tmp(ineval) = min( y(j), history_tmp(ineval-1) )
623 ilo = minloc(y(1:n+1), 1)
628 do while ( ineval < imaxeval )
632 ihi = maxloc(y(1:n+1), 1)
639 pbar(i) = ( sum(p(i,1:n+1)) - p(i,ihi) ) / dn
644 pstar(1:n) = pbar(1:n) + rcoeff * ( pbar(1:n) - p(1:n,ihi) )
645 ystar = func(pstar, xx, yy)
647 if (
present(history)) history_tmp(ineval) = min( ystar, history_tmp(ineval-1) )
651 if ( ystar < ylo )
then
653 p2star(1:n) = pbar(1:n) + ecoeff * ( pstar(1:n) - pbar(1:n) )
654 y2star = func(p2star, xx, yy)
656 if (
present(history)) history_tmp(ineval) = min( y2star, history_tmp(ineval-1) )
660 if ( ystar < y2star )
then
661 p(1:n,ihi) = pstar(1:n)
664 p(1:n,ihi) = p2star(1:n)
673 if ( ystar < y(i) ) l = l + 1
677 p(1:n,ihi) = pstar(1:n)
682 else if ( l == 0 )
then
683 p2star(1:n) = pbar(1:n) + ccoeff * ( p(1:n,ihi) - pbar(1:n) )
684 y2star = func(p2star, xx, yy)
686 if (
present(history)) history_tmp(ineval) = min( y2star, history_tmp(ineval-1) )
690 if ( y(ihi) < y2star )
then
692 p(1:n,j) = ( p(1:n,j) + p(1:n,ilo) ) * 0.5_dp
696 if (
present(history)) history_tmp(ineval) = min( y(j), history_tmp(ineval-1) )
698 ilo = minloc(y(1:n+1), 1)
706 p(1:n,ihi) = p2star(1:n)
712 else if ( l == 1 )
then
714 p2star(1:n) = pbar(1:n) + ccoeff * ( pstar(1:n) - pbar(1:n) )
715 y2star = func(p2star, xx, yy)
717 if (
present(history)) history_tmp(ineval) = min( y2star, history_tmp(ineval-1) )
721 if ( y2star <= ystar )
then
722 p(1:n,ihi) = p2star(1:n)
725 p(1:n,ihi) = pstar(1:n)
735 if ( y(ihi) < ylo )
then
742 if ( 0 < jcount ) cycle
746 if ( ineval <= imaxeval )
then
748 x = sum( y(1:n+1) ) / dnn
749 z = sum( ( y(1:n+1) - x )**2 )
760 if ( imaxeval < ineval )
then
772 if (
present(history)) history_tmp(ineval) = min( z, history_tmp(ineval-1) )
773 if ( z < ifuncmin )
then
780 if (
present(history)) history_tmp(ineval) = min( z, history_tmp(ineval-1) )
781 if ( z < ifuncmin )
then
788 if ( iierror == 0 )
exit
794 inumrestart = inumrestart + 1
798 if (
present(funcmin))
then
801 if (
present(neval))
then
804 if (
present(numrestart))
then
805 numrestart = inumrestart
807 if (
present(ierror))
then
810 if (
present(history))
then
811 allocate(history(ineval))
812 history(:) = history_tmp(1:ineval)
817 function nelminrange_dp(func, pstart, prange, varmin, step, konvge, maxeval, &
818 funcmin, neval, numrestart, ierror, history)
826 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: pp
830 real(dp),
intent(IN) :: pstart(:)
831 real(dp),
intent(IN) :: prange(:,:)
832 real(dp),
optional,
intent(IN) :: varmin
833 real(dp),
optional,
intent(IN) :: step(:)
834 integer(i4),
optional,
intent(IN) :: konvge
835 integer(i4),
optional,
intent(IN) :: maxeval
836 real(dp),
optional,
intent(OUT) :: funcmin
837 integer(i4),
optional,
intent(OUT) :: neval
838 integer(i4),
optional,
intent(OUT) :: numrestart
839 integer(i4),
optional,
intent(OUT) :: ierror
840 real(dp),
optional,
intent(OUT),
allocatable :: history(:)
841 real(dp) :: nelminrange_dp(size(pstart))
843 real(dp),
parameter :: ccoeff = 0.5_dp
844 real(dp),
parameter :: ecoeff = 2.0_dp
845 real(dp),
parameter :: rcoeff = 1.0_dp
846 real(dp),
parameter :: eps = 0.001_dp
847 real(dp) :: ipstart(size(pstart))
850 real(dp) :: istep(size(pstart))
851 integer(i4) :: ikonvge
852 integer(i4) :: imaxeval
853 integer(i4) :: ineval
854 integer(i4) :: inumrestart
855 integer(i4) :: iierror
861 integer(i4) :: jcount
864 real(dp) :: p(size(pstart),size(pstart)+1)
865 real(dp) :: p2star(size(pstart))
866 real(dp) :: pbar(size(pstart))
867 real(dp) :: pstar(size(pstart))
870 real(dp) :: y(size(pstart)+1)
876 real(dp) :: p0(size(pstart)), y0
877 real(dp),
allocatable :: history_tmp(:)
881 nelminrange_dp(:) = 0.5_dp * ( prange(:,1) + prange(:,2) )
883 if (
present(varmin))
then
884 if (varmin <= 0.0_dp) stop
'Error nelmin: varmin<0'
890 if (
present(maxeval))
then
891 if (maxeval <= 1) stop
'Error nelmin: maxeval<=1'
897 if (
present(history))
then
899 allocate(history_tmp(imaxeval+3*
size(ipstart)+1))
901 if (
present(konvge))
then
904 ikonvge = imaxeval / 10
906 if (ikonvge < 1) stop
'Error nelmin: konvg<1'
908 if (
present(step))
then
914 if (
ne(p0(i),0.0_dp))
then
916 p0(i) = min( prange(i,2) , max( prange(i,1) , 1.01_dp*p0(i) ) )
919 p0(i) = min( prange(i,2) , max( prange(i,1) , 0.01_dp ) )
921 istep(i) = abs(func(p0) - y0)
927 if (
size(prange,2) .ne. 2_i4) stop
'nelminrange_dp: range has to be array of size (:,2)'
928 if (
size(prange,1) .ne.
size(ipstart)) stop
'nelminrange_dp: range has to be given for each dimension'
929 if (.not. (all(prange(:,1) .le. pstart(:)) .and. all(prange(:,2) .ge. pstart(:)) ))
then
930 stop
'nelminrange_dp: starting point is not in range'
949 p(1:n,nn) = ipstart(1:n)
950 y(nn) = func(ipstart)
952 if (
present(history)) history_tmp(ineval) = y(nn)
959 ipstart(j) = min( prange(j,2) , max( prange(j,1) , ipstart(j) + istep(j) * del ) )
960 p(1:n,j) = ipstart(1:n)
964 if (
present(history)) history_tmp(ineval) = min( y(j), history_tmp(ineval-1) )
970 ilo = minloc(y(1:n+1), 1)
975 do while ( ineval < imaxeval )
979 ihi = maxloc(y(1:n+1), 1)
986 pbar(i) = ( sum(p(i,1:n+1)) - p(i,ihi) ) / dn
992 pstar(1:n) = min( prange(1:n,2) , max( prange(1:n,1) , pbar(1:n) + rcoeff * ( pbar(1:n) - p(1:n,ihi) ) ) )
995 if (
present(history)) history_tmp(ineval) = min( ystar, history_tmp(ineval-1) )
999 if ( ystar < ylo )
then
1002 p2star(1:n) = min( prange(1:n,2) , max( prange(1:n,1) , pbar(1:n) + ecoeff * ( pstar(1:n) - pbar(1:n) ) ) )
1003 y2star = func(p2star)
1005 if (
present(history)) history_tmp(ineval) = min( y2star, history_tmp(ineval-1) )
1009 if ( ystar < y2star )
then
1010 p(1:n,ihi) = pstar(1:n)
1013 p(1:n,ihi) = p2star(1:n)
1022 if ( ystar < y(i) ) l = l + 1
1026 p(1:n,ihi) = pstar(1:n)
1031 else if ( l == 0 )
then
1033 p2star(1:n) = min( prange(1:n,2) , max( prange(1:n,1) , pbar(1:n) + ccoeff * ( p(1:n,ihi) - pbar(1:n) ) ) )
1034 y2star = func(p2star)
1036 if (
present(history)) history_tmp(ineval) = min( y2star, history_tmp(ineval-1) )
1040 if ( y(ihi) < y2star )
then
1043 p(1:n,j) = min( prange(1:n,2) , max( prange(1:n,1) , ( p(1:n,j) + p(1:n,ilo) ) * 0.5_dp ) )
1044 nelminrange_dp(1:n) = p(1:n,j)
1045 y(j) = func(nelminrange_dp)
1047 if (
present(history)) history_tmp(ineval) = min( y(j), history_tmp(ineval-1) )
1049 ilo = minloc(y(1:n+1), 1)
1057 p(1:n,ihi) = p2star(1:n)
1063 else if ( l == 1 )
then
1066 p2star(1:n) = min( prange(1:n,2) , max( prange(1:n,1) , pbar(1:n) + ccoeff * ( pstar(1:n) - pbar(1:n) ) ) )
1067 y2star = func(p2star)
1069 if (
present(history)) history_tmp(ineval) = min( y2star, history_tmp(ineval-1) )
1073 if ( y2star <= ystar )
then
1074 p(1:n,ihi) = p2star(1:n)
1077 p(1:n,ihi) = pstar(1:n)
1087 if ( y(ihi) < ylo )
then
1094 if ( 0 < jcount ) cycle
1098 if ( ineval <= imaxeval )
then
1100 x = sum( y(1:n+1) ) / dnn
1101 z = sum( ( y(1:n+1) - x )**2 )
1110 nelminrange_dp(1:n) = min( prange(1:n,2) , max( prange(1:n,1) , p(1:n,ilo) ) )
1113 if ( imaxeval < ineval )
then
1121 del = istep(i) * eps
1123 nelminrange_dp(i) = min( prange(i,2) , max( prange(i,1) , nelminrange_dp(i) + del ) )
1124 z = func(nelminrange_dp)
1126 if (
present(history)) history_tmp(ineval) = min( z, history_tmp(ineval-1) )
1127 if ( z < ifuncmin )
then
1132 nelminrange_dp(i) = min( prange(i,2) , max( prange(i,1) , nelminrange_dp(i) - del - del ) )
1133 z = func(nelminrange_dp)
1135 if (
present(history)) history_tmp(ineval) = min( z, history_tmp(ineval-1) )
1136 if ( z < ifuncmin )
then
1141 nelminrange_dp(i) = min( prange(i,2) , max( prange(i,1) , nelminrange_dp(i) + del ) )
1144 if ( iierror == 0 )
exit
1149 ipstart(1:n) = min( prange(1:n,2) , max( prange(1:n,1) , nelminrange_dp(1:n) ) )
1151 inumrestart = inumrestart + 1
1155 if (
present(funcmin))
then
1158 if (
present(neval))
then
1161 if (
present(numrestart))
then
1162 numrestart = inumrestart
1164 if (
present(ierror))
then
1167 if (
present(history))
then
1168 allocate(history(ineval))
1169 history(:) = history_tmp(1:ineval)
1172 end function nelminrange_dp
1174 function nelminrange_sp(func, pstart, prange, varmin, step, konvge, maxeval, &
1175 funcmin, neval, numrestart, ierror, history)
1183 REAL(
sp),
DIMENSION(:),
INTENT(IN) :: pp
1187 real(sp),
intent(IN) :: pstart(:)
1188 real(sp),
intent(IN) :: prange(:,:)
1189 real(sp),
optional,
intent(IN) :: varmin
1190 real(sp),
optional,
intent(IN) :: step(:)
1191 integer(i4),
optional,
intent(IN) :: konvge
1192 integer(i4),
optional,
intent(IN) :: maxeval
1193 real(sp),
optional,
intent(OUT) :: funcmin
1194 integer(i4),
optional,
intent(OUT) :: neval
1195 integer(i4),
optional,
intent(OUT) :: numrestart
1196 integer(i4),
optional,
intent(OUT) :: ierror
1197 real(sp),
optional,
intent(OUT),
allocatable :: history(:)
1198 real(sp) :: nelminrange_sp(size(pstart))
1200 real(sp),
parameter :: ccoeff = 0.5_sp
1201 real(sp),
parameter :: ecoeff = 2.0_sp
1202 real(sp),
parameter :: rcoeff = 1.0_sp
1203 real(sp),
parameter :: eps = 0.001_sp
1204 real(sp) :: ipstart(size(pstart))
1205 real(sp) :: ifuncmin
1207 real(sp) :: istep(size(pstart))
1208 integer(i4) :: ikonvge
1209 integer(i4) :: imaxeval
1210 integer(i4) :: ineval
1211 integer(i4) :: inumrestart
1212 integer(i4) :: iierror
1213 integer(i4) :: n, nn
1218 integer(i4) :: jcount
1221 real(sp) :: p(size(pstart),size(pstart)+1)
1222 real(sp) :: p2star(size(pstart))
1223 real(sp) :: pbar(size(pstart))
1224 real(sp) :: pstar(size(pstart))
1227 real(sp) :: y(size(pstart)+1)
1233 real(sp) :: p0(size(pstart)), y0
1234 real(sp),
allocatable :: history_tmp(:)
1238 nelminrange_sp(:) = 0.5_sp * ( prange(:,1) + prange(:,2) )
1240 if (
present(varmin))
then
1241 if (varmin <= 0.0_sp) stop
'Error nelmin: varmin<0'
1247 if (
present(maxeval))
then
1248 if (maxeval <= 1) stop
'Error nelmin: maxeval<=1'
1254 if (
present(history))
then
1256 allocate(history_tmp(imaxeval+3*
size(ipstart)+1))
1258 if (
present(konvge))
then
1261 ikonvge = imaxeval / 10
1263 if (ikonvge < 1) stop
'Error nelmin: konvg<1'
1265 if (
present(step))
then
1269 do i=1,
size(pstart)
1271 if (
ne(p0(i),0.0_sp))
then
1273 p0(i) = min( prange(i,2) , max( prange(i,1) , 1.01_sp*p0(i) ) )
1276 p0(i) = min( prange(i,2) , max( prange(i,1) , 0.01_sp ) )
1278 istep(i) = abs(func(p0) - y0)
1284 if (
size(prange,2) .ne. 2_i4) stop
'nelminrange_sp: range has to be array of size (:,2)'
1285 if (
size(prange,1) .ne.
size(ipstart)) stop
'nelminrange_sp: range has to be given for each dimension'
1286 if (.not. (all(prange(:,1) .le. pstart(:)) .and. all(prange(:,2) .ge. pstart(:)) ))
then
1287 stop
'nelminrange_sp: starting point is not in range'
1306 p(1:n,nn) = ipstart(1:n)
1307 y(nn) = func(ipstart)
1309 if (
present(history)) history_tmp(ineval) = y(nn)
1316 ipstart(j) = min( prange(j,2) , max( prange(j,1) , ipstart(j) + istep(j) * del ) )
1317 p(1:n,j) = ipstart(1:n)
1318 y(j) = func(ipstart)
1321 if (
present(history)) history_tmp(ineval) = min( y(j), history_tmp(ineval-1) )
1327 ilo = minloc(y(1:n+1), 1)
1332 do while ( ineval < imaxeval )
1336 ihi = maxloc(y(1:n+1), 1)
1343 pbar(i) = ( sum(p(i,1:n+1)) - p(i,ihi) ) / dn
1349 pstar(1:n) = min( prange(1:n,2) , max( prange(1:n,1) , pbar(1:n) + rcoeff * ( pbar(1:n) - p(1:n,ihi) ) ) )
1352 if (
present(history)) history_tmp(ineval) = min( ystar, history_tmp(ineval-1) )
1356 if ( ystar < ylo )
then
1359 p2star(1:n) = min( prange(1:n,2) , max( prange(1:n,1) , pbar(1:n) + ecoeff * ( pstar(1:n) - pbar(1:n) ) ) )
1360 y2star = func(p2star)
1362 if (
present(history)) history_tmp(ineval) = min( y2star, history_tmp(ineval-1) )
1366 if ( ystar < y2star )
then
1367 p(1:n,ihi) = pstar(1:n)
1370 p(1:n,ihi) = p2star(1:n)
1379 if ( ystar < y(i) ) l = l + 1
1383 p(1:n,ihi) = pstar(1:n)
1388 else if ( l == 0 )
then
1390 p2star(1:n) = min( prange(1:n,2) , max( prange(1:n,1) , pbar(1:n) + ccoeff * ( p(1:n,ihi) - pbar(1:n) ) ) )
1391 y2star = func(p2star)
1393 if (
present(history)) history_tmp(ineval) = min( y2star, history_tmp(ineval-1) )
1397 if ( y(ihi) < y2star )
then
1400 p(1:n,j) = min( prange(1:n,2) , max( prange(1:n,1) , ( p(1:n,j) + p(1:n,ilo) ) * 0.5_sp ) )
1401 nelminrange_sp(1:n) = p(1:n,j)
1402 y(j) = func(nelminrange_sp)
1404 if (
present(history)) history_tmp(ineval) = min( y(j), history_tmp(ineval-1) )
1406 ilo = minloc(y(1:n+1), 1)
1414 p(1:n,ihi) = p2star(1:n)
1420 else if ( l == 1 )
then
1423 p2star(1:n) = min( prange(1:n,2) , max( prange(1:n,1) , pbar(1:n) + ccoeff * ( pstar(1:n) - pbar(1:n) ) ) )
1424 y2star = func(p2star)
1426 if (
present(history)) history_tmp(ineval) = min( y2star, history_tmp(ineval-1) )
1430 if ( y2star <= ystar )
then
1431 p(1:n,ihi) = p2star(1:n)
1434 p(1:n,ihi) = pstar(1:n)
1444 if ( y(ihi) < ylo )
then
1451 if ( 0 < jcount ) cycle
1455 if ( ineval <= imaxeval )
then
1457 x = sum( y(1:n+1) ) / dnn
1458 z = sum( ( y(1:n+1) - x )**2 )
1467 nelminrange_sp(1:n) = min( prange(1:n,2) , max( prange(1:n,1) , p(1:n,ilo) ) )
1470 if ( imaxeval < ineval )
then
1478 del = istep(i) * eps
1480 nelminrange_sp(i) = min( prange(i,2) , max( prange(i,1) , nelminrange_sp(i) + del ) )
1481 z = func(nelminrange_sp)
1483 if (
present(history)) history_tmp(ineval) = min( z, history_tmp(ineval-1) )
1484 if ( z < ifuncmin )
then
1489 nelminrange_sp(i) = min( prange(i,2) , max( prange(i,1) , nelminrange_sp(i) - del - del ) )
1490 z = func(nelminrange_sp)
1492 if (
present(history)) history_tmp(ineval) = min( z, history_tmp(ineval-1) )
1493 if ( z < ifuncmin )
then
1498 nelminrange_sp(i) = min( prange(i,2) , max( prange(i,1) , nelminrange_sp(i) + del ) )
1501 if ( iierror == 0 )
exit
1506 ipstart(1:n) = min( prange(1:n,2) , max( prange(1:n,1) , nelminrange_sp(1:n) ) )
1508 inumrestart = inumrestart + 1
1512 if (
present(funcmin))
then
1515 if (
present(neval))
then
1518 if (
present(numrestart))
then
1519 numrestart = inumrestart
1521 if (
present(ierror))
then
1524 if (
present(history))
then
1525 allocate(history(ineval))
1526 history(:) = history_tmp(1:ineval)
1529 end function nelminrange_sp
Minimizes a user-specified function using the Nelder-Mead algorithm.
Comparison of real values for inequality.
Define number representations.
integer, parameter sp
Single Precision Real Kind.
integer, parameter i4
4 Byte Integer Kind
integer, parameter dp
Double Precision Real Kind.
real(dp) function, dimension(size(pstart)), public nelmin(func, pstart, varmin, step, konvge, maxeval, funcmin, neval, numrestart, ierror, history)
Minimizes a user-specified function using the Nelder-Mead algorithm.
real(dp) function, dimension(size(pstart)), public nelminxy(func, pstart, xx, yy, varmin, step, konvge, maxeval, funcmin, neval, numrestart, ierror, history)
Minimizes a user-specified function using the Nelder-Mead algorithm.
General utilities for the CHS library.