本文整理汇总了Python中diffpy.srfit.fitbase.FitContribution.registerStringFunction方法的典型用法代码示例。如果您正苦于以下问题:Python FitContribution.registerStringFunction方法的具体用法?Python FitContribution.registerStringFunction怎么用?Python FitContribution.registerStringFunction使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类diffpy.srfit.fitbase.FitContribution
的用法示例。
在下文中一共展示了FitContribution.registerStringFunction方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: _makeRecipe
# 需要导入模块: from diffpy.srfit.fitbase import FitContribution [as 别名]
# 或者: from diffpy.srfit.fitbase.FitContribution import registerStringFunction [as 别名]
def _makeRecipe(self, x, y, dy):
'''Make a FitRecipe for fitting a Gaussian curve to data.
'''
profile = Profile()
profile.setObservedProfile(x, y, dy)
contribution = FitContribution("g1")
contribution.setProfile(profile, xname="x")
contribution.registerStringFunction(
'1/sqrt(2 * pi * sig**2)', name='gaussnorm')
contribution.setEquation(
"A * gaussnorm * exp(-0.5 * (x - x0)**2/sig**2)")
recipe = FitRecipe()
recipe.addContribution(contribution)
recipe.addVar(contribution.A)
recipe.addVar(contribution.x0)
recipe.addVar(contribution.sig)
recipe.clearFitHooks()
self.recipe = recipe
return
示例2: makeRecipe
# 需要导入模块: from diffpy.srfit.fitbase import FitContribution [as 别名]
# 或者: from diffpy.srfit.fitbase.FitContribution import registerStringFunction [as 别名]
def makeRecipe(strufile, datname):
"""Create a recipe that uses the IntensityGenerator.
This will create a FitContribution that uses the IntensityGenerator,
associate this with a Profile, and use this to define a FitRecipe.
"""
## The Profile
# Create a Profile. This will hold the experimental and calculated signal.
profile = Profile()
# Load data and add it to the profile
x, y, u = profile.loadtxt(datname)
## The ProfileGenerator
# Create an IntensityGenerator named "I". This will be the name we use to
# refer to the generator from within the FitContribution equation. We also
# need to load the model structure we're using.
generator = IntensityGenerator("I")
generator.setStructure(strufile)
## The FitContribution
# Create a FitContribution, that will associate the Profile with the
# ProfileGenerator. The ProfileGenerator will be accessible as an
# attribute of the FitContribution by its name ("I"). We also want to tell
# the FitContribution to name the x-variable of the profile "q", so we can
# use it in equations with this name.
contribution = FitContribution("bucky")
contribution.addProfileGenerator(generator)
contribution.setProfile(profile, xname = "q")
# Now we're ready to define the fitting equation for the FitContribution.
# We need to modify the intensity calculation, and we'll do that from
# within the fitting equation for the sake of instruction. We want to
# modify the calculation in three ways. We want to scale it, add a
# polynomial background, and broaden the peaks.
#
# There is added benefit for defining these operations outside of the
# IntensityGenerator. By combining the different parts of the calculation
# within the fitting equation, the time-consuming iofq calculation is only
# performed when a structural Parameter is changed. If only non-structural
# parameters are changed, such as the background and broadening Parameters,
# then then previously computed iofq value will be used to compute the
# contribution equation. The benefit in this is very apparent when
# refining the recipe with the LM optimizer, which only changes two
# variables at a time most of the time. Note in the refinement output how
# many times the residual is calculated, versus how many times iofq is
# called when using the scipyOptimize function.
# We will define the background as a string.
bkgdstr = "b0 + b1*q + b2*q**2 + b3*q**3 + b4*q**4 + b5*q**5 + b6*q**6 +\
b7*q**7 + b8*q**8 + b9*q**9"
# This creates a callable equation named "bkgd" within the FitContribution,
# and turns the polynomial coefficients into Parameters.
eq = contribution.registerStringFunction(bkgdstr, "bkgd")
# We will create the broadening function that we need by creating a python
# function and registering it with the FitContribution.
pi = numpy.pi
exp = numpy.exp
def gaussian(q, q0, width):
return 1/(2*pi*width**2)**0.5 * exp(-0.5 * ((q-q0)/width)**2)
# This registers the python function and extracts the name and creates
# Parameters from the arguments.
contribution.registerFunction(gaussian)
# Center the Gaussian so it is not truncated.
contribution.q0.value = x[len(x)/2]
# Now we can incorporate the scale and bkgd into our calculation. We also
# convolve the signal with the Gaussian to broaden it. Recall that we don't
# need to supply arguments to the registered functions unless we want to
# make changes to their input values.
contribution.setEquation("scale * convolve(I, gaussian) + bkgd")
# Make the FitRecipe and add the FitContribution.
recipe = FitRecipe()
recipe.addContribution(contribution)
# Specify which parameters we want to refine.
recipe.addVar(contribution.b0, 0)
recipe.addVar(contribution.b1, 0)
recipe.addVar(contribution.b2, 0)
recipe.addVar(contribution.b3, 0)
recipe.addVar(contribution.b4, 0)
recipe.addVar(contribution.b5, 0)
recipe.addVar(contribution.b6, 0)
recipe.addVar(contribution.b7, 0)
recipe.addVar(contribution.b8, 0)
recipe.addVar(contribution.b9, 0)
# We also want to adjust the scale and the convolution width
recipe.addVar(contribution.scale, 1)
recipe.addVar(contribution.width, 0.1)
# We can also refine structural parameters. Here we extract the
#.........这里部分代码省略.........
示例3: makeRecipe
# 需要导入模块: from diffpy.srfit.fitbase import FitContribution [as 别名]
# 或者: from diffpy.srfit.fitbase.FitContribution import registerStringFunction [as 别名]
def makeRecipe():
"""Make a FitRecipe for fitting three double-gaussian curves to data.
The separation and amplitude ratio of the double peaks follows a specific
relationship. The peaks are broadend according to their position and they
sit on top of a background. We are seeking the absolute locations of the
peaks as well as their amplitudes.
The independent variable is t. The relationship between the double
peaks is
sin(t2) / l2 = sin(t1) / l1
amplitude(peak2) = r * amplitude(peak1)
The values of l1, l2 and r come from experiment. For this example, we
use l1 = 1.012, l2 = 1.0 and r = 0.23.
"""
## The Profile
# Create a Profile to hold the experimental and calculated signal.
profile = Profile()
x, y, dy = profile.loadtxt("data/threedoublepeaks.dat")
# Create the contribution
contribution = FitContribution("peaks")
contribution.setProfile(profile, xname = "t")
pi = numpy.pi
exp = numpy.exp
# This is a building-block of our profile function
def gaussian(t, mu, sig):
return 1/(2*pi*sig**2)**0.5 * exp(-0.5 * ((t-mu)/sig)**2)
contribution.registerFunction(gaussian, name = "peakshape")
def delta(t, mu):
"""Calculate a delta-function.
We don't have perfect precision, so we must make this a very thin
Gaussian.
"""
sig = t[1] - t[0]
return gaussian(t, mu, sig)
contribution.registerFunction(delta)
# Here is another one
bkgdstr = "b0 + b1*t + b2*t**2 + b3*t**3 + b4*t**4 + b5*t**5 + b6*t**6"
contribution.registerStringFunction(bkgdstr, "bkgd")
# Now define our fitting equation. We will hardcode the peak ratios.
contribution.setEquation(
"A1 * ( convolve( delta(t, mu11), peakshape(t, c, sig11) ) \
+ 0.23*convolve( delta(t, mu12), peakshape(t, c, sig12) ) ) + \
A2 * ( convolve( delta(t, mu21), peakshape(t, c, sig21) ) \
+ 0.23*convolve( delta(t, mu22), peakshape(t, c, sig22) ) ) + \
A3 * ( convolve( delta(t, mu31), peakshape(t, c, sig31) ) \
+ 0.23*convolve( delta(t, mu32), peakshape(t, c, sig32) ) ) + \
bkgd")
# c is the center of the gaussian.
contribution.c.value = x[len(x)/2]
## The FitRecipe
# The FitRecipe lets us define what we want to fit. It is where we can
# create variables, constraints and restraints.
recipe = FitRecipe()
# Here we tell the FitRecipe to use our FitContribution. When the FitRecipe
# calculates its residual function, it will call on the FitContribution to
# do part of the work.
recipe.addContribution(contribution)
# Vary the amplitudes for each double peak
recipe.addVar(contribution.A1, 100)
recipe.addVar(contribution.A2, 100)
recipe.addVar(contribution.A3, 100)
# Vary the position of the first of the double peaks
recipe.addVar(contribution.mu11, 13.0)
recipe.addVar(contribution.mu21, 24.0)
recipe.addVar(contribution.mu31, 33.0)
# Constrain the position of the second double peak
from numpy import sin, arcsin
def peakloc(mu):
"""Calculate the location of the second peak given the first."""
l1 = 1.012
l2 = 1.0
return 180 / pi * arcsin( pi / 180 * l2 * sin(mu) / l1 )
recipe.registerFunction(peakloc)
recipe.constrain(contribution.mu12, "peakloc(mu11)")
recipe.constrain(contribution.mu22, "peakloc(mu21)")
recipe.constrain(contribution.mu32, "peakloc(mu31)")
# Vary the width of the peaks. We know the functional form of the peak
# broadening.
sig0 = recipe.newVar("sig0", 0.001)
#.........这里部分代码省略.........
示例4: makeRecipe
# 需要导入模块: from diffpy.srfit.fitbase import FitContribution [as 别名]
# 或者: from diffpy.srfit.fitbase.FitContribution import registerStringFunction [as 别名]
def makeRecipe(strufile, datname1, datname2):
"""Create a recipe that uses the IntensityGenerator.
We will create two FitContributions that use the IntensityGenerator from
npintensitygenerator.py and associate each of these with a Profile, and use
this to define a FitRecipe.
Both simulated data sets come from the same structure. We're going to make
two FitContributions that are identical, except for the profile that is
held in each. We're going to assure that the structures are identical by
using the same DiffpyStructureParSet (which is generated by the
IntensityGenerator when we load the structure) in both generators.
"""
## The Profiles
# Create two Profiles for the two FitContributions.
profile1 = Profile()
profile2 = Profile()
# Load data into the Profiles
profile1.loadtxt(datname1)
x, y, u = profile2.loadtxt(datname2)
## The ProfileGenerators
# Create two IntensityGenerators named "I". There will not be a name
# conflict, since the name is only meaningful within the FitContribution
# that holds the ProfileGenerator. Load the structure into one and make
# sure that the second ProfileGenerator is using the same
# DiffyStructureParSet. This will assure that both ProfileGenerators are
# using the exact same Parameters, and underlying Structure object in the
# calculation of the profile.
generator1 = IntensityGenerator("I")
generator1.setStructure(strufile)
generator2 = IntensityGenerator("I")
generator2.addParameterSet(generator1.phase)
## The FitContributions
# Create the FitContributions.
contribution1 = FitContribution("bucky1")
contribution1.addProfileGenerator(generator1)
contribution1.setProfile(profile1, xname = "q")
contribution2 = FitContribution("bucky2")
contribution2.addProfileGenerator(generator2)
contribution2.setProfile(profile2, xname = "q")
# Now we're ready to define the fitting equation for each FitContribution.
# The functions registered below will be independent, even though they take
# the same form and use the same Parameter names. By default, Parameters
# in different contributions are different Parameters even if they have the
# same names. FitContributions are isolated namespaces than only share
# information if you tell them to by using addParameter or addParameterSet.
bkgdstr = "b0 + b1*q + b2*q**2 + b3*q**3 + b4*q**4 + b5*q**5 + b6*q**6 +\
b7*q**7 +b8*q**8 + b9*q**9"
contribution1.registerStringFunction(bkgdstr, "bkgd")
contribution2.registerStringFunction(bkgdstr, "bkgd")
# We will create the broadening function by registering a python function.
pi = numpy.pi
exp = numpy.exp
def gaussian(q, q0, width):
return 1/(2*pi*width**2)**0.5 * exp(-0.5 * ((q-q0)/width)**2)
contribution1.registerFunction(gaussian)
contribution2.registerFunction(gaussian)
# Center the gaussian
contribution1.q0.value = x[len(x) // 2]
contribution2.q0.value = x[len(x) // 2]
# Now we can incorporate the scale and bkgd into our calculation. We also
# convolve the signal with the gaussian to broaden it.
contribution1.setEquation("scale * convolve(I, gaussian) + bkgd")
contribution2.setEquation("scale * convolve(I, gaussian) + bkgd")
# Make a FitRecipe and associate the FitContributions.
recipe = FitRecipe()
recipe.addContribution(contribution1)
recipe.addContribution(contribution2)
# Specify which Parameters we want to refine. We want to refine the
# background that we just defined in the FitContributions. We have to do
# this separately for each FitContribution. We tag the variables so it is
# easy to retrieve the background variables.
recipe.addVar(contribution1.b0, 0, name = "b1_0", tag = "bcoeffs1")
recipe.addVar(contribution1.b1, 0, name = "b1_1", tag = "bcoeffs1")
recipe.addVar(contribution1.b2, 0, name = "b1_2", tag = "bcoeffs1")
recipe.addVar(contribution1.b3, 0, name = "b1_3", tag = "bcoeffs1")
recipe.addVar(contribution1.b4, 0, name = "b1_4", tag = "bcoeffs1")
recipe.addVar(contribution1.b5, 0, name = "b1_5", tag = "bcoeffs1")
recipe.addVar(contribution1.b6, 0, name = "b1_6", tag = "bcoeffs1")
recipe.addVar(contribution1.b7, 0, name = "b1_7", tag = "bcoeffs1")
recipe.addVar(contribution1.b8, 0, name = "b1_8", tag = "bcoeffs1")
recipe.addVar(contribution1.b9, 0, name = "b1_9", tag = "bcoeffs1")
recipe.addVar(contribution2.b0, 0, name = "b2_0", tag = "bcoeffs2")
recipe.addVar(contribution2.b1, 0, name = "b2_1", tag = "bcoeffs2")
recipe.addVar(contribution2.b2, 0, name = "b2_2", tag = "bcoeffs2")
recipe.addVar(contribution2.b3, 0, name = "b2_3", tag = "bcoeffs2")
recipe.addVar(contribution2.b4, 0, name = "b2_4", tag = "bcoeffs2")
recipe.addVar(contribution2.b5, 0, name = "b2_5", tag = "bcoeffs2")
#.........这里部分代码省略.........