MINUIT 在 local minimum 面前束手无策

设计一个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) i...
摘要由CSDN通过智能技术生成

设计一个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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值