Como dijo Majenko, el ajuste de curvas utilizando los cuadrados mínimos es una solución adecuada. Sin embargo, debe elegir una función adecuada para encajar. Un ajuste de línea directa no es apropiado aquí para las predicciones a largo plazo, pero es lo suficientemente bueno para las predicciones a corto plazo.
Una función más apropiada es una función de decaimiento exponencial:
\ begin {align *}
T = a - b e ^ {- c t}
\ end {align *}
Esta es una función no lineal y, por lo tanto, requiere algún tipo de proceso iterativo para obtener los parámetros de ajuste a, b y c. Sin embargo, no es demasiado difícil de hacer. La idea básica es utilizar un algoritmo de búsqueda de raíz Newton-Raphson junto con un algoritmo de mínimos cuadrados. Por suerte, hay varias implementaciones preexistentes. Si está interesado en aprender la derivación matemática, vea aquí ( aunque se pone bastante técnico).
Aquí hay una implementación que utiliza Función lesssq de Scipy . Utilizo una matriz jacobiana explícita porque, por alguna razón, el jacobiano estimado arroja resultados descontrolados.
import numpy as np
from scipy.optimize import leastsq
def exp_decay(args, t):
'''
args: list-like with the 3 curve fitting parameters a,b,c
t: times
'''
a,b,c = args
return a - b*np.exp(-c*t)
def jac(args, T, t):
a,b,c=args
res = np.zeros([3,len(t)])
res[0,:] = -1
res[1,:] = np.exp(-c*t)
res[2,:] = -b*t*np.exp(-c*t)
return res
def find_coeffs(T, t):
'''
helper for finding the fitting coefficients
'''
resid = lambda args,T,t: T-exp_decay(args, t)
return leastsq(resid, np.array([1,1,1e-9]), args=(T,t), Dfun=jac, col_deriv=True)[0]
# some dummy data to demonstrate usage
T = np.array([-5,0,5,7,9,12.5,15,17])
t = np.array([1,500,935,1402,1869,2803,3737,4600])
coeffs = find_coeffs(T,t)
# plot the results to show the fit
t_p = np.linspace(1,25000,25000)
from matplotlib.pyplot import *
plot(t_p, exp_decay(coeffs, t_p), label='exponential decay fit')
plot(t,T,'o')
grid(True)
show()
Para demostrar por qué es importante usar una función apropiada, extraje algunos puntos de datos aproximados de su gráfica (marcados en verde en la gráfica) y les coloco una línea y la función de caída exponencial. Como puede ver, un ajuste de línea obtiene la respuesta más o menos correcta por un período de tiempo muy corto, pero se desvía mucho en tiempos más largos. El ajuste de caída exponencial está mucho más cerca, y agregar más puntos de datos daría una mejor respuesta final.