2022-07-19 17:17:45 +08:00
|
|
|
import numpy as np
|
|
|
|
from astropy.modeling import Fittable1DModel, Fittable2DModel, Parameter
|
|
|
|
|
|
|
|
|
|
|
|
class Linear1D(Fittable1DModel):
|
|
|
|
"""
|
|
|
|
One dimensional Line model.
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
slope : float
|
|
|
|
Slope of the straight line
|
|
|
|
intercept : float
|
|
|
|
Intercept of the straight line
|
|
|
|
"""
|
|
|
|
|
|
|
|
slope = Parameter(default=1, description="Slope of the straight line")
|
|
|
|
intercept = Parameter(default=0, description="Intercept of the straight line")
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def evaluate(x, slope, intercept):
|
|
|
|
return slope * x + intercept
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def fit_deriv(x, slope, intercept):
|
|
|
|
d_slope = x
|
|
|
|
d_intercept = np.ones_like(x)
|
|
|
|
return [d_slope, d_intercept]
|
|
|
|
|
|
|
|
|
|
|
|
class FixedSlopeLine(Fittable1DModel):
|
|
|
|
"""
|
|
|
|
Linear model, but fix the slope
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
slope : float
|
|
|
|
Slope of the line
|
|
|
|
intercept : float
|
|
|
|
Intercept of the line
|
|
|
|
"""
|
|
|
|
|
|
|
|
slope = Parameter()
|
|
|
|
intercept = Parameter()
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def evaluate(x, slope, intercept):
|
|
|
|
return slope * x + intercept
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def fit_deriv(x, slope, intercept):
|
|
|
|
d_slope = np.zeros_like(x)
|
|
|
|
d_intercept = np.ones_like(x)
|
|
|
|
return [d_slope, d_intercept]
|
|
|
|
|
|
|
|
|
|
|
|
class pXLine(Fittable2DModel):
|
|
|
|
"""
|
|
|
|
pX linear model.
|
|
|
|
$Px = \\frac{k_2y - k_1x}{E}L+CL$.
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
L : float
|
|
|
|
Slope of the straight line
|
|
|
|
C : float
|
|
|
|
Intercept / Slope of the straight line
|
|
|
|
"""
|
|
|
|
|
|
|
|
linear = True
|
|
|
|
|
|
|
|
L, C = Parameter(default=40), Parameter(default=0)
|
2022-07-26 17:47:55 +08:00
|
|
|
k1, k2, b = Parameter(), Parameter(), Parameter()
|
2022-07-19 17:17:45 +08:00
|
|
|
|
|
|
|
@staticmethod
|
2022-07-26 17:47:55 +08:00
|
|
|
def evaluate(x, y, L, C, k1, k2, b):
|
|
|
|
E = k1 * x + k2 * y + b
|
2022-07-19 17:17:45 +08:00
|
|
|
return (k2 * y - k1 * x) / E * L + C * L
|
|
|
|
|
|
|
|
@staticmethod
|
2022-07-26 17:47:55 +08:00
|
|
|
def fit_deriv(x, y, L, C, k1, k2, b):
|
|
|
|
E = k1 * x + k2 * y + b
|
2022-07-19 17:17:45 +08:00
|
|
|
d_L = (k2 * y - k1 * x) / E + C
|
|
|
|
d_C = np.full(x.shape, L)
|
2022-07-26 17:47:55 +08:00
|
|
|
d_k1, d_k2, d_b = np.zeros_like(x), np.zeros_like(x), np.zeros_like(x)
|
|
|
|
return [d_L, d_C, d_k1, d_k2, d_b]
|