Changeset 2758
- Timestamp:
- Mar 21, 2017 3:34:22 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASIIpwd.py
r2757 r2758 1914 1914 1915 1915 def REFDRefine(Profile,ProfDict,Inst,Limits,Substances,data): 1916 print 'fit REFD data '1916 print 'fit REFD data by '+data['Minimizer'] 1917 1917 1918 1918 def GetModelParms(): … … 1920 1920 varyList = [] 1921 1921 values = [] 1922 bounds = [] 1922 1923 for parm in ['Scale','FltBack']: 1923 1924 parmDict[parm] = data[parm][0] … … 1925 1926 varyList.append(parm) 1926 1927 values.append(data[parm][0]) 1928 bounds.append(Bounds[parm]) 1927 1929 parmDict['nLayers'] = len(data['Layers']) 1928 1930 for ilay,layer in enumerate(data['Layers']): … … 1934 1936 varyList.append(cid+parm) 1935 1937 values.append(layer[parm][0]) 1938 bounds.append(Bounds[parm]) 1936 1939 parmDict[cid+'rho'] = Substances[name]['Scatt density'] 1937 1940 parmDict[cid+'irho'] = Substances[name].get('XImag density',0.) 1938 return parmDict,varyList,values 1941 return parmDict,varyList,values,bounds 1939 1942 1940 1943 def SetModelParms(): … … 1970 1973 return M 1971 1974 1975 def sumREFD(values,Q,Io,wt,parmDict,varyList): 1976 parmDict.update(zip(varyList,values)) 1977 M = np.sqrt(wt)*(getREFD(Q,parmDict)-Io) 1978 return np.sum(M**2) 1979 1972 1980 def getREFD(Q,parmDict): 1973 1981 Ic = np.ones_like(Q)*parmDict['FltBack'] … … 1995 2003 Ifin = np.searchsorted(Q,Qmax)+1 #include last point 1996 2004 Ic[:] = 0 1997 parmDict,varyList,values = GetModelParms() 2005 Bounds = {'Scale':[data['Scale'][0]*.85,data['Scale'][0]/.85],'FltBack':[None,None],'DenMul':[0.,None],'Thick':[1.,None],'Rough':[0.,None]} 2006 parmDict,varyList,values,bounds = GetModelParms() 2007 Msg = 'Failed to converge' 1998 2008 if varyList: 1999 result = so.leastsq(calcREFD,values,full_output=True,epsfcn=1.e-8, #ftol=Ftol, 2000 args=(Q[Ibeg:Ifin],Io[Ibeg:Ifin],wtFactor*wt[Ibeg:Ifin],parmDict,varyList)) 2001 parmDict.update(zip(varyList,result[0])) 2002 chisq = np.sum(result[2]['fvec']**2) 2003 ncalc = result[2]['nfev'] 2004 covM = result[1] 2009 if data['Minimizer'] == 'LMLS': 2010 result = so.leastsq(calcREFD,values,full_output=True,epsfcn=1.e-8, #ftol=Ftol, 2011 args=(Q[Ibeg:Ifin],Io[Ibeg:Ifin],wtFactor*wt[Ibeg:Ifin],parmDict,varyList)) 2012 parmDict.update(zip(varyList,result[0])) 2013 chisq = np.sum(result[2]['fvec']**2) 2014 ncalc = result[2]['nfev'] 2015 covM = result[1] 2016 newVals = result[0] 2017 elif data['Minimizer'] == 'Global': 2018 result = so.basinhopping(sumREFD,values,minimizer_kwargs={'method':'L-BFGS-B', 2019 'args':(Q[Ibeg:Ifin],Io[Ibeg:Ifin],wtFactor*wt[Ibeg:Ifin],parmDict,varyList)}) 2020 chisq = result.fun 2021 ncalc = result.nfev 2022 newVals = result.x 2023 covM = [] 2024 elif data['Minimizer'] == 'L-BFGS-B': 2025 result = so.minimize(sumREFD,values,method='L-BFGS-B',bounds=bounds, #ftol=Ftol, 2026 args=(Q[Ibeg:Ifin],Io[Ibeg:Ifin],wtFactor*wt[Ibeg:Ifin],parmDict,varyList)) 2027 parmDict.update(zip(varyList,result['x'])) 2028 chisq = result.fun 2029 ncalc = result.nfev 2030 newVals = result.x 2031 covM = [] 2005 2032 else: #nothing varied 2006 2033 M = calcREFD(values,Q[Ibeg:Ifin],Io[Ibeg:Ifin],wtFactor*wt[Ibeg:Ifin],parmDict,varyList) … … 2016 2043 Ic[Ibeg:Ifin] = getREFD(Q[Ibeg:Ifin],parmDict) 2017 2044 Ib[Ibeg:Ifin] = parmDict['FltBack'] 2018 Msg = 'Failed to converge'2019 2045 try: 2020 Nans = np.isnan(result[0]) 2046 if not len(varyList): 2047 Msg += ' - nothing refined' 2048 raise ValueError 2049 Nans = np.isnan(newVals) 2021 2050 if np.any(Nans): 2022 2051 name = varyList[Nans.nonzero(True)[0]] 2023 2052 Msg += ' Nan result for '+name+'!' 2024 2053 raise ValueError 2025 Negs = np.less_equal( result[0],0.)2054 Negs = np.less_equal(newVals,0.) 2026 2055 if np.any(Negs): 2027 2056 indx = Negs.nonzero() … … 2032 2061 if len(covM): 2033 2062 sig = np.sqrt(np.diag(covM)*Rvals['GOF']) 2034 sigDict = dict(zip(varyList,sig)) 2063 covMatrix = covM*Rvals['GOF'] 2064 else: 2065 sig = np.zeros(len(varyList)) 2066 covMatrix = [] 2067 sigDict = dict(zip(varyList,sig)) 2035 2068 print ' Results of reflectometry data modelling fit:' 2036 2069 print 'Number of function calls:',ncalc,' Number of observations: ',Ifin-Ibeg,' Number of parameters: ',len(varyList) 2037 2070 print 'Rwp = %7.2f%%, chi**2 = %12.6g, reduced chi**2 = %6.2f'%(Rvals['Rwp'],chisq,Rvals['GOF']) 2038 2071 SetModelParms() 2039 covMatrix = covM*Rvals['GOF']2040 2072 return True,result,varyList,sig,Rvals,covMatrix,parmDict,'' 2041 2073 except (ValueError,TypeError): #when bad LS refinement; covM missing or with nans -
trunk/GSASIIpwdGUI.py
r2757 r2758 4760 4760 minimiz = wx.BoxSizer(wx.HORIZONTAL) 4761 4761 minimiz.Add(wx.StaticText(G2frame.dataDisplay,label=' Minimizer: '),0,WACV) 4762 minlist = ['LMLS','Global',' BFGS',]4762 minlist = ['LMLS','Global','L-BFGS-B',] 4763 4763 minSel = wx.ComboBox(G2frame.dataDisplay,value=data['Minimizer'],choices=minlist, 4764 4764 style=wx.CB_READONLY|wx.CB_DROPDOWN) … … 4841 4841 if invalid: 4842 4842 return 4843 G2pwd.REFDModelFxn(Profile,Inst,Limits,Substances,data)4844 G2plt.PlotPatterns(G2frame,plotType='REFD')4843 wx.CallAfter(G2pwd.REFDModelFxn,Profile,Inst,Limits,Substances,data) 4844 wx.CallAfter(G2plt.PlotPatterns,G2frame,plotType='REFD') 4845 4845 wx.CallAfter(UpdateREFDModelsGrid,G2frame,data) 4846 4846
Note: See TracChangeset
for help on using the changeset viewer.