Skip to main content
Glama

optimize_thrust_profile

Optimize rocket thrust profiles for improved trajectory performance by adjusting thrust segments to meet specific impulse targets and objectives.

Instructions

Optimize rocket thrust profile for better performance using trajectory optimization.

Args: rocket_geometry: Rocket geometry parameters burn_time_s: Burn time in seconds total_impulse_target: Target total impulse in N⋅s n_segments: Number of thrust segments objective: Optimization objective

Returns: JSON string with optimized thrust profile

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
rocket_geometryYes
burn_time_sYes
total_impulse_targetYes
n_segmentsNo
objectiveNomax_altitude

Implementation Reference

  • Import of the optimize_thrust_profile tool handler from tools/optimization.py
    from .tools.optimization import ( genetic_algorithm_optimization, monte_carlo_uncertainty_analysis, optimize_thrust_profile, particle_swarm_optimization, porkchop_plot_analysis, trajectory_sensitivity_analysis, )
  • MCP registration of the optimize_thrust_profile tool handler
    mcp.tool(optimize_thrust_profile)
  • MCP tool handler: wrapper that converts inputs to RocketGeometry, delegates to trajopt implementation, formats results as JSON string
    def optimize_thrust_profile( rocket_geometry: dict, burn_time_s: float, total_impulse_target: float, n_segments: int = 5, objective: Literal[ "max_altitude", "min_max_q", "min_gravity_loss" ] = "max_altitude", ) -> str: """Optimize rocket thrust profile for better performance using trajectory optimization. Args: rocket_geometry: Rocket geometry parameters burn_time_s: Burn time in seconds total_impulse_target: Target total impulse in N⋅s n_segments: Number of thrust segments objective: Optimization objective Returns: JSON string with optimized thrust profile """ try: from ..integrations.trajopt import ( RocketGeometry, ) from ..integrations.trajopt import ( optimize_thrust_profile as _optimize, ) geometry = RocketGeometry(**rocket_geometry) result = _optimize( geometry, burn_time_s, total_impulse_target, n_segments, objective ) return json.dumps( { "optimization_result": result.optimization_result, "optimal_objective": result.optimal_objective, "optimal_parameters": result.optimal_parameters, "performance": { "max_altitude_m": result.performance.max_altitude_m, "max_velocity_ms": result.performance.max_velocity_ms, "total_impulse_ns": result.performance.total_impulse_ns, "apogee_time_s": result.performance.apogee_time_s, }, }, indent=2, ) except ImportError: return "Trajectory optimization not available - install optimization packages" except Exception as e: logger.error(f"Thrust profile optimization error: {str(e)}", exc_info=True) return f"Thrust profile optimization error: {str(e)}"
  • Core helper implementation: optimizes thrust multipliers using simple gradient descent, normalizes thrust curve to target impulse, simulates trajectory with rocket_3dof_trajectory, returns structured TrajectoryOptimizationResult
    def optimize_thrust_profile( geometry: RocketGeometry, burn_time_s: float, total_impulse_target: float, n_segments: int = 5, objective: str = "max_altitude", ) -> TrajectoryOptimizationResult: """ Optimize thrust profile for better performance. Args: geometry: Base rocket geometry burn_time_s: Total burn time total_impulse_target: Target total impulse n_segments: Number of thrust profile segments objective: "max_altitude", "min_max_q", or "min_gravity_loss" Returns: Optimization result """ # Create initial thrust profile (constant thrust) avg_thrust = total_impulse_target / burn_time_s segment_time = burn_time_s / n_segments # Initial parameters: thrust multipliers for each segment initial_multipliers = [1.0] * n_segments multiplier_bounds = [(0.1, 3.0)] * n_segments # 10% to 300% of average def objective_function(multipliers: list[float]) -> float: """Objective function for thrust profile optimization.""" try: # Create thrust curve from multipliers thrust_curve = [] for i, mult in enumerate(multipliers): time_start = i * segment_time time_end = (i + 1) * segment_time thrust_level = avg_thrust * mult thrust_curve.append([time_start, thrust_level]) if i == len(multipliers) - 1: # Last segment thrust_curve.append([time_end, 0.0]) # End thrust # Normalize to maintain total impulse current_impulse = sum( avg_thrust * mult * segment_time for mult in multipliers ) if current_impulse <= 0: return float("inf") scale_factor = total_impulse_target / current_impulse thrust_curve = [[t, thrust * scale_factor] for t, thrust in thrust_curve] # Update geometry with new thrust curve opt_geometry = RocketGeometry( dry_mass_kg=geometry.dry_mass_kg, propellant_mass_kg=geometry.propellant_mass_kg, diameter_m=geometry.diameter_m, length_m=geometry.length_m, cd=geometry.cd, thrust_curve=thrust_curve, ) # Run trajectory simulation with reasonable parameters trajectory = rocket_3dof_trajectory( opt_geometry, dt_s=0.2, max_time_s=150.0 ) if not trajectory: return 1e6 # Large penalty instead of inf performance = analyze_rocket_performance(trajectory) if objective == "max_altitude": # Return negative altitude for minimization, but ensure it's not zero result = -max( 1.0, performance.max_altitude_m ) # At least -1 to avoid zero return result elif objective == "min_max_q": return performance.max_q_pa elif objective == "min_gravity_loss": # Estimate gravity loss (simplified) gravity_loss = 9.80665 * performance.burnout_time_s return gravity_loss else: return 1e6 except Exception: return 1e6 # Large penalty for failed cases # Optimize using gradient descent optimal_multipliers, optimal_value, iterations, converged = simple_gradient_descent( objective_function, initial_multipliers, multiplier_bounds, learning_rate=0.05, tolerance=1e-3, max_iterations=100, ) # Generate final thrust curve and trajectory final_thrust_curve = [] for i, mult in enumerate(optimal_multipliers): time_start = i * segment_time time_end = (i + 1) * segment_time thrust_level = avg_thrust * mult final_thrust_curve.append([time_start, thrust_level]) if i == len(optimal_multipliers) - 1: final_thrust_curve.append([time_end, 0.0]) # Normalize final curve current_impulse = sum( avg_thrust * mult * segment_time for mult in optimal_multipliers ) scale_factor = total_impulse_target / current_impulse final_thrust_curve = [ [t, thrust * scale_factor] for t, thrust in final_thrust_curve ] # Generate final trajectory final_geometry = RocketGeometry( dry_mass_kg=geometry.dry_mass_kg, propellant_mass_kg=geometry.propellant_mass_kg, diameter_m=geometry.diameter_m, length_m=geometry.length_m, cd=geometry.cd, thrust_curve=final_thrust_curve, ) final_trajectory = rocket_3dof_trajectory(final_geometry) final_performance = analyze_rocket_performance(final_trajectory) # Prepare optimal parameters optimal_params = { f"thrust_mult_seg_{i + 1}": mult for i, mult in enumerate(optimal_multipliers) } optimal_params["thrust_curve"] = final_thrust_curve return TrajectoryOptimizationResult( optimal_parameters=optimal_params, optimal_objective=( -optimal_value if objective == "max_altitude" else optimal_value ), iterations=iterations, converged=converged, trajectory_points=final_trajectory, performance=final_performance, )

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/cheesejaguar/aerospace-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server