from scipy.optimize import minimize
import math
C_PM = 7    # FV-kostnad
C_CM = 35   # KV-kostnad
C_P = 2     # Kroneverdi per nedtime
MDT = 8     # Forventet antal timer nede
C_T = 10    # Kroneverdi ved svikt, uavhengig av varighet
P = 0.25    # Sannsynlighet for at svikt gir "stop"
MTTF = 175  # Midlere tid til svikt, dvs i tusen km
alpha = 3   # Aldringsparameter

C_F = C_CM + P*(C_P*MDT + C_T)

def lambdaE(tau,MTTF,alpha):  
    return math.gamma(1 / alpha + 1) ** alpha * tau** (alpha - 1) / MTTF ** alpha 

tau = MTTF / math.gamma(1 + 1 / alpha) * \
        (C_PM / (C_F * (alpha - 1))) ** (1 / alpha)

print("Optimal tau, analytical:",tau)


def obj(tau,MTTF , alpha , C_PM , C_F): # Objective function, i.e., cost function
    return C_PM/tau+lambdaE(tau,MTTF,alpha)*C_F

x0=MTTF/2 # Initial guess for the solution

result = minimize(obj, x0, args = (MTTF,alpha,C_PM,C_F)) #scipy.optimize routine
print("Optimal tau with scipy.optimize:",result.x[0])
print("Minimum value with scipy.optimize:",result.fun)
