import fillesing as fl
import scipy.optimize as opt
import numpy as np
import matplotlib.pyplot as plt

#Analytisk løsning med T_s = 22 og T_0 og r som frie parametre
#tar inn en np.array eller enkeltverdi for t, starttemp og varmeovergangskoeff. (r)
#returnerer temperatur etter t minutter, eller np.array som samsvarer med t
def T(t, T_0, r):
    # initial values
    T_s = 22  # (C)

    #equation
    T = T_s + (T_0 - T_s) * np.exp(-r * t)
    return T

def finn_r_T0():
    tid, temp = fl.les_real_cup()

    print('Fitting initial temperature and heat exchange coefficient in analytical model to best '
          'fit experimental data using \nscipy.optimize.curve_fit()')

    T0, r = 90, 0.1  # initial values for solver
    old_T0, old_r = T0 + 1, r + 1

    while abs(T0 - old_T0) > 0.00001 and abs(r - old_r) > 0.0001: #try with updated initial values until they no longer change
        coeff, cov = opt.curve_fit(T, tid, temp, p0=[T0, r])
        old_T0, old_r = T0, r
        T0, r = coeff

    tid_akse = np.linspace(min(tid), max(tid), 1000)

    print('T0 = ', round(T0,2))
    print('r = ', round(r, 3))

    Temp = T(tid_akse, T0, r)
    plt.scatter(tid, temp, label = 'Experimental data')
    plt.plot(tid_akse, Temp, label = 'Best fit analytical solution')

    plt.xlabel('Time [min]')
    plt.ylabel('Temp [°C]')
    plt.legend()

    plt.show()