Source code for mooonpy.fitting.hyperbolic

# -*- coding: utf-8 -*-
from mooonpy.fitting.fitting import CurveFit
import numpy as np
from mooonpy.tools.math_utils import hyperbola, gaussian_turn, gaussian_quad_turn


[docs] class HyperbolaFit(CurveFit): def __init__(self, x, y, name=None, function=hyperbola, ic=None, limits=None): super().__init__(x, y, name, function, ic, limits)
[docs] def guess_ic(self,guess=None): if self.function is hyperbola: slope_guess = (self.y[-1] - self.y[0]) / (self.x[-1] - self.x[0]) if 'X0' not in self.ic: self.ic['X0'] = np.mean(self.x) if 'Y0' not in self.ic: self.ic['Y0'] = np.mean(self.y) if 'a' not in self.ic: self.ic['a'] = slope_guess if 'b' not in self.ic: self.ic['b'] = slope_guess if 'c' not in self.ic: self.ic['c'] = abs(self.x[-1] - self.x[0]) / 10 else: raise Exception('Model not guessable')
[docs] def guess_limit(self): slope_guess = (self.y[-1] - self.y[0]) / (self.x[-1] - self.x[0]) if 'X0' not in self.limits: self.limits['X0'] = (min(self.x), max(self.x)) if 'Y0' not in self.limits: self.limits['Y0'] = (min(self.y), max(self.y)) if 'a' not in self.limits: self.limits['a'] = (-10 * abs(slope_guess), 10 * abs(slope_guess)) if 'b' not in self.limits: self.limits['b'] = (-10 * abs(slope_guess), 10 * abs(slope_guess)) if 'c' not in self.limits: if 'c' in self.ic: ic = float(self.ic['c']) else: ic = abs(self.x[-1] - self.x[0]) / 10 self.limits['c'] = (0.1 * ic, 10 * ic)
[docs] class GaussianTurnFit(CurveFit): def __init__(self, x, y, name=None, function=gaussian_turn, ic=None, limits=None): super().__init__(x, y, name, function, ic, limits)
[docs] def guess_ic(self,guess=None): slope_guess = (self.y[-1] - self.y[0]) / (self.x[-1] - self.x[0]) if 'X0' not in self.ic: self.ic['X0'] = np.mean(self.x) if 'Y0' not in self.ic: self.ic['Y0'] = np.mean(self.y) if 'a' not in self.ic: self.ic['a'] = slope_guess if 'b' not in self.ic: self.ic['b'] = slope_guess if 's' not in self.ic: self.ic['s'] = abs(self.x[-1] - self.x[0]) / 10 if self.function is gaussian_quad_turn: if 'c' not in self.ic: self.ic['c'] = 0.0 if 'd' not in self.ic: self.ic['d'] = 0.0
[docs] def guess_limit(self): slope_guess = (self.y[-1] - self.y[0]) / (self.x[-1] - self.x[0]) if 'X0' not in self.limits: self.limits['X0'] = (min(self.x), max(self.x)) if 'Y0' not in self.limits: self.limits['Y0'] = (min(self.y), max(self.y)) if 'a' not in self.limits: self.limits['a'] = (-10 * abs(slope_guess), 10 * abs(slope_guess)) if 'b' not in self.limits: self.limits['b'] = (-10 * abs(slope_guess), 10 * abs(slope_guess)) if 's' not in self.limits: if 's' in self.ic: ic = float(self.ic['s']) else: ic = abs(self.x[-1] - self.x[0]) / 10 self.limits['s'] = (0.1 * ic, 100 * ic) if self.function is gaussian_quad_turn: quad_limit = slope_guess / np.mean(self.limits['X0']) if 'c' not in self.limits: self.limits['c'] = (-quad_limit,quad_limit) if 'd' not in self.limits: self.limits['d'] = (-quad_limit,quad_limit)