Source code for jldesmear.jl_api.extrap_powerlaw

#!/usr/bin/env python

'''
Extrapolate as:  I(q) = A * q^p
'''


import extrapolation
import toolbox
import math
import pprint
import os       #@UnusedImport
import numpy    #@UnusedImport


[docs]class Extrapolation(extrapolation.Extrapolation): '''I(q) = A * q^p''' name = 'powerlaw' def __init__(self): '''set up things''' self.coefficients = {'A': 0, 'p': 0} def __str__(self): ''':return: a text string showing the functional form''' #return "power law: I(q) = A * q^p" form = "power law: I(q) = " + str(self.coefficients['A']) form += " * q^(" + str(self.coefficients['p']) + ")" return form
[docs] def calc(self, q): ''' .. math:: I(q) = A \ q^p :param float q: magnitude of scattering vector :return: value of extrapolation function at *q* :rtype: float ''' A = self.coefficients['A'] p = self.coefficients['p'] if isinstance(q, numpy.ndarray): expo = p * numpy.ones_like(q) basis = numpy.power(q, expo) else: basis = math.pow(q, p) result = A * basis return result
[docs] def fit_add(self, reg, x, y, z): ''' Add a data point to the statistics registers. Called from :meth:`fit_loop()`. :note: *might* override in subclass :param reg: statistics registers (created in :meth:`fit()`) :type reg: StatsRegClass object :param float x: independent axis :param float y: dependent axis :param float z: estimated uncertainty of y ''' #reg.AddWeighted(x, y, z) reg.Add(math.log(x), math.log(y))
[docs] def fit_result(self, reg): ''' Determine the results of the fit and store them as the set of coefficients in the self.coefficients dictionary. Called from :meth:`fit()`. :note: *must* override in subclass otherwise :meth:`fit_result()` will throw an exception :param reg: statistics registers (created in :meth:`fit()`) :type reg: StatsRegClass object ''' (lnA, p) = reg.LinearRegression() self.coefficients['A'] = math.exp(lnA) self.coefficients['p'] = p
if __name__ == "__main__": '''show the various routines''' print("Testing $Id$") func = Extrapolation print("using default coefficients") fit = func() print(fit.show().strip()) print("I(%g) = %g" % (0.001, fit.calc(0.001))) print("I(%g) = %g" % (0.02, fit.calc(0.02))) pprint.pprint(fit.GetCoefficients()) print("#--------------------------") print("setting coefficients") fit.SetCoefficients({'A': 2650, 'p': -.55}) print(fit.show().strip()) print("I(%g) = %g" % (0.001, fit.calc(0.001))) print("I(%g) = %g" % (0.02, fit.calc(0.02))) pprint.pprint(fit.GetCoefficients()) print("#--------------------------") print("fitting coefficients") fn = toolbox.GetTest1DataFilename('.smr') x, y, dy = toolbox.GetDat( fn ) fit = func() fit.fit(x, y, dy) print(fit.show().strip()) print("I(%g) = %g" % (x[0], fit.calc(x[0]))) print("I(%g) = %g" % (x[-1], fit.calc(x[-1]))) pprint.pprint(fit.GetCoefficients())