t0-method.py (825B)
1 #!/usr/bin/env python3.9 2 3 import numpy as np 4 import sympy as sp 5 6 def design_matrix(model, x_data, p0, var_str): 7 var = sp.Matrix(sp.symbols(var_str)) 8 x = symbols("x") 9 10 A = sp.Matrix(model(x, *var)).jacobian(var) 11 A = A.subs({var[i]: p0[i] for i in range(len(p0))}) 12 13 return np.array([np.array([A.subs({x: x_data[i]]})) for i in range(len(s))]) 14 15 def cov_syst(model, x_data, p0, cov_relsyst) 16 return cov_relsyst @ model(x_data, *p0) @ model(x_data, *p0).T 17 18 19 def t0_fit(model, var_str, x_data, y_data, p0, cov_stat, cov_relsyst, iterations=100): 20 21 A = design_matrix(model, x_data, p0, var_str) 22 23 for i in range(iterations): 24 P = np.linalg.inv(cov_syst(model, x_data, p0, cov_relsyst) + cov_stat) 25 p0 = (A.T @ P @ A).inv() @ A.T @ P @ y 26 27 dp = (A.T@P@A).inv()**(1/2) 28 29 return p0, dp