¿Existe una fórmula para predecir la temperatura delta basada en la tendencia anterior?

4

Necesito una forma de predecir la curva de temperatura delta según la tendencia anterior. Realizo muchas pruebas de aumento de calor en los conductores eléctricos y me gustaría poder al menos obtener una aproximación de la curva antes de que se haga.

Por ejemplo, si ya tengo los puntos de datos en esta curva antes de la línea. Quiero que pueda predecir el resto después de la línea. No tiene que ser tan preciso. Si estoy dentro del 10%, estaría bien.

ETA:Megustaríaadelantaralgomásdeluzsobreestacuestión.Creoquepartedelproblemaconlacaídaexponencialquenoseajustaamigráficaesqueelambienteaumentóconeltiempo.Veaacontinuaciónqueagreguéambienteamigráficoycreéotroquesoloaumentaconambiente.Hagacasoomisodelagrancaídaenaumentosobreelambientedespuésdequeseestabilizó.Estosdatosprovienendeunapruebaqueserealizóenelexterior,porloqueelvientoyelsololasombrapodríanexplicareso.

Temperaturasdemuestrayambiente Rise over Ambient

    
pregunta TheColonel26

4 respuestas

2

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.

    
respondido por el helloworld922
3

Ya te dieron buenas respuestas, así que no voy a ampliarlas. Solo señalo algo que nadie parece haber mencionado: la extrapolación de un valor de función puede ser riesgosa si no tiene una justificación teórica que garantice que la curva extrapolada sigue el modelo que ha elegido. En otras palabras, debe asegurarse de antemano de que la "forma" de la curva real (aparte del ruido) coincida con la del modelo; de lo contrario, debe verificar que los resultados tengan sentido. Por lo que dice, parece que todos sus sistemas siguen el mismo patrón (algún tipo de circuito equivalente "RC" térmico con una respuesta de aplanamiento exponencial, como la carga de un condensador), por lo que debería estar seguro. Si trata con sistemas / configuraciones de prueba que muestran un patrón diferente, tenga en cuenta que tendrá que cambiar su modelo.

    
respondido por el Lorenzo Donati
1

Pienso que lo que buscas es el algoritmo " Mínimos cuadrados ".

Lo uso en mi biblioteca de Promedio para Arduino para predecir el aumento de temperatura de mi horno de reflujo para tener en cuenta el calor latente de los elementos para que pueda apagarse a tiempo.

Este es un fragmento de esa biblioteca basada en plantillas:

template <class T> void Average<T>::leastSquares(float &m, float &c, float &r) {
    float   sumx = 0.0;                        /* sum of x                      */
    float   sumx2 = 0.0;                       /* sum of x**2                   */
    float   sumxy = 0.0;                       /* sum of x * y                  */
    float   sumy = 0.0;                        /* sum of y                      */
    float   sumy2 = 0.0;                       /* sum of y**2                   */

    for (int i=0;i<_count;i++)   {
        sumx  += i;
        sumx2 += sqr(i);
        sumxy += i * _store[i];
        sumy  += _store[i];
        sumy2 += sqr(_store[i]);
    }

    float denom = (_count * sumx2 - sqr(sumx));
    if (denom == 0) {
        // singular matrix. can't solve the problem.
        m = 0;
        c = 0;
        r = 0;
        return;
    }

    m = 0 - (_count * sumxy  -  sumx * sumy) / denom;
    c = (sumy * sumx2  -  sumx * sumxy) / denom;
    r = (sumxy - sumx * sumy / _count) / sqrt((sumx2 - sqr(sumx)/_count) * (sumy2 - sqr(sumy)/_count));
}

template <class T> T Average<T>::predict(int x) {
    float m, c, r;
    leastSquares(m, c, r); // y = mx + c;

    T y = m * x + c;
    return y;
}

La primera función toma una matriz de datos (en _store []) y calcula la pendiente en la forma y = mx + c. Te da la M y la C (así como la R, pero me olvido de lo que es ahora). La segunda función simplemente usa esa fórmula para predecir cuál será el valor en algún momento en el futuro.

    
respondido por el Majenko
1

Aunque en general estoy de acuerdo con las otras respuestas, los métodos para lograr el resultado son muy complicados. Use la herramienta adecuada para hacer el trabajo, y habrá terminado en unas pocas líneas que se concentran en el trabajo en sí. Por ejemplo gnuplot:

t(x)=a-b*exp(c*x)
a=25
b=30
c=0.00001
fit t(x) "temperature" via a, b, c
plot "temperature", t(x)

Aquí, temperature es un archivo de texto simple que contiene el tiempo y la temperatura en dos columnas.

Los valores iniciales se estiman de la siguiente manera, después del comando fit , contienen los valores calculados finalmente:

a es la temperatura final, cuando el exponencial es = 0 para x grande
b es el cambio total en y
c es solo una conjetura

Como resultado, también obtengo esta impresión:

Final set of parameters            Asymptotic Standard Error
=======================            ==========================

a               = 27.7729          +/- 0.2875       (1.035%)
b               = 30.9734          +/- 0.6285       (2.029%)
c               = -0.000225597     +/- 1.115e-05    (4.941%)

Si solo tomo en cuenta los datos en xrange 0 ... 4500, obtengo:

Final set of parameters            Asymptotic Standard Error
=======================            ==========================

a               = 19.192           +/- 0.4385       (2.285%)
b               = 25.5059          +/- 0.3719       (1.458%)
c               = -0.00051065      +/- 2.074e-05    (4.061%)

Aquí hay una gráfica del resultado. (Utilicé WebPlotDigitizer en enlace para obtener algunos datos de su gráfico)

Comopuedever,lafórmuladadapor@helloworld922seajustamuybienalosdatossiobservaelrangox0...4500solamente(curvaverde).Perodespués,losdatosaumentanaaproximadamente27°C,mientrasquelafórmuladicequelatemperaturafinalesde19°C.

Siutilizalosdatoscompletos,lacurva(azul)seajustaalosdatosgeneralesdealgunamanera,peronodetalladamente,especialmentenoenelrangoderango<4500.

Ladiferenciaenlastemperaturasfinaleses~8.5K.

¿Tienesentido"10%" en una escala celsius?

  

La escala celsius es arbitraria, el origen (0 ° C) no es ningún tipo de "cero" físico. Imagine que hereda una cuenta bancaria y no conoce el saldo inicial, ni obtendrá el saldo real. Entonces, solo dice que lo obtuvo con $ 0.00 y haga un seguimiento de lo que paga y saca. Un día, sabe que debería haber $ 50 más en la cuenta desde que la heredó, otro día, sus $ 100. Entonces, ¿el saldo del segundo día es el doble del saldo del primero? ¿Qué pasa si tu abuela te dejó $ 1,000,000 en esa cuenta, y simplemente no lo sabes?  Finalmente, esto no tiene sentido. Solo si usa la escala de Kelvin, donde 0K es la temperatura física más baja posible, los porcentajes tienen sentido. En este contexto, 8.5K < - > 300K (~ temperatura ambiente) es 2.8% ...

Como se dijo, la fórmula dada no describe muy bien todos los datos, especialmente el procesamiento de la primera parte de los datos no proporciona una buena predicción. Necesita otra fórmula que se ajuste a todo el rango de datos muy bien. Esta sería una fórmula que consiste en más de una función exponencial. (Esto describiría que estás calentando algún material, que en algún momento comienza a disipar el calor en otro lugar)

Pero: Como la fórmula dada describe muy bien la primera parte de los datos, (por lo que no hay ninguna desviación que proporcione más información), una función más compleja no le dará una mejor predicción. .

    
respondido por el sweber

Lea otras preguntas en las etiquetas