设计一个0-1之间的有很多局域最小值的快速震荡函数
FVAL = cos(100*3.1415926535*xval(1))/(1+scale*(xval(1)-0.55)**2)
scale是一个放大参数,scale越大,最小值与其它极值点差异越大
代码:
program main
implicit none
integer,parameter :: NER=kind(0.0d0)
integer :: NPAR=1,IFLAG
real(NER) :: XVAL(1)=0.500000,GRAD(1)=0
real(NER) :: FVAL
integer :: errflag,ivarbl
real :: argmn(5)=0
integer :: nn
real(NER) :: step=0.001_NER
real(NER) :: limit=0.0_NER,limit1=0.0,limit2=1.0
character(len=5) :: paraname(1)
external futil
external fcn
external MNINIT, MNEXCM, MNPARM, MNSETI, MNPOUT
call fcn(NPAR, GRAD, FVAL, XVAL, IFLAG, FUTIL)
paraname(1)= "para1"
call MNINIT (5, 6, 7)
call MNSETI ('FCN')
argmn(1) = -1.0_NER
call MNEXCM (FCN, 'SET PRINTOUT', argmn, 1, errflag, FUTIL)
CALL MNPARM(1,paraname(1),xval(1),step,limit1,limit2,errflag)
argmn(1) = 2.
call MNEXCM (FCN, 'SET STRATEGY', argmn, 1, errflag, FUTIL)
argmn(1) = 100000.
argmn(2) = 0.001
call MNEXCM(fcn, 'migrad',argmn,2,errflag,futil)
argmn(1) = 1000000.
call MNEXCM(fcn, 'improve',argmn,1,errflag,futil)
end program
function FUTIL()
integer futil
futil = 1
write(*,*) "hello world"
end function
subroutine fcn(NPAR, GRAD, FVAL, XVAL, IFLAG, FUTIL)
integer,parameter :: NER=kind(0.0D0)
integer, intent(in) :: NPAR, IFLAG
real(NER), intent(in) :: XVAL(1:NPAR)
real(NER), intent(out) :: FVAL
real(NER), intent(out) :: GRAD(1:NPAR)
integer :: scale = 20000
external :: FUTIL
if(xval(1)<=1.0 .and. xval(1)>0.0) then
FVAL = cos(100*3.1415926535*xval(1))/(1+scale*(xval(1)-0.55)**2)
else
fval =1
end if
print*,"XVAL: ",xval(1)," FVAL: ",fval
end subroutine
运行结果如下,成功找到最小值点0.55
XVAL: 0.50000000000000000 FVAL: 1.9607833970753514E-002
**********
** 1 **SET PRINTOUT 0.1587-313
**********
PARAMETER DEFINITIONS:
NO. NAME VALUE STEP SIZE LIMITS
1 'para1 ' 0.50000 0.10000E-02 0.0000 1.0000
**********
** 2 **SET STRATEGY 0.5305-314
**********
**********
** 3 **MIGRAD 0.7703E-26 0.000
**********
XVAL: 0.50000000000000000 FVAL: 1.9607833970753514E-002
XVAL: 0.50001000000696405 FVAL: 1.9615428588068692E-002
XVAL: 0.49998999999303595 FVAL: 1.9600050324587299E-002
XVAL: 0.31247240058968401 FVAL: -6.3150158445647933E-004
XVAL: 0.38955528565784270 FVAL: -1.9196591888349791E-003
XVAL: 0.35752386430665556 FVAL: 9.6016976640166780E-004
XVAL: 0.99586100702573488 FVAL: 6.7192160995500531E-005
XVAL: 0.78999910445346644 FVAL: -8.6730920852707812E-004
XVAL: 0.56478195138379472 FVAL: 1.2745559692366321E-002
XVAL: 0.47680903093615801 FVAL: 4.9771636683686926E-003
XVAL: 0.43292163144366919 FVAL: -2.2079883619285450E-003
XVAL: 0.46721284268659191 FVAL: -4.6390212924105247E-003
XVAL: 0.46731262818000863 FVAL: -4.8226003476060314E-003
XVAL: 0.46711305850466328 FVAL: -4.4517603069725272E-003
XVAL: 0.46724883567244496 FVAL: -4.7056741382685008E-003
XVAL: 0.46717684987137420 FVAL: -4.5718893726272736E-003
XVAL: 0.49038385354493741 FVAL: -1.3772385763266325E-002
XVAL: 0.48191657713136388 FVAL: 8.7948583902536168E-003
XVAL: 0.60555290644860427 FVAL: -2.7555036501283078E-003
XVAL: 0.53481623094724329 FVAL: -1.0283036798199207E-002
XVAL: 0.50699213850467006 FVAL: -1.5418088047477192E-002
XVAL: 0.50702839753009599 FVAL: -1.5685815259360688E-002
X