PSI - Issue 75

Laurent Gornet et al. / Procedia Structural Integrity 75 (2025) 129–139 Author name / Structural Integrity Procedia (2025)

139 11

loss_data = tf.reduce_mean(tf.square(logS_pred - logS)) loss_val_end = tf.reduce_mean(tf.square(S_end - logS_lim)) loss_tangent_start = tf.reduce_mean(tf.square(dS_dN_start)) loss_tangent_end = tf.reduce_mean(tf.square(dS_dN_end)) # wedges lambda_val_end = 10.0

lambda_tangent_start = 1.0 lambda_tangent_end = 1.0 loss = loss_data \ + lambda_val_end * loss_val_end \

+ lambda_tangent_start * loss_tangent_start \ + lambda_tangent_end * loss_tangent_end grads = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(grads, model.trainable_variables)) loss_history.append(loss.numpy()) # === Predictions === logN_test = np.linspace(0.0, 9.0, 300).reshape(-1, 1) logN_test_norm = (logN_test - logN_min) / (logN_max - logN_min)

S_pred = 10 ** model(logN_test_norm).numpy() S_train_pred = 10 ** model(logN_norm).numpy() rms_error = np.sqrt(np.mean((S_train_pred - S) ** 2)) # === Loss === plt.figure()

plt.plot(loss_history) plt.xlabel("Epoch") plt.ylabel("Loss") plt.title("training convergence") plt.grid(True) plt.show() # === Courbe S-N === plt.figure() plt.semilogx(N, S, 'ro', label='Experimentale Data') plt.semilogx(10**logN_test.flatten(), S_pred.flatten(), 'g-', label='Prédiction PINN') plt.xlim(left=1) plt.ylim(bottom=0) plt.xlabel("Number of cycles (N)") plt.ylabel("Stress (MPa)") plt.title("S-N curve with horizontal tangents (start & limit of fatigue)") plt.grid(True, which='both', ls='--') plt.show() print(f" Erreur RMS on data : {rms_error:.2f} MPa")

Made with FlippingBook flipbook maker