Constrained Optimization in Engineering Design
Свайпніть щоб показати меню
Constrained optimization is a cornerstone of engineering design. In real-world projects, you often need to find the best design — such as the lightest, strongest, or most cost-effective option — while satisfying multiple requirements. These requirements, called constraints, might specify maximum allowable stress, minimum safety factors, or limits on displacement and cost. The objective is what you want to optimize, such as minimizing weight or maximizing efficiency. Engineering design is rarely about finding a single "best" answer; instead, it involves balancing trade-offs between competing objectives and constraints to arrive at a practical, feasible solution.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546# Minimize the weight of a rectangular beam subject to strength and deflection constraints # Objective: Minimize weight = density * length * width * height density <- 7850 # kg/m^3 (steel) length <- 2 # meters g <- 9.81 # m/s^2 (gravity) max_stress <- 250e6 # Pa (maximum allowable stress) max_deflection <- 0.005 # meters # Applied load at center (simply supported beam) load <- 10000 # Newtons # Objective function: weight as a function of width and height weight_fn <- function(x) { width <- x[1] height <- x[2] return(density * length * width * height * g) } # Constraint functions constraint_fn <- function(x) { width <- x[1] height <- x[2] # Stress constraint: M = F*L/4, sigma = M*c/I M <- load * length / 4 I <- (width * height^3) / 12 c <- height / 2 stress <- M * c / I # Deflection constraint: delta = F*L^3/(48*E*I) E <- 200e9 # Pa (Young's modulus for steel) deflection <- load * length^3 / (48 * E * I) # Return constraints: negative if satisfied return(c(stress - max_stress, deflection - max_deflection)) } # Penalty function to handle constraints penalized_weight <- function(x) { penalty <- sum(pmax(constraint_fn(x), 0)) * 1e10 return(weight_fn(x) + penalty) } # Initial guess: width=0.05m, height=0.10m result <- optim(c(0.05, 0.10), penalized_weight, method="L-BFGS-B", lower=c(0.01, 0.01), upper=c(0.2, 0.4)) cat("Optimal width (m):", result$par[1], "\n") cat("Optimal height (m):", result$par[2], "\n") cat("Minimum weight (N):", weight_fn(result$par), "\n")
After running an optimization like this, you need to interpret the results carefully. R's optim function provides the values of the design variables that minimize the objective, but you must check if all constraints are satisfied. If a solution slightly violates a constraint, engineering judgment is needed: should you accept a marginal violation, adjust the penalty, or reconsider the design? Constraint handling is often managed using penalty methods, where violations add a large cost to the objective. Always verify that the optimized design is practical and safe, considering factors beyond the mathematical model, such as manufacturability or unexpected loading. Good engineering decisions blend computational results with professional experience.
1234567891011121314151617# Visualizing feasible vs. infeasible design regions for the beam example library(ggplot2) # Create a grid of width and height values widths <- seq(0.01, 0.2, length.out=50) heights <- seq(0.01, 0.4, length.out=50) grid <- expand.grid(width=widths, height=heights) # Check constraints at each grid point feasible <- apply(grid, 1, function(x) all(constraint_fn(x) <= 0)) grid$feasible <- feasible ggplot(grid, aes(x=width, y=height, fill=feasible)) + geom_tile() + scale_fill_manual(values=c("red", "green"), labels=c("Infeasible", "Feasible")) + labs(title="Feasible vs. Infeasible Regions", x="Width (m)", y="Height (m)", fill="Region")
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат