Skip to content

Commit 3e8074c

Browse files
committed
use derivatives for alp, bet & sig Calibrate
1 parent 3f1087c commit 3e8074c

File tree

1 file changed

+66
-7
lines changed

1 file changed

+66
-7
lines changed

GSASII/GSASIIpwd.py

Lines changed: 66 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2422,6 +2422,12 @@ def errPeakPos(values,peakDsp,peakPos,peakWt,dataType,parmDict,varyList):
24222422
else:
24232423
return peakWt*(calcPos-peakPos)
24242424

2425+
def dervPeakPos(values,peakDsp,peakPos,peakWt,dataType,parmDict,varyList):
2426+
dMdv = np.zeros(shape=(len(varyList),len(peakDsp)))
2427+
calcPos = G2lat.getPeakPos(dataType,parmDict,peakDsp)
2428+
if dataType[2] in ['A','B','C']:
2429+
const = 0.18/(np.pi*parmDict['radius'])
2430+
24252431
def errPeakAlp(values,peakDsp,peakAlp,peakWt,dataType,parmDict,varyList):
24262432
parmDict.update(dict(zip(varyList,values)))
24272433
if dataType[2] in ['A','B']:
@@ -2431,6 +2437,19 @@ def errPeakAlp(values,peakDsp,peakAlp,peakWt,dataType,parmDict,varyList):
24312437
calcAlp = parmDict['alpha']/peakDsp
24322438
return peakWt*(calcAlp-peakAlp)
24332439

2440+
def dervPeakAlp(values,peakDsp,peakAlp,peakWt,dataType,parmDict,varyList):
2441+
dMdv = np.zeros(shape=(len(varyList),len(peakDsp)))
2442+
if dataType[2] in ['A','B']:
2443+
calcPos = G2lat.getPeakPos(dataType,parmDict,peakDsp)
2444+
for iv,vary in enumerate(varyList):
2445+
if vary == 'alpha':
2446+
dMdv[iv,:] = 1.0/peakDsp
2447+
if vary == 'alpha-0':
2448+
dMdv[iv,:] = 1.0
2449+
if vary == 'alpha-1':
2450+
dMdv[iv,:] = npsind(calcPos/2.)
2451+
return np.sqrt(peakWt)*dMdv
2452+
24342453
def errPeakBet(values,peakDsp,peakBet,peakWt,dataType,parmDict,varyList):
24352454
parmDict.update(dict(zip(varyList,values)))
24362455
if dataType[2] in ['A','B']:
@@ -2439,6 +2458,22 @@ def errPeakBet(values,peakDsp,peakBet,peakWt,dataType,parmDict,varyList):
24392458
else: #'T'
24402459
calcBet = parmDict['beta-0']+parmDict['beta-1']/peakDsp**4+parmDict['beta-q']/peakDsp**2
24412460
return peakWt*(calcBet-peakBet)
2461+
2462+
def dervPeakBet(values,peakDsp,peakBet,peakWt,dataType,parmDict,varyList):
2463+
dMdv = np.zeros(shape=(len(varyList),len(peakDsp)))
2464+
if dataType[2] in ['A','B']:
2465+
calcPos = G2lat.getPeakPos(dataType,parmDict,peakDsp)
2466+
for iv,vary in enumerate(varyList):
2467+
if vary == 'beta-0':
2468+
dMdv[iv,:] = 1.0
2469+
if vary == 'beta-1':
2470+
if dataType[2] in ['A','B']:
2471+
dMdv[iv,:] = npsind(calcPos/2.)
2472+
else:
2473+
dMdv[iv,:] = 1.0/peakDsp**4
2474+
if vary == 'beta-q':
2475+
dMdv[iv,:] = 1.0/peakDsp**2
2476+
return np.sqrt(peakWt)*dMdv
24422477

24432478
def errPeakSig(values,peakDsp,peakSig,peakWt,dataType,parmDict,varyList):
24442479
parmDict.update(dict(zip(varyList,values)))
@@ -2450,6 +2485,30 @@ def errPeakSig(values,peakDsp,peakSig,peakWt,dataType,parmDict,varyList):
24502485
calcSig = parmDict['sig-0']+parmDict['sig-1']*peakDsp**2+parmDict['sig-2']*peakDsp**4+parmDict['sig-q']*peakDsp
24512486
return peakWt*(calcSig-peakSig)
24522487

2488+
def dervPeakSig(values,peakDsp,peakSig,peakWt,dataType,parmDict,varyList):
2489+
dMdv = np.zeros(shape=(len(varyList),len(peakDsp)))
2490+
if dataType[2] in ['A','B','C']:
2491+
calcPos = G2lat.getPeakPos(dataType,parmDict,peakDsp)
2492+
tp = nptand(calcPos/2.0)
2493+
for iv,vary in enumerate(varyList):
2494+
if vary == 'U':
2495+
dMdv[iv,:] = tp**2
2496+
if vary == 'V':
2497+
dMdv[iv,:] = tp
2498+
if vary == 'W':
2499+
dMdv[iv,:] = 1.
2500+
else:
2501+
for iv,vary in enumerate(varyList):
2502+
if vary == 'sig-0':
2503+
dMdv[iv,:] = 1.0
2504+
if vary == 'sig-1':
2505+
dMdv[iv,:] = peakDsp**2
2506+
if vary == 'sig-2':
2507+
dMdv[iv,:] = peakDsp**4
2508+
if vary == 'sig-q':
2509+
dMdv[iv,:] = peakDsp
2510+
return np.sqrt(peakWt)*dMdv
2511+
24532512
def outResult():
24542513
chisq = np.sum(result[2]['fvec']**2)
24552514
GOF = chisq/(len(peakPos)-len(posVary)) #reduced chi^2
@@ -2480,7 +2539,7 @@ def outResult():
24802539
parmDict.update(posDict)
24812540
if len(peakPos) > 5 and len(posVary):
24822541
values = np.array(Dict2Values(parmDict, posVary))
2483-
result = so.leastsq(errPeakPos,values,full_output=True,ftol=0.000001,
2542+
result = so.leastsq(errPeakPos,values,Dfun=None,full_output=True,ftol=0.000001,
24842543
args=(peakDsp,peakPos,peakPosWt,dataType,parmDict,posVary))
24852544
G2fil.G2Print('Position calibration:')
24862545
Values2Dict(parmDict, posVary, result[0])
@@ -2492,8 +2551,8 @@ def outResult():
24922551
parmDict.update(sigDict)
24932552
if len(peakSig) > 5 and len(sigVary):
24942553
values = np.array(Dict2Values(parmDict, sigVary))
2495-
result = so.leastsq(errPeakSig,values,full_output=True,ftol=0.000001,
2496-
args=(sigDsp,peakSig,peakSigWt,dataType,parmDict,sigVary))
2554+
result = so.leastsq(errPeakSig,values,Dfun=dervPeakSig,full_output=True,ftol=0.000001,
2555+
col_deriv=True,args=(sigDsp,peakSig,peakSigWt,dataType,parmDict,sigVary))
24972556
G2fil.G2Print('Sigma calibration:')
24982557
Values2Dict(parmDict, sigVary, result[0])
24992558
sig = outResult()
@@ -2507,8 +2566,8 @@ def outResult():
25072566
parmDict.update(alpDict)
25082567
if len(peakAlp) > 5 and len(alpVary):
25092568
values = np.array(Dict2Values(parmDict, alpVary))
2510-
result = so.leastsq(errPeakAlp,values,full_output=True,ftol=0.000001,
2511-
args=(alpDsp,peakAlp,peakAlpWt,dataType,parmDict,alpVary))
2569+
result = so.leastsq(errPeakAlp,values,Dfun=dervPeakAlp,full_output=True,ftol=0.000001,
2570+
col_deriv=True,args=(alpDsp,peakAlp,peakAlpWt,dataType,parmDict,alpVary))
25122571
G2fil.G2Print('Alpha calibration:')
25132572
Values2Dict(parmDict, alpVary, result[0])
25142573
sig = outResult()
@@ -2521,8 +2580,8 @@ def outResult():
25212580
parmDict.update(betDict)
25222581
if len(peakBet) > 5 and len(betVary):
25232582
values = np.array(Dict2Values(parmDict, betVary))
2524-
result = so.leastsq(errPeakBet,values,full_output=True,ftol=0.000001,
2525-
args=(betDsp,peakBet,peakBetWt,dataType,parmDict,betVary))
2583+
result = so.leastsq(errPeakBet,values,Dfun=dervPeakBet,full_output=True,ftol=0.000001,
2584+
col_deriv=True,args=(betDsp,peakBet,peakBetWt,dataType,parmDict,betVary))
25262585
G2fil.G2Print('Beta calibration:')
25272586
Values2Dict(parmDict, betVary, result[0])
25282587
sig = outResult()

0 commit comments

Comments
 (0)