# -*- coding: utf-8 -*-
"""
Created on Tue Jan 30 17:28:54 2024

@author: abrunon
"""

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

#Données d'entrée
epaisseur = 1.63
largeur = 23
L0 = 63

section = epaisseur * largeur

# Spécifiez le chemin vers votre fichier texte
chemin_fichier = 'force_deplacement_aorte_2.txt'

# Charger les données à partir du fichier texte dans un tableau
donnees_tableau = np.loadtxt(chemin_fichier)

# Afficher le tableau de données
print("Tableau de données :\n", donnees_tableau)
depl = donnees_tableau[:,0]
force = donnees_tableau[:,1]

# Allongement
allong = (L0+depl)/L0

# Contrainte ing
stress_ing = force/section

# Contrainte Cauchy
cauchy=stress_ing* (allong**2)

# Définir la fonction que vous souhaitez ajuster

#def fonction_a_ajuster(x, a, b, c):
#    return a* x**2 + b * x + c

#def fonction_a_ajuster(x, C10):
#    return 2 * C10 * (x**2 - 1 / x)               

def I1(x):
    return x**2+(2/x)

def I2(x):
    return 2*x+(1/x**2)

def W1(x,C10,C20):
    return C10+2*C20*(I1(x)-3)

def W2(x,C10,C20):
    return 0   

def W3(xC10,C20):
    return 0    

# Contrainte de Cauchy, calculée à partir de PK2
def fonction_a_ajuster(x, C10,C20):
    return 2*(x**2)*(W1(x,C10,C20)+W2(x,C10,C20)*I1(x)-W2(x,C10,C20)*(x**2)+W3(xC10,C20)/(x**2))  

# Générer des données expérimentales avec du bruit simulé
#np.random.seed(0)
#x_data = np.linspace(0, 2*np.pi, 100)
#y_data_exp = 2 * np.sin(3 * x_data) + 1 + np.random.normal(scale=0.5, size=len(x_data))

#x_data = donnees_tableau[:,0]
#y_data_exp = donnees_tableau[:,1]

x_data = allong
y_data_exp = cauchy

# Utiliser curve_fit pour ajuster la fonction aux données expérimentales
#initial_guess = [1, 2, 1]  # Vous devez fournir une estimation initiale des paramètres
initial_guess = [1,1]
parametres_optimaux, covariance = curve_fit(fonction_a_ajuster, x_data, y_data_exp, p0=initial_guess)

# Générer des données à l'aide des paramètres optimaux trouvés
y_data_fit = fonction_a_ajuster(x_data, *parametres_optimaux)


# Afficher les résultats
plt.scatter(x_data, y_data_exp, label='Données expérimentales')
plt.plot(x_data, y_data_fit, label='Ajustement de fonction', color='red')
plt.legend()
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Ajustement de fonction aux données expérimentales')
plt.show()

# Afficher les paramètres optimaux trouvés
print("Paramètres optimaux de la fonction :", parametres_optimaux)
