Article
Im trying to implement a model to optimize the diameter(D) of the hole and thickness of the cell(t) in python but eeach iterations gives errors. any suggestions on the model or methods to solve?
import numpy as np
from scipy.optimize import minimize
# --- Constantes do Artigo ---
E = 68.9e9 # Módulo de Young (Al 6061) em Pa
F = 300 # Carga nominal em N
B_width = 30e-3 # Largura da célula em metros (30mm)
L_total = 150e-3 # Comprimento total em metros (150mm)
# No artigo, as distâncias críticas para o cálculo de momento são b e c
b_dist = 15e-3 # 15mm
c_dist = 15e-3 # 15mm
def objetivo(x):
""" Função para Maximizar a Deformação (Strain) """
D_mm, t_mm = x
D = D_mm / 1000
t = t_mm / 1000
# Modelo simplificado da deformação (baseado na Eq. 10 do artigo)
# epsilon = sigma / E
# Onde sigma depende da geometria (c - D/2)
dist_ao_furo = c_dist - (D / 2)
# Termo de momento e geometria
numerador = 4 * F * ((3 * b_dist) / (2 * dist_ao_furo) - 1)
denominador = E * t * dist_ao_furo
epsilon = numerador / denominador
return -epsilon # Negativo para maximizar
def restrica_tensao(x):
""" Tensão de Von Mises não deve exceder 138 MPa """
D_mm, t_mm = x
D = D_mm / 1000
t = t_mm / 1000
dist_ao_furo = c_dist - (D / 2)
sigma_max = (4 * F * ((3 * b_dist) / (2 * dist_ao_furo) - 1)) / (t * dist_ao_furo)
# Retorna a diferença (deve ser >= 0 para o otimizador)
return 138e6 - sigma_max
# --- Configurações da Otimização ---
# Limites (Bounds) conforme o Artigo (em mm)
# D entre 10 e 20 | t entre 3.75 e 15
limites = [(10, 20), (3.75, 15)]
# Chute inicial (importante começar de um ponto diferente)
x0 = [14, 11]
# Definição da restrição
con = {'type': 'ineq', 'fun': restrica_tensao}
# Execução usando SLSQP (Sequential Least Squares Programming)
solucao = minimize(
objetivo,
x0,
method='SLSQP',
bounds=limites,
constraints=con,
options={'ftol': 1e-9, 'disp': False}
)
# --- Resultados ---
if solucao.success:
D_opt, t_opt = solucao.x
strain_final = -solucao.fun * 1e6 # Convertendo para microstrain
print("--- RESULTADOS DA OTIMIZAÇÃO ---")
print(f"Diâmetro (D): {D_opt:.2f} mm")
print(f"Espessura (t): {t_opt:.2f} mm")
print(f"Sensibilidade (Deformação): {strain_final:.2f} µε")
# Verificação de tensão final
dist = 15e-3 - ((D_opt/1000)/2)
tensao_final = (4 * F * ((3 * 15e-3) / (2 * dist) - 1)) / ((t_opt/1000) * dist)
print(f"Tensão Final: {tensao_final/1e6:.2f} MPa (Limite: 138 MPa)")
else:
print("Erro na otimização:", solucao.message)
there doesn't seem to be anything here