diff --git a/p1/combined_decision.png b/p1/combined_decision.png index 67197a1..01813f0 100644 Binary files a/p1/combined_decision.png and b/p1/combined_decision.png differ diff --git a/p1/combined_scenario.py b/p1/combined_scenario.py index 9b2952c..6f8ac3f 100644 --- a/p1/combined_scenario.py +++ b/p1/combined_scenario.py @@ -46,8 +46,8 @@ ELEVATOR_SPECIFIC_ENERGY = 157.2e9 # J per metric ton (157.2 MJ/kg * 1000 kg) # ============== 火箭参数 ============== PAYLOAD_PER_LAUNCH = 125 # metric tons per launch -ISP = 450 # 比冲 (秒) -SPECIFIC_FUEL_ENERGY = 15.5e6 # J/kg +ISP = 363 # 比冲 (秒) - 液氧甲烷 (LOX/CH4, Raptor-class) +SPECIFIC_FUEL_ENERGY = 11.9e6 # J/kg ALPHA = 0.10 # 结构系数 NUM_STAGES = 3 DELTA_V_BASE = 13300 # m/s (赤道发射到月球) diff --git a/p1/decision_recommendation.png b/p1/decision_recommendation.png index 0dd6828..dce445a 100644 Binary files a/p1/decision_recommendation.png and b/p1/decision_recommendation.png differ diff --git a/p1/lambda_comprehensive.png b/p1/lambda_comprehensive.png new file mode 100644 index 0000000..c7b020d Binary files /dev/null and b/p1/lambda_comprehensive.png differ diff --git a/p1/lambda_cost_analysis.png b/p1/lambda_cost_analysis.png new file mode 100644 index 0000000..f22ebd9 Binary files /dev/null and b/p1/lambda_cost_analysis.png differ diff --git a/p1/lambda_cost_analysis.py b/p1/lambda_cost_analysis.py new file mode 100644 index 0000000..9233ca0 --- /dev/null +++ b/p1/lambda_cost_analysis.py @@ -0,0 +1,844 @@ +""" +Lambda Time Cost Analysis for Moon Colony Logistics + +This module introduces the time opportunity cost (λ) to find the optimal +operating point on the Energy-Time trade-off curve. + +Objective Function: J = E_total + λ × T +where: + - E_total: Total energy consumption (PJ) + - T: Construction timeline (years) + - λ: Time opportunity cost (PJ/year) + +The optimal point satisfies: dE/dT = -λ (marginal energy saving = time cost) +""" + +import numpy as np +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +from matplotlib import rcParams +import pandas as pd +from typing import Dict, List, Tuple, Optional +from dataclasses import dataclass + +# Font settings +rcParams['font.sans-serif'] = ['Arial Unicode MS', 'DejaVu Sans', 'SimHei'] +rcParams['axes.unicode_minus'] = False + +# ============== Physical Constants ============== +G0 = 9.81 # m/s² +OMEGA_EARTH = 7.27e-5 # rad/s +R_EARTH = 6.371e6 # m + +# Mission parameters +TOTAL_PAYLOAD = 100e6 # 100 million metric tons + +# Space Elevator parameters +NUM_ELEVATORS = 3 +ELEVATOR_CAPACITY_PER_YEAR = 179000 # metric tons per elevator per year +TOTAL_ELEVATOR_CAPACITY = NUM_ELEVATORS * ELEVATOR_CAPACITY_PER_YEAR # 537,000 tons/year +ELEVATOR_SPECIFIC_ENERGY = 157.2e9 # J per metric ton (157.2 MJ/kg × 1000) + +# Rocket parameters - LOX/CH4 (Raptor-class) +PAYLOAD_PER_LAUNCH = 125 # metric tons per launch +ISP = 363 # Specific impulse (s) +SPECIFIC_FUEL_ENERGY = 11.9e6 # J/kg +ALPHA = 0.10 # Structural coefficient +NUM_STAGES = 3 +DELTA_V_BASE = 13300 # m/s (LEO + TLI + LOI) + + +# ============== Launch Site Definition ============== +@dataclass +class LaunchSite: + name: str + short_name: str + latitude: float + max_launches_per_day: int = 1 + + @property + def abs_latitude(self) -> float: + return abs(self.latitude) + + @property + def delta_v_loss(self) -> float: + v_equator = OMEGA_EARTH * R_EARTH + v_site = OMEGA_EARTH * R_EARTH * np.cos(np.radians(self.abs_latitude)) + return v_equator - v_site + + @property + def total_delta_v(self) -> float: + return DELTA_V_BASE + self.delta_v_loss + + +LAUNCH_SITES = sorted([ + LaunchSite("Kourou (French Guiana)", "Kourou", 5.2), + LaunchSite("Satish Dhawan (India)", "SDSC", 13.7), + LaunchSite("Boca Chica (Texas)", "Texas", 26.0), + LaunchSite("Cape Canaveral (Florida)", "Florida", 28.5), + LaunchSite("Vandenberg (California)", "California", 34.7), + LaunchSite("Wallops (Virginia)", "Virginia", 37.8), + LaunchSite("Taiyuan (China)", "Taiyuan", 38.8), + LaunchSite("Mahia (New Zealand)", "Mahia", 39.3), + LaunchSite("Baikonur (Kazakhstan)", "Baikonur", 45.6), + LaunchSite("Kodiak (Alaska)", "Alaska", 57.4), +], key=lambda x: x.abs_latitude) + + +# ============== Core Calculation Functions ============== + +def fuel_ratio_multistage(delta_v: float) -> float: + """Multi-stage rocket fuel/payload ratio""" + ve = ISP * G0 + delta_v_per_stage = delta_v / NUM_STAGES + R_stage = np.exp(delta_v_per_stage / ve) + + denominator = 1 - ALPHA * (R_stage - 1) + if denominator <= 0: + return np.inf + + k_stage = (R_stage - 1) / denominator + + total_fuel_ratio = 0 + remaining_ratio = 1.0 + + for _ in range(NUM_STAGES): + fuel_this_stage = remaining_ratio * k_stage + total_fuel_ratio += fuel_this_stage + remaining_ratio *= (1 + k_stage * (1 + ALPHA)) + + return total_fuel_ratio + + +def rocket_energy_per_ton(site: LaunchSite) -> float: + """Energy consumption per ton of payload for rocket launch (J/ton)""" + k = fuel_ratio_multistage(site.total_delta_v) + fuel_per_ton = k * 1000 # kg fuel per metric ton payload + return fuel_per_ton * SPECIFIC_FUEL_ENERGY + + +def calculate_scenario(completion_years: float) -> Optional[Dict]: + """ + Calculate optimal scenario for given completion timeline + (elevator priority + low-latitude rockets) + """ + # Space elevator transport + elevator_payload = min(TOTAL_ELEVATOR_CAPACITY * completion_years, TOTAL_PAYLOAD) + elevator_energy = elevator_payload * ELEVATOR_SPECIFIC_ENERGY + + # Remaining payload for rockets + remaining_payload = TOTAL_PAYLOAD - elevator_payload + + if remaining_payload <= 0: + return { + 'years': completion_years, + 'elevator_payload': elevator_payload, + 'rocket_payload': 0, + 'elevator_energy_PJ': elevator_energy / 1e15, + 'rocket_energy_PJ': 0, + 'total_energy_PJ': elevator_energy / 1e15, + 'rocket_launches': 0, + 'sites_used': 0, + 'elevator_fraction': 1.0, + } + + # Rocket launches needed + rocket_launches_needed = int(np.ceil(remaining_payload / PAYLOAD_PER_LAUNCH)) + + # Allocate by latitude priority + days_available = completion_years * 365 + max_launches_per_site = int(days_available) + + # Check feasibility + total_rocket_capacity = len(LAUNCH_SITES) * max_launches_per_site * PAYLOAD_PER_LAUNCH + if remaining_payload > total_rocket_capacity: + return None + + rocket_energy = 0 + sites_used = 0 + remaining_launches = rocket_launches_needed + + for site in LAUNCH_SITES: + if remaining_launches <= 0: + break + allocated = min(remaining_launches, max_launches_per_site) + rocket_energy += rocket_energy_per_ton(site) * PAYLOAD_PER_LAUNCH * allocated + remaining_launches -= allocated + if allocated > 0: + sites_used += 1 + + rocket_payload = rocket_launches_needed * PAYLOAD_PER_LAUNCH + total_energy = elevator_energy + rocket_energy + + return { + 'years': completion_years, + 'elevator_payload': elevator_payload, + 'rocket_payload': rocket_payload, + 'elevator_energy_PJ': elevator_energy / 1e15, + 'rocket_energy_PJ': rocket_energy / 1e15, + 'total_energy_PJ': total_energy / 1e15, + 'rocket_launches': rocket_launches_needed, + 'sites_used': sites_used, + 'elevator_fraction': elevator_payload / TOTAL_PAYLOAD, + } + + +# ============== Generate Trade-off Curve ============== + +def generate_tradeoff_curve( + year_min: float = 100, + year_max: float = 250, + num_points: int = 500 +) -> pd.DataFrame: + """Generate Energy-Time trade-off curve data""" + years_range = np.linspace(year_min, year_max, num_points) + + results = [] + for years in years_range: + scenario = calculate_scenario(years) + if scenario is not None: + results.append({ + 'years': years, + 'energy_PJ': scenario['total_energy_PJ'], + 'elevator_fraction': scenario['elevator_fraction'], + 'sites_used': scenario['sites_used'], + 'rocket_launches': scenario['rocket_launches'], + }) + + return pd.DataFrame(results) + + +# ============== Lambda Cost Analysis ============== + +def calculate_total_cost(df: pd.DataFrame, lambda_cost: float) -> np.ndarray: + """ + Calculate total cost J = E + λ × T + + Args: + df: Trade-off curve data + lambda_cost: Time opportunity cost (PJ/year) + + Returns: + Total cost array + """ + return df['energy_PJ'].values + lambda_cost * df['years'].values + + +def find_optimal_point(df: pd.DataFrame, lambda_cost: float) -> Dict: + """ + Find optimal point that minimizes J = E + λ × T + + Args: + df: Trade-off curve data + lambda_cost: Time opportunity cost (PJ/year) + + Returns: + Optimal point information + """ + total_cost = calculate_total_cost(df, lambda_cost) + opt_idx = np.argmin(total_cost) + + return { + 'index': opt_idx, + 'years': df['years'].iloc[opt_idx], + 'energy_PJ': df['energy_PJ'].iloc[opt_idx], + 'total_cost': total_cost[opt_idx], + 'elevator_fraction': df['elevator_fraction'].iloc[opt_idx], + 'lambda': lambda_cost, + } + + +def calculate_marginal_energy_saving(df: pd.DataFrame) -> np.ndarray: + """ + Calculate marginal energy saving rate: -dE/dT (PJ/year) + + This represents how much energy is saved per additional year of timeline. + """ + years = df['years'].values + energy = df['energy_PJ'].values + + # Use central difference for interior points + marginal = -np.gradient(energy, years) + + return marginal + + +def sensitivity_analysis( + df: pd.DataFrame, + lambda_range: np.ndarray +) -> pd.DataFrame: + """ + Perform sensitivity analysis on λ parameter + + Args: + df: Trade-off curve data + lambda_range: Array of λ values to test + + Returns: + DataFrame with optimal points for each λ + """ + results = [] + for lam in lambda_range: + opt = find_optimal_point(df, lam) + results.append({ + 'lambda_PJ_per_year': lam, + 'optimal_years': opt['years'], + 'optimal_energy_PJ': opt['energy_PJ'], + 'total_cost_PJ': opt['total_cost'], + 'elevator_fraction': opt['elevator_fraction'], + }) + + return pd.DataFrame(results) + + +# ============== Visualization Functions ============== + +def plot_lambda_analysis( + df: pd.DataFrame, + save_path: str = '/Volumes/Files/code/mm/20260130_b/p1/lambda_cost_analysis.png' +): + """ + Comprehensive visualization of λ time cost analysis + Focus on critical range λ = 400-600 PJ/year + """ + fig, axes = plt.subplots(2, 2, figsize=(14, 12)) + + years = df['years'].values + energy = df['energy_PJ'].values + + # Key boundaries + T_min = years.min() # ~100.7 years (fastest) + T_elev = TOTAL_PAYLOAD / TOTAL_ELEVATOR_CAPACITY # ~186 years (elevator only) + E_min = energy[years >= T_elev].min() if any(years >= T_elev) else energy.min() + + # ========== Plot 1: Trade-off Curve with λ Iso-cost Lines ========== + ax1 = axes[0, 0] + + # Main curve + ax1.plot(years, energy, 'b-', linewidth=2.5, label='Energy-Time Trade-off') + + # Mark key points + ax1.axvline(x=T_elev, color='green', linestyle='--', alpha=0.7, label=f'Elevator-only: {T_elev:.1f} years') + ax1.axvline(x=T_min, color='red', linestyle='--', alpha=0.7, label=f'Minimum time: {T_min:.1f} years') + + # Draw iso-cost lines for different λ (focus on 400-600 range) + lambda_values = [420, 480, 500, 550] + colors = ['#2ecc71', '#e74c3c', '#9b59b6', '#3498db'] + + for lam, color in zip(lambda_values, colors): + opt = find_optimal_point(df, lam) + # Iso-cost line: E + λT = const → E = const - λT + T_line = np.linspace(80, 220, 100) + E_line = opt['total_cost'] - lam * T_line + valid = (E_line > 0) & (E_line < 70000) + ax1.plot(T_line[valid], E_line[valid], '--', color=color, alpha=0.6, linewidth=1.5) + ax1.plot(opt['years'], opt['energy_PJ'], 'o', color=color, markersize=12, + markeredgecolor='black', markeredgewidth=1.5, + label=f'λ={lam}: T={opt["years"]:.1f}y, E={opt["energy_PJ"]:.0f}PJ') + + ax1.set_xlabel('Construction Timeline T (years)', fontsize=12) + ax1.set_ylabel('Total Energy E (PJ)', fontsize=12) + ax1.set_title('Energy-Time Trade-off with λ Iso-cost Lines (λ=400-600)\n$J = E + λT$', fontsize=13) + ax1.legend(loc='upper right', fontsize=9) + ax1.grid(True, alpha=0.3) + ax1.set_xlim(95, 200) + ax1.set_ylim(10000, 65000) + + # ========== Plot 2: Marginal Energy Saving Rate ========== + ax2 = axes[0, 1] + + marginal = calculate_marginal_energy_saving(df) + + ax2.plot(years, marginal, 'r-', linewidth=2, label='Marginal Energy Saving -dE/dT') + ax2.axhline(y=0, color='black', linestyle='-', alpha=0.3) + + # Mark critical λ values in 400-600 range + for lam, color in zip([450, 480, 500, 550], ['#2ecc71', '#e74c3c', '#9b59b6', '#3498db']): + ax2.axhline(y=lam, color=color, linestyle='--', alpha=0.7, label=f'λ = {lam} PJ/year') + # Find intersection + intersect_idx = np.argmin(np.abs(marginal - lam)) + ax2.plot(years[intersect_idx], marginal[intersect_idx], 'o', color=color, markersize=8) + + ax2.set_xlabel('Construction Timeline T (years)', fontsize=12) + ax2.set_ylabel('Marginal Energy Saving -dE/dT (PJ/year)', fontsize=12) + ax2.set_title('Marginal Analysis: Optimal Condition is -dE/dT = λ', fontsize=13) + ax2.legend(loc='upper right', fontsize=9) + ax2.grid(True, alpha=0.3) + ax2.set_xlim(95, 200) + ax2.set_ylim(350, 620) + + # ========== Plot 3: Sensitivity Analysis (400-600 range) ========== + ax3 = axes[1, 0] + + lambda_range = np.linspace(400, 600, 200) + sensitivity_df = sensitivity_analysis(df, lambda_range) + + # Plot optimal years vs λ + ax3.plot(sensitivity_df['lambda_PJ_per_year'], sensitivity_df['optimal_years'], + 'b-', linewidth=2.5, label='Optimal Timeline T*') + + # Mark key regions + ax3.axhline(y=T_elev, color='green', linestyle='--', alpha=0.7, label=f'Elevator-only: {T_elev:.1f}y') + ax3.axhline(y=T_min, color='red', linestyle='--', alpha=0.7, label=f'Min timeline: {T_min:.1f}y') + ax3.axhline(y=139, color='orange', linestyle=':', linewidth=2, alpha=0.8, label='Original knee: 139y') + + # Find λ corresponding to 139 years + idx_139 = np.argmin(np.abs(sensitivity_df['optimal_years'] - 139)) + if idx_139 < len(sensitivity_df): + lambda_139 = sensitivity_df['lambda_PJ_per_year'].iloc[idx_139] + ax3.axvline(x=lambda_139, color='orange', linestyle=':', linewidth=2, alpha=0.6) + ax3.scatter([lambda_139], [139], s=150, c='orange', marker='*', zorder=5, + edgecolors='black', linewidths=1.5, label=f'λ≈{lambda_139:.0f} for T*=139y') + + # Mark critical transition + ax3.axvline(x=480, color='purple', linestyle='--', alpha=0.5) + ax3.text(482, 175, 'Critical\nTransition', fontsize=9, color='purple') + + ax3.set_xlabel('Time Opportunity Cost λ (PJ/year)', fontsize=12) + ax3.set_ylabel('Optimal Timeline T* (years)', fontsize=12) + ax3.set_title('Sensitivity Analysis: Optimal Timeline vs λ (400-600 range)', fontsize=13) + ax3.legend(loc='upper right', fontsize=9) + ax3.grid(True, alpha=0.3) + ax3.set_xlim(400, 600) + ax3.set_ylim(95, 195) + + # ========== Plot 4: Total Cost Curves (400-600 range) ========== + ax4 = axes[1, 1] + + for lam, color in [(450, '#2ecc71'), (480, '#e74c3c'), (500, '#9b59b6'), (550, '#3498db')]: + total_cost = calculate_total_cost(df, lam) + ax4.plot(years, total_cost / 1000, color=color, linestyle='-', + linewidth=2, label=f'λ={lam} PJ/year') + + # Mark minimum + opt = find_optimal_point(df, lam) + ax4.plot(opt['years'], opt['total_cost'] / 1000, 'o', color=color, markersize=10, + markeredgecolor='black', markeredgewidth=1.5) + + ax4.set_xlabel('Construction Timeline T (years)', fontsize=12) + ax4.set_ylabel('Total Cost J = E + λT (×10³ PJ)', fontsize=12) + ax4.set_title('Total Cost Function for λ = 400-600 PJ/year', fontsize=13) + ax4.legend(loc='upper right', fontsize=10) + ax4.grid(True, alpha=0.3) + ax4.set_xlim(95, 200) + + plt.tight_layout() + plt.savefig(save_path, dpi=150, bbox_inches='tight') + print(f"Lambda analysis plot saved to: {save_path}") + + return fig + + +def plot_decision_recommendation( + df: pd.DataFrame, + save_path: str = '/Volumes/Files/code/mm/20260130_b/p1/lambda_decision_map.png' +): + """ + Decision map showing optimal choice based on λ preference + """ + fig, ax = plt.subplots(figsize=(12, 8)) + + years = df['years'].values + energy = df['energy_PJ'].values + + # Main trade-off curve + ax.plot(years, energy, 'b-', linewidth=3, label='Feasible Trade-off Curve') + + # Key boundaries + T_elev = TOTAL_PAYLOAD / TOTAL_ELEVATOR_CAPACITY + T_min = years.min() + + # Shade decision regions + # Region 1: Low λ (cost priority) → longer timeline + ax.axvspan(160, 190, alpha=0.2, color='green', label='Low λ (<150): Cost Priority') + # Region 2: Medium λ (balanced) → middle ground + ax.axvspan(130, 160, alpha=0.2, color='yellow', label='Medium λ (150-250): Balanced') + # Region 3: High λ (time priority) → shorter timeline + ax.axvspan(100, 130, alpha=0.2, color='red', label='High λ (>250): Time Priority') + + # Mark specific strategy points + strategies = [ + {'name': 'A: Cost-Prioritized', 'years': 186, 'lambda': 0, 'color': 'green'}, + {'name': 'C: Balanced (λ≈200)', 'years': 139, 'lambda': 200, 'color': 'orange'}, + {'name': 'B: Time-Prioritized', 'years': 101, 'lambda': 500, 'color': 'red'}, + ] + + for s in strategies: + idx = np.argmin(np.abs(years - s['years'])) + ax.plot(years[idx], energy[idx], 'o', color=s['color'], markersize=15, + markeredgecolor='black', markeredgewidth=2) + ax.annotate(s['name'], (years[idx], energy[idx]), + textcoords="offset points", xytext=(10, 10), fontsize=11, + fontweight='bold', color=s['color']) + + # Add decision guidance text + textstr = '\n'.join([ + 'Decision Guidance:', + '─────────────────', + 'λ < 150 PJ/year → Strategy A', + ' (Long-term cost efficiency)', + '', + '150 ≤ λ ≤ 250 → Strategy C', + ' (Balanced trade-off)', + '', + 'λ > 250 PJ/year → Strategy B', + ' (Time-critical mission)', + ]) + props = dict(boxstyle='round', facecolor='wheat', alpha=0.8) + ax.text(0.02, 0.98, textstr, transform=ax.transAxes, fontsize=10, + verticalalignment='top', bbox=props, family='monospace') + + ax.set_xlabel('Construction Timeline T (years)', fontsize=13) + ax.set_ylabel('Total Energy E (PJ)', fontsize=13) + ax.set_title('Decision Map: Optimal Strategy Selection Based on Time Opportunity Cost λ', fontsize=14) + ax.legend(loc='upper right', fontsize=10) + ax.grid(True, alpha=0.3) + ax.set_xlim(95, 200) + ax.set_ylim(10000, 65000) + + plt.tight_layout() + plt.savefig(save_path, dpi=150, bbox_inches='tight') + print(f"Decision map saved to: {save_path}") + + return fig + + +# ============== Critical Point Analysis ============== + +def analyze_curve_structure(df: pd.DataFrame) -> Dict: + """ + Analyze the structure of the trade-off curve to understand + why certain λ values lead to specific optimal points. + """ + years = df['years'].values + energy = df['energy_PJ'].values + + # Calculate marginal rates + marginal = -np.gradient(energy, years) + + # Find the elevator-only boundary + T_elev = TOTAL_PAYLOAD / TOTAL_ELEVATOR_CAPACITY + idx_elev = np.argmin(np.abs(years - T_elev)) + + # Analyze marginal rate distribution + # Region 1: T > T_elev (pure elevator, marginal ≈ 0) + # Region 2: T < T_elev (need rockets, marginal > 0) + + # Find critical points where marginal rate changes significantly + marginal_near_elev = marginal[idx_elev - 5:idx_elev + 5] + marginal_at_139 = marginal[np.argmin(np.abs(years - 139))] + marginal_at_101 = marginal[np.argmin(np.abs(years - 101))] + + return { + 'T_elev': T_elev, + 'idx_elev': idx_elev, + 'marginal_at_elev': marginal[idx_elev], + 'marginal_at_139': marginal_at_139, + 'marginal_at_101': marginal_at_101, + 'energy_at_elev': energy[idx_elev], + 'energy_at_139': energy[np.argmin(np.abs(years - 139))], + 'energy_at_101': energy[np.argmin(np.abs(years - 101))], + } + + +def find_critical_lambda(df: pd.DataFrame) -> Dict: + """ + Find the critical λ values where optimal point transitions occur. + """ + years = df['years'].values + energy = df['energy_PJ'].values + + # Dense lambda scan + lambda_range = np.linspace(1, 1000, 2000) + + transitions = [] + prev_years = None + + for lam in lambda_range: + opt = find_optimal_point(df, lam) + if prev_years is not None and abs(opt['years'] - prev_years) > 5: + transitions.append({ + 'lambda': lam, + 'from_years': prev_years, + 'to_years': opt['years'], + }) + prev_years = opt['years'] + + return transitions + + +def plot_comprehensive_analysis( + df: pd.DataFrame, + save_path: str = '/Volumes/Files/code/mm/20260130_b/p1/lambda_comprehensive.png' +): + """ + Comprehensive plot showing: + 1. Trade-off curve with marginal rates + 2. Critical λ transitions + 3. Decision regions + """ + fig = plt.figure(figsize=(16, 14)) + + years = df['years'].values + energy = df['energy_PJ'].values + marginal = calculate_marginal_energy_saving(df) + + T_elev = TOTAL_PAYLOAD / TOTAL_ELEVATOR_CAPACITY + T_min = years.min() + + # ========== Plot 1: Trade-off curve with annotations ========== + ax1 = fig.add_subplot(2, 2, 1) + + ax1.plot(years, energy / 1000, 'b-', linewidth=2.5, label='Trade-off Curve') + + # Mark key points + key_points = [ + (T_min, 'Minimum Time\n(~101 years)', 'red'), + (139, 'Original Knee\n(139 years)', 'orange'), + (T_elev, 'Elevator-Only\n(~186 years)', 'green'), + ] + + for t, label, color in key_points: + idx = np.argmin(np.abs(years - t)) + ax1.plot(years[idx], energy[idx] / 1000, 'o', color=color, markersize=12, + markeredgecolor='black', markeredgewidth=2, zorder=5) + ax1.annotate(label, (years[idx], energy[idx] / 1000), + textcoords="offset points", xytext=(10, 10), fontsize=10, + color=color, fontweight='bold') + + ax1.set_xlabel('Construction Timeline T (years)', fontsize=12) + ax1.set_ylabel('Total Energy E (×10³ PJ)', fontsize=12) + ax1.set_title('Energy-Time Trade-off Curve', fontsize=14) + ax1.grid(True, alpha=0.3) + ax1.set_xlim(95, 200) + ax1.legend(loc='upper right') + + # ========== Plot 2: Marginal Rate Analysis ========== + ax2 = fig.add_subplot(2, 2, 2) + + ax2.plot(years, marginal, 'r-', linewidth=2, label='Marginal Saving Rate') + ax2.fill_between(years, 0, marginal, alpha=0.3, color='red') + + # Mark critical thresholds + ax2.axhline(y=480, color='purple', linestyle='--', linewidth=2, + label='Critical λ ≈ 480 PJ/year') + ax2.axvline(x=T_elev, color='green', linestyle=':', alpha=0.7) + + # Annotate the jump at elevator boundary + ax2.annotate('Marginal rate jumps\nat elevator capacity limit', + xy=(T_elev, marginal[np.argmin(np.abs(years - T_elev))]), + xytext=(150, 400), fontsize=10, + arrowprops=dict(arrowstyle='->', color='black')) + + ax2.set_xlabel('Construction Timeline T (years)', fontsize=12) + ax2.set_ylabel('Marginal Energy Saving -dE/dT (PJ/year)', fontsize=12) + ax2.set_title('Marginal Analysis: Why 186 years is optimal for most λ', fontsize=14) + ax2.grid(True, alpha=0.3) + ax2.set_xlim(95, 200) + ax2.set_ylim(-50, 600) + ax2.legend(loc='upper right') + + # ========== Plot 3: λ Sensitivity with Phase Transitions (400-600 focus) ========== + ax3 = fig.add_subplot(2, 2, 3) + + lambda_range = np.linspace(400, 600, 200) + opt_years = [] + for lam in lambda_range: + opt = find_optimal_point(df, lam) + opt_years.append(opt['years']) + + ax3.plot(lambda_range, opt_years, 'b-', linewidth=2.5) + + # Shade phases + ax3.axhspan(180, 190, alpha=0.3, color='green', label='Phase 1: Elevator-Only (λ < 480)') + ax3.axhspan(100, 145, alpha=0.3, color='red', label='Phase 2: Hybrid (λ > 480)') + + # Mark critical λ + ax3.axvline(x=480, color='purple', linestyle='--', linewidth=2) + ax3.annotate('Critical Transition\nλ ≈ 480 PJ/year', + xy=(480, 160), fontsize=11, color='purple', fontweight='bold', + ha='center') + + # Mark 139 year point + ax3.axhline(y=139, color='orange', linestyle=':', linewidth=2, alpha=0.8) + ax3.scatter([500], [139], s=200, c='orange', marker='*', zorder=5, + edgecolors='black', linewidths=2, label='T*=139y at λ≈500') + + ax3.set_xlabel('Time Opportunity Cost λ (PJ/year)', fontsize=12) + ax3.set_ylabel('Optimal Timeline T* (years)', fontsize=12) + ax3.set_title('Phase Transition in Optimal Strategy (λ=400-600)', fontsize=14) + ax3.grid(True, alpha=0.3) + ax3.set_xlim(400, 600) + ax3.set_ylim(95, 195) + ax3.legend(loc='upper right') + + # ========== Plot 4: Decision Summary Table ========== + ax4 = fig.add_subplot(2, 2, 4) + ax4.axis('off') + + # Create summary table + summary_text = """ + ┌─────────────────────────────────────────────────────────────────┐ + │ KEY FINDINGS FROM λ COST ANALYSIS │ + ├─────────────────────────────────────────────────────────────────┤ + │ │ + │ 1. CURVE STRUCTURE │ + │ • Sharp discontinuity at T = 186 years (elevator capacity) │ + │ • Marginal rate jumps from ~0 to ~480 PJ/year at boundary │ + │ │ + │ 2. OPTIMAL POINT SELECTION │ + │ • λ < 480 PJ/year → T* = 186 years (elevator-only) │ + │ • λ ≈ 500 PJ/year → T* = 139 years (original knee) │ + │ • λ > 600 PJ/year → T* → 101 years (time-priority) │ + │ │ + │ 3. IMPLICATIONS FOR THE 139-YEAR KNEE POINT │ + │ • Requires implicit assumption: λ ≈ 500 PJ/year │ + │ • This means: 1 year delay costs ~500 PJ opportunity cost │ + │ • Equivalent to: ~0.5% of total elevator energy per year │ + │ │ + │ 4. RECOMMENDATION │ + │ • Either justify λ ≈ 500 PJ/year with physical reasoning │ + │ • Or acknowledge 186 years as cost-optimal baseline │ + │ • Present 139 years as a time-constrained scenario │ + │ │ + └─────────────────────────────────────────────────────────────────┘ + """ + + ax4.text(0.05, 0.95, summary_text, transform=ax4.transAxes, + fontsize=11, verticalalignment='top', family='monospace', + bbox=dict(boxstyle='round', facecolor='lightyellow', alpha=0.8)) + + plt.tight_layout() + plt.savefig(save_path, dpi=150, bbox_inches='tight') + print(f"Comprehensive analysis saved to: {save_path}") + + return fig + + +# ============== Main Analysis ============== + +def main(): + print("=" * 70) + print("Lambda Time Cost Analysis for Moon Colony Logistics") + print("=" * 70) + + # Generate trade-off curve + print("\n[1] Generating Energy-Time trade-off curve...") + df = generate_tradeoff_curve(year_min=100, year_max=220, num_points=500) + print(f" Generated {len(df)} data points") + + # Key statistics + T_min = df['years'].min() + T_max = df['years'].max() + E_min = df['energy_PJ'].min() + E_max = df['energy_PJ'].max() + T_elev = TOTAL_PAYLOAD / TOTAL_ELEVATOR_CAPACITY + + print(f"\n[2] Trade-off Curve Statistics:") + print(f" Timeline range: {T_min:.1f} - {T_max:.1f} years") + print(f" Energy range: {E_min:.0f} - {E_max:.0f} PJ") + print(f" Elevator-only timeline: {T_elev:.1f} years") + + # Curve structure analysis + print("\n[3] Curve Structure Analysis:") + structure = analyze_curve_structure(df) + print(f" At elevator boundary (T={structure['T_elev']:.1f}y):") + print(f" - Energy: {structure['energy_at_elev']:.0f} PJ") + print(f" - Marginal rate: {structure['marginal_at_elev']:.1f} PJ/year") + print(f" At T=139 years:") + print(f" - Energy: {structure['energy_at_139']:.0f} PJ") + print(f" - Marginal rate: {structure['marginal_at_139']:.1f} PJ/year") + print(f" At T=101 years:") + print(f" - Energy: {structure['energy_at_101']:.0f} PJ") + print(f" - Marginal rate: {structure['marginal_at_101']:.1f} PJ/year") + + # Find critical transitions + print("\n[4] Critical λ Transitions:") + transitions = find_critical_lambda(df) + for t in transitions: + print(f" λ ≈ {t['lambda']:.0f} PJ/year: T* jumps from {t['from_years']:.0f}y to {t['to_years']:.0f}y") + + # Sensitivity analysis + print("\n[5] Sensitivity Analysis Results:") + print(" " + "-" * 55) + print(f" {'λ (PJ/year)':<15} {'Optimal T (years)':<20} {'Energy (PJ)':<15}") + print(" " + "-" * 55) + + test_lambdas = [100, 200, 300, 400, 450, 480, 500, 550, 600] + sensitivity_results = [] + + for lam in test_lambdas: + opt = find_optimal_point(df, lam) + print(f" {lam:<15.0f} {opt['years']:<20.1f} {opt['energy_PJ']:<15.0f}") + sensitivity_results.append(opt) + + # Find λ that gives 139 years + print("\n[6] Original Knee Point Analysis (139 years):") + lambda_for_139 = None + for lam in np.linspace(400, 600, 1000): + opt = find_optimal_point(df, lam) + if abs(opt['years'] - 139) < 1: + lambda_for_139 = lam + print(f" λ ≈ {lam:.0f} PJ/year corresponds to T* ≈ 139 years") + break + + if lambda_for_139: + print(f"\n INTERPRETATION:") + print(f" To justify 139-year knee point, one must argue that:") + print(f" • Each year of delay costs ~{lambda_for_139:.0f} PJ in opportunity") + print(f" • This is {lambda_for_139/E_min*100:.1f}% of minimum total energy per year") + print(f" • Over 47 years (139→186), this amounts to {lambda_for_139*47:.0f} PJ") + + # Generate plots + print("\n[7] Generating visualization plots...") + plot_lambda_analysis(df) + plot_decision_recommendation(df) + plot_comprehensive_analysis(df) + + # Save sensitivity data + sensitivity_df = sensitivity_analysis(df, np.linspace(50, 600, 120)) + sensitivity_df.to_csv('/Volumes/Files/code/mm/20260130_b/p1/lambda_sensitivity.csv', index=False) + print(" Data saved to: lambda_sensitivity.csv") + + # Paper modification recommendations + print("\n" + "=" * 70) + print("RECOMMENDATIONS FOR PAPER MODIFICATION") + print("=" * 70) + print(""" + 1. REFRAME THE OPTIMIZATION PROBLEM + Current: "Multi-objective Pareto optimization" + Suggested: "Constrained optimization with time-cost trade-off" + + 2. INTRODUCE λ AS DECISION PARAMETER + Add equation: J = E_total + λ × T + where λ represents "time opportunity cost" (PJ/year) + + 3. JUSTIFY THE KNEE POINT SELECTION + Option A: Argue λ ≈ 480-500 PJ/year is reasonable because: + - Delayed lunar resource extraction + - Extended Earth-side operational costs + - Strategic/geopolitical value of early completion + + Option B: Present multiple scenarios: + - "Cost-optimal" (λ < 480): T* = 186 years + - "Balanced" (λ ≈ 500): T* = 139 years + - "Time-critical" (λ > 600): T* → 101 years + + 4. ADD SENSITIVITY ANALYSIS FIGURE + Show how optimal T* changes with λ (Figure generated) + + 5. ACKNOWLEDGE THE DISCONTINUITY + Note that the trade-off curve has a sharp transition at + T = 186 years due to elevator capacity constraints + """) + + print("=" * 70) + print("Analysis Complete!") + print("=" * 70) + + return df, sensitivity_results + + +if __name__ == "__main__": + df, results = main() diff --git a/p1/lambda_decision_map.png b/p1/lambda_decision_map.png new file mode 100644 index 0000000..47adde6 Binary files /dev/null and b/p1/lambda_decision_map.png differ diff --git a/p1/lambda_sensitivity.csv b/p1/lambda_sensitivity.csv new file mode 100644 index 0000000..a149daf --- /dev/null +++ b/p1/lambda_sensitivity.csv @@ -0,0 +1,121 @@ +lambda_PJ_per_year,optimal_years,optimal_energy_PJ,total_cost_PJ,elevator_fraction +50.0,186.3326653306613,15720.0,25036.633266533066,1.0 +54.621848739495796,186.3326653306613,15720.0,25897.834660918474,1.0 +59.24369747899159,186.3326653306613,15720.0,26759.036055303884,1.0 +63.865546218487395,186.3326653306613,15720.0,27620.237449689295,1.0 +68.48739495798318,186.3326653306613,15720.0,28481.438844074703,1.0 +73.10924369747899,186.3326653306613,15720.0,29342.64023846011,1.0 +77.73109243697479,186.3326653306613,15720.0,30203.84163284552,1.0 +82.35294117647058,186.3326653306613,15720.0,31065.04302723093,1.0 +86.97478991596638,186.3326653306613,15720.0,31926.244421616342,1.0 +91.59663865546219,186.3326653306613,15720.0,32787.44581600175,1.0 +96.21848739495798,186.3326653306613,15720.0,33648.647210387164,1.0 +100.84033613445378,186.3326653306613,15720.0,34509.84860477257,1.0 +105.46218487394958,186.3326653306613,15720.0,35371.04999915798,1.0 +110.08403361344537,186.3326653306613,15720.0,36232.25139354338,1.0 +114.70588235294117,186.3326653306613,15720.0,37093.45278792879,1.0 +119.32773109243696,186.3326653306613,15720.0,37954.6541823142,1.0 +123.94957983193277,186.3326653306613,15720.0,38815.855576699614,1.0 +128.57142857142856,186.3326653306613,15720.0,39677.056971085025,1.0 +133.19327731092437,186.3326653306613,15720.0,40538.258365470436,1.0 +137.81512605042016,186.3326653306613,15720.0,41399.45975985585,1.0 +142.43697478991595,186.3326653306613,15720.0,42260.66115424125,1.0 +147.05882352941177,186.3326653306613,15720.0,43121.86254862667,1.0 +151.68067226890756,186.3326653306613,15720.0,43983.06394301207,1.0 +156.30252100840335,186.3326653306613,15720.0,44844.265337397475,1.0 +160.92436974789916,186.3326653306613,15720.0,45705.46673178289,1.0 +165.54621848739495,186.3326653306613,15720.0,46566.6681261683,1.0 +170.16806722689074,186.3326653306613,15720.0,47427.86952055371,1.0 +174.78991596638656,186.3326653306613,15720.0,48289.07091493912,1.0 +179.41176470588235,186.3326653306613,15720.0,49150.27230932453,1.0 +184.03361344537814,186.3326653306613,15720.0,50011.47370370993,1.0 +188.65546218487393,186.3326653306613,15720.0,50872.675098095344,1.0 +193.27731092436974,186.3326653306613,15720.0,51733.876492480755,1.0 +197.89915966386553,186.3326653306613,15720.0,52595.077886866165,1.0 +202.52100840336132,186.3326653306613,15720.0,53456.279281251576,1.0 +207.14285714285714,186.3326653306613,15720.0,54317.48067563699,1.0 +211.76470588235293,186.3326653306613,15720.0,55178.68207002239,1.0 +216.38655462184872,186.3326653306613,15720.0,56039.8834644078,1.0 +221.00840336134453,186.3326653306613,15720.0,56901.08485879321,1.0 +225.63025210084032,186.3326653306613,15720.0,57762.28625317862,1.0 +230.2521008403361,186.3326653306613,15720.0,58623.48764756403,1.0 +234.8739495798319,186.3326653306613,15720.0,59484.68904194944,1.0 +239.49579831932772,186.3326653306613,15720.0,60345.89043633485,1.0 +244.1176470588235,186.3326653306613,15720.0,61207.09183072026,1.0 +248.7394957983193,186.3326653306613,15720.0,62068.29322510566,1.0 +253.3613445378151,186.3326653306613,15720.0,62929.49461949108,1.0 +257.9831932773109,186.0921843687375,15781.32247955465,63789.97844695162,0.9993150300601203 +262.6050420168067,186.0921843687375,15781.32247955465,64650.068374706294,0.9993150300601203 +267.2268907563025,186.0921843687375,15781.32247955465,65510.158302460964,0.9993150300601203 +271.8487394957983,186.0921843687375,15781.32247955465,66370.24823021564,0.9993150300601203 +276.4705882352941,186.0921843687375,15781.32247955465,67230.33815797031,0.9993150300601203 +281.0924369747899,186.0921843687375,15781.32247955465,68090.42808572498,0.9993150300601203 +285.71428571428567,186.0921843687375,15781.32247955465,68950.51801347964,0.9993150300601203 +290.3361344537815,186.0921843687375,15781.32247955465,69810.60794123431,0.9993150300601203 +294.9579831932773,186.0921843687375,15781.32247955465,70670.69786898898,0.9993150300601203 +299.5798319327731,186.0921843687375,15781.32247955465,71530.78779674367,0.9993150300601203 +304.2016806722689,186.0921843687375,15781.32247955465,72390.87772449832,0.9993150300601203 +308.8235294117647,186.0921843687375,15781.32247955465,73250.96765225299,0.9993150300601203 +313.44537815126046,186.0921843687375,15781.32247955465,74111.05758000766,0.9993150300601203 +318.0672268907563,186.0921843687375,15781.32247955465,74971.14750776233,0.9993150300601203 +322.6890756302521,186.0921843687375,15781.32247955465,75831.237435517,0.9993150300601203 +327.31092436974785,186.0921843687375,15781.32247955465,76691.32736327166,0.9993150300601203 +331.93277310924367,186.0921843687375,15781.32247955465,77551.41729102633,0.9993150300601203 +336.5546218487395,186.0921843687375,15781.32247955465,78411.50721878101,0.9993150300601203 +341.17647058823525,186.0921843687375,15781.32247955465,79271.59714653567,0.9993150300601203 +345.79831932773106,186.0921843687375,15781.32247955465,80131.68707429034,0.9993150300601203 +350.4201680672269,186.0921843687375,15781.32247955465,80991.77700204501,0.9993150300601203 +355.04201680672264,186.0921843687375,15781.32247955465,81851.86692979968,0.9993150300601203 +359.66386554621846,186.0921843687375,15781.32247955465,82711.95685755435,0.9993150300601203 +364.2857142857143,186.0921843687375,15781.32247955465,83572.04678530902,0.9993150300601203 +368.90756302521004,186.0921843687375,15781.32247955465,84432.1367130637,0.9993150300601203 +373.52941176470586,186.0921843687375,15781.32247955465,85292.22664081836,0.9993150300601203 +378.1512605042017,186.0921843687375,15781.32247955465,86152.31656857303,0.9993150300601203 +382.77310924369743,186.0921843687375,15781.32247955465,87012.40649632769,0.9993150300601203 +387.39495798319325,186.0921843687375,15781.32247955465,87872.49642408236,0.9993150300601203 +392.01680672268907,186.0921843687375,15781.32247955465,88732.58635183705,0.9993150300601203 +396.63865546218483,186.0921843687375,15781.32247955465,89592.6762795917,0.9993150300601203 +401.26050420168065,186.0921843687375,15781.32247955465,90452.76620734637,0.9993150300601203 +405.88235294117646,186.0921843687375,15781.32247955465,91312.85613510104,0.9993150300601203 +410.5042016806722,186.0921843687375,15781.32247955465,92172.94606285571,0.9993150300601203 +415.12605042016804,186.0921843687375,15781.32247955465,93033.03599061038,0.9993150300601203 +419.7478991596638,186.0921843687375,15781.32247955465,93893.12591836504,0.9993150300601203 +424.3697478991596,186.0921843687375,15781.32247955465,94753.21584611971,0.9993150300601203 +428.99159663865544,186.0921843687375,15781.32247955465,95613.3057738744,0.9993150300601203 +433.6134453781512,186.0921843687375,15781.32247955465,96473.39570162905,0.9993150300601203 +438.235294117647,186.0921843687375,15781.32247955465,97333.48562938372,0.9993150300601203 +442.85714285714283,186.0921843687375,15781.32247955465,98193.57555713839,0.9993150300601203 +447.4789915966386,186.0921843687375,15781.32247955465,99053.66548489306,0.9993150300601203 +452.1008403361344,186.0921843687375,15781.32247955465,99913.75541264773,0.9993150300601203 +456.7226890756302,186.0921843687375,15781.32247955465,100773.8453404024,0.9993150300601203 +461.344537815126,186.0921843687375,15781.32247955465,101633.93526815706,0.9993150300601203 +465.9663865546218,186.0921843687375,15781.32247955465,102494.02519591174,0.9993150300601203 +470.5882352941176,186.0921843687375,15781.32247955465,103354.11512366642,0.9993150300601203 +475.2100840336134,186.0921843687375,15781.32247955465,104214.20505142107,0.9993150300601203 +479.8319327731092,186.0921843687375,15781.32247955465,105074.29497917574,0.9993150300601203 +484.453781512605,159.15831663326654,28765.20501961573,105870.05337178224,0.8546801603206412 +489.0756302521008,159.15831663326654,28765.20501961573,106605.65903689398,0.8546801603206412 +493.6974789915966,148.33667334669337,34100.021848549404,107333.46352181188,0.7965679358717435 +498.3193277310924,138.95791583166334,38749.67677118048,107995.09197132869,0.7462040080160321 +502.9411764705882,138.95791583166334,38749.67677118048,108637.33443945821,0.7462040080160321 +507.563025210084,130.54108216432866,42994.615930671775,109252.44250819656,0.7010056112224449 +512.1848739495798,115.87174348697394,50481.660342457144,109829.41467465094,0.62223126252505 +516.8067226890755,110.82164328657315,53069.25828508744,110342.62855503909,0.5951122244488979 +521.4285714285713,110.82164328657315,53069.25828508744,110854.829427372,0.5951122244488979 +526.0504201680671,110.82164328657315,53069.25828508744,111367.0302997049,0.5951122244488979 +530.672268907563,105.53106212424849,55854.79973902723,111857.20791672716,0.5667018036072143 +535.2941176470588,105.53106212424849,55854.79973902723,112344.95652318376,0.5667018036072143 +539.9159663865546,105.53106212424849,55854.79973902723,112832.70512964038,0.5667018036072143 +544.5378151260504,105.53106212424849,55854.79973902723,113320.453736097,0.5667018036072143 +549.1596638655462,105.53106212424849,55854.79973902723,113808.20234255362,0.5667018036072143 +553.781512605042,105.53106212424849,55854.79973902723,114295.95094901022,0.5667018036072143 +558.4033613445378,105.53106212424849,55854.79973902723,114783.69955546682,0.5667018036072143 +563.0252100840336,100.72144288577154,58547.47792525526,115256.18946598377,0.5408741482965931 +567.6470588235294,100.72144288577154,58547.47792525526,115721.70873982558,0.5408741482965931 +572.2689075630252,100.72144288577154,58547.47792525526,116187.22801366738,0.5408741482965931 +576.8907563025209,100.72144288577154,58547.47792525526,116652.74728750918,0.5408741482965931 +581.5126050420167,100.72144288577154,58547.47792525526,117118.26656135097,0.5408741482965931 +586.1344537815125,100.72144288577154,58547.47792525526,117583.78583519277,0.5408741482965931 +590.7563025210084,100.72144288577154,58547.47792525526,118049.30510903458,0.5408741482965931 +595.3781512605042,100.72144288577154,58547.47792525526,118514.82438287638,0.5408741482965931 +600.0,100.72144288577154,58547.47792525526,118980.34365671818,0.5408741482965931 diff --git a/p1/latitude_effects.png b/p1/latitude_effects.png index 3e6456d..df2060e 100644 Binary files a/p1/latitude_effects.png and b/p1/latitude_effects.png differ diff --git a/p1/pareto_combined_range.csv b/p1/pareto_combined_range.csv index 798e4a9..df34cd7 100644 --- a/p1/pareto_combined_range.csv +++ b/p1/pareto_combined_range.csv @@ -1,301 +1,301 @@ years,energy_PJ,elevator_fraction,sites_used,rocket_launches -101.0,31679.76095710881,0.54237,10,366104 -101.28501585047614,31620.609850415538,0.5439005351170569,10,364880 -101.57003170095227,31561.45874372226,0.5454310702341137,10,363656 -101.85504755142841,31502.241823054243,0.5469616053511706,10,362431 -102.14006340190454,31443.090716360963,0.5484921404682274,10,361207 -102.42507925238068,31383.87379569294,0.5500226755852843,10,359982 -102.71009510285683,31324.722688999667,0.5515532107023411,10,358758 -102.99511095333295,31265.571582306387,0.5530837458193979,10,357534 -103.2801268038091,31206.354661638365,0.5546142809364548,10,356309 -103.56514265428524,31147.203554945085,0.5561448160535117,10,355085 -103.85015850476137,31087.98663427707,0.5576753511705685,10,353860 -104.13517435523751,31028.835527583797,0.5592058862876255,10,352636 -104.42019020571364,30969.618606915767,0.5607364214046823,10,351411 -104.70520605618978,30910.467500222494,0.5622669565217392,10,350187 -104.99022190666592,30851.316393529218,0.563797491638796,10,348963 -105.27523775714205,30792.09947286119,0.5653280267558528,10,347738 -105.5602536076182,30733.320588222938,0.5668585618729096,9,346514 -105.84526945809434,30677.360233793443,0.5683890969899665,9,345289 -106.13028530857046,30621.464186366808,0.5699196321070233,9,344065 -106.4153011590466,30565.5038319373,0.5714501672240803,9,342840 -106.70031700952273,30509.60778451066,0.5729807023411371,9,341616 -106.98533285999888,30453.711737084028,0.574511237458194,9,340392 -107.27034871047502,30397.751382654526,0.5760417725752509,9,339167 -107.55536456095115,30341.855335227887,0.5775723076923077,9,337943 -107.84038041142729,30285.894980798384,0.5791028428093645,9,336718 -108.12539626190343,30229.99893337175,0.5806333779264214,9,335494 -108.41041211237956,30174.038578942243,0.5821639130434783,9,334269 -108.6954279628557,30118.14253151561,0.5836944481605351,9,333045 -108.98044381333183,30062.24648408897,0.5852249832775919,9,331821 -109.26545966380797,30006.28612965946,0.5867555183946488,9,330596 -109.55047551428412,29950.39008223283,0.5882860535117057,9,329372 -109.83549136476024,29894.429727803326,0.5898165886287625,9,328147 -110.12050721523639,29838.53368037669,0.5913471237458194,9,326923 -110.40552306571252,29782.561361639895,0.5928776588628762,9,325698 -110.69053891618866,29726.665314213256,0.5944081939799332,9,324474 -110.9755547666648,29671.31387329956,0.59593872909699,8,323250 -111.26057061714093,29616.757347939132,0.5974692642140468,8,322025 -111.54558646761707,29562.264447117264,0.5989997993311036,8,320801 -111.83060231809321,29507.707921756835,0.6005303344481605,8,319576 -112.11561816856934,29453.21502093497,0.6020608695652173,8,318352 -112.40063401904548,29398.658495574542,0.6035914046822742,8,317127 -112.68564986952163,29344.16559475267,0.6051219397993312,8,315903 -112.97066571999775,29289.672693930803,0.606652474916388,8,314679 -113.2556815704739,29235.116168570374,0.6081830100334449,8,313454 -113.54069742095002,29180.623267748502,0.6097135451505017,8,312230 -113.82571327142617,29126.066742388073,0.6112440802675585,8,311005 -114.11072912190231,29071.573841566213,0.6127746153846154,8,309781 -114.39574497237844,29017.017316205773,0.6143051505016722,8,308556 -114.68076082285458,28962.524415383912,0.615835685618729,8,307332 -114.96577667333071,28908.031514562044,0.6173662207357858,8,306108 -115.25079252380685,28853.474989201608,0.6188967558528428,8,304883 -115.535808374283,28798.982088379744,0.6204272909698997,8,303659 -115.82082422475912,28744.425563019315,0.6219578260869565,8,302434 -116.10584007523526,28689.932662197443,0.6234883612040134,8,301210 -116.3908559257114,28635.376136837014,0.6250188963210702,8,299985 -116.67587177618753,28580.88323601515,0.6265494314381271,8,298761 -116.96088762666368,28526.45534360956,0.6280799665551839,7,297537 -117.24590347713982,28471.997009615712,0.6296105016722408,7,296312 -117.53091932761595,28417.60224988323,0.6311410367892976,7,295088 -117.81593517809209,28363.14391588938,0.6326715719063545,7,293863 -118.10095102856822,28308.7491561569,0.6342021070234113,7,292639 -118.38596687904436,28254.290822163046,0.6357326421404682,7,291414 -118.67098272952049,28199.896062430566,0.637263177257525,7,290190 -118.95599857999663,28145.50130269808,0.6387937123745819,7,288966 -119.24101443047277,28091.042968704238,0.6403242474916389,7,287741 -119.5260302809489,28036.64205631926,0.6418547826086957,7,286517 -119.81104613142504,27982.18372232541,0.6433853177257525,7,285292 -120.09606198190119,27927.78896259293,0.6449158528428094,7,284068 -120.38107783237731,27873.330628599077,0.6464463879598662,7,282843 -120.66609368285346,27818.935868866593,0.647976923076923,7,281619 -120.9511095333296,27764.541109134116,0.6495074581939799,7,280395 -121.23612538380573,27710.08277514026,0.6510379933110367,7,279170 -121.52114123428187,27655.68801540778,0.6525685284280937,7,277946 -121.806157084758,27601.22968141393,0.6540990635451505,7,276721 -122.09117293523414,27546.834921681453,0.6556295986622074,7,275497 -122.37618878571027,27492.3765876876,0.6571601337792642,7,274272 -122.66120463618641,27437.981827955115,0.6586906688963211,7,273048 -122.94622048666255,27383.587068222638,0.6602212040133779,7,271824 -123.23123633713868,27329.128734228783,0.6617517391304347,7,270599 -123.51625218761482,27274.84492702738,0.6632822742474915,6,269375 -123.80126803809097,27220.569274449346,0.6648128093645485,6,268150 -124.0862838885671,27166.357097332555,0.6663433444816053,6,266926 -124.37129973904324,27112.081444754524,0.6678738795986622,6,265701 -124.65631558951938,27057.869267637732,0.6694044147157191,6,264477 -124.94133143999551,27003.65709052094,0.6709349498327759,6,263253 -125.22634729047165,26949.381437942906,0.6724654849498327,6,262028 -125.5113631409478,26895.169260826126,0.6739960200668896,6,260804 -125.79637899142392,26840.893608248083,0.6755265551839464,6,259579 -126.08139484190006,26786.681431131296,0.6770570903010034,6,258355 -126.36641069237619,26732.405778553257,0.6785876254180602,6,257130 -126.65142654285233,26678.193601436476,0.6801181605351171,6,255906 -126.93644239332846,26623.981424319685,0.6816486956521739,6,254682 -127.2214582438046,26569.705771741646,0.6831792307692307,6,253457 -127.50647409428075,26515.49359462486,0.6847097658862875,6,252233 -127.79148994475688,26461.21794204682,0.6862403010033443,6,251008 -128.076505795233,26407.005764930036,0.6877708361204011,6,249784 -128.36152164570916,26352.730112351997,0.6893013712374582,6,248559 -128.6465374961853,26298.51793523521,0.690831906354515,6,247335 -128.93155334666142,26244.300198266632,0.6923624414715718,6,246111 -129.21656919713757,26190.024545688593,0.6938929765886287,6,244886 -129.5015850476137,26135.81236857181,0.6954235117056855,6,243662 -129.78660089808983,26081.536715993767,0.6969540468227424,6,242437 -130.071616748566,26027.324538876983,0.6984845819397993,6,241213 -130.35663259904211,25973.048886298948,0.7000151170568562,6,239988 -130.64164844951824,25918.836709182156,0.701545652173913,6,238764 -130.9266642999944,25865.032259204538,0.70307618729097,5,237540 -131.21168015047053,25811.2648093821,0.7046067224080268,5,236315 -131.49669600094666,25757.56054378724,0.7061372575250836,5,235091 -131.7817118514228,25703.793093964807,0.7076677926421405,5,233866 -132.06672770189894,25650.088828369953,0.7091983277591973,5,232642 -132.35174355237507,25596.321378547516,0.7107288628762541,5,231417 -132.63675940285123,25542.61711295266,0.7122593979933112,5,230193 -132.92177525332735,25488.912847357806,0.713789933110368,5,228969 -133.20679110380348,25435.14539753536,0.7153204682274248,5,227744 -133.49180695427964,25381.441131940504,0.7168510033444816,5,226520 -133.77682280475577,25327.673682118068,0.7183815384615384,5,225295 -134.0618386552319,25273.96941652321,0.7199120735785952,5,224071 -134.34685450570802,25220.201966700773,0.721442608695652,5,222846 -134.63187035618418,25166.497701105916,0.722973143812709,5,221622 -134.9168862066603,25112.793435511063,0.7245036789297659,5,220398 -135.20190205713644,25059.025985688626,0.7260342140468227,5,219173 -135.48691790761256,25005.321720093765,0.7275647491638795,5,217949 -135.77193375808872,24951.554270271332,0.7290952842809364,5,216724 -136.05694960856485,24897.85000467648,0.7306258193979932,5,215500 -136.34196545904098,24844.082554854034,0.73215635451505,5,214275 -136.62698130951713,24790.378289259184,0.733686889632107,5,213051 -136.91199715999326,24736.67402366432,0.7352174247491639,5,211827 -137.1970130104694,24682.906573841883,0.7367479598662207,5,210602 -137.48202886094555,24629.202308247033,0.7382784949832776,5,209378 -137.76704471142168,24575.434858424593,0.7398090301003344,5,208153 -138.0520605618978,24521.726489146295,0.7413395652173913,5,206929 -138.33707641237396,24467.95903932386,0.7428701003344482,5,205704 -138.6220922628501,24414.254773729,0.744400635451505,5,204480 -138.90710811332622,24360.550508134147,0.7459311705685618,5,203256 -139.19212396380237,24307.39243233035,0.7474617056856189,4,202031 -139.4771398142785,24254.528682623262,0.7489922408026755,4,200807 -139.76215566475463,24201.602261198288,0.7505227759197323,4,199582 -140.0471715152308,24148.738511491203,0.7520533110367893,4,198358 -140.33218736570691,24095.812090066232,0.7535838461538461,4,197133 -140.61720321618304,24042.948340359148,0.7551143812709029,4,195909 -140.9022190666592,23990.084590652063,0.7566449163879598,4,194685 -141.18723491713533,23937.158169227092,0.7581754515050166,4,193460 -141.47225076761146,23884.29441952001,0.7597059866220734,4,192236 -141.7572666180876,23831.367998095036,0.7612365217391305,4,191011 -142.04228246856374,23778.50424838795,0.7627670568561873,4,189787 -142.32729831903987,23725.577826962977,0.7642975919732441,4,188562 -142.612314169516,23672.714077255892,0.7658281270903009,4,187338 -142.89733001999215,23619.850327548815,0.7673586622073579,4,186114 -143.18234587046828,23566.92390612384,0.7688891973244147,4,184889 -143.4673617209444,23514.060156416752,0.7704197324414715,4,183665 -143.75237757142054,23461.133734991778,0.7719502675585284,4,182440 -144.0373934218967,23408.269985284693,0.7734808026755853,4,181216 -144.32240927237282,23355.343563859722,0.7750113377926421,4,179991 -144.60742512284895,23302.479814152637,0.7765418729096989,4,178767 -144.8924409733251,23249.616064445556,0.7780724080267559,4,177543 -145.17745682380124,23196.68964302058,0.7796029431438126,4,176318 -145.46247267427736,23143.825893313497,0.7811334782608694,4,175094 -145.74748852475352,23090.899471888522,0.7826640133779263,4,173869 -146.03250437522965,23038.035722181445,0.7841945484949832,4,172645 -146.31752022570578,22985.109300756463,0.78572508361204,4,171420 -146.60253607618193,22932.245551049386,0.787255618729097,4,170196 -146.88755192665806,22879.3818013423,0.7887861538461538,4,168972 -147.1725677771342,22826.455379917323,0.7903166889632106,4,167747 -147.45758362761035,22773.589576565555,0.7918472240802675,4,166523 -147.74259947808648,22720.66315514058,0.7933777591973243,4,165298 -148.0276153285626,22667.799405433496,0.7949082943143811,4,164074 -148.31263117903876,22614.872984008525,0.7964388294314382,4,162849 -148.5976470295149,22562.204830829458,0.797969364548495,3,161625 -148.88266287999102,22509.616963828565,0.7994998996655518,3,160401 -149.16767873046717,22456.966604720914,0.8010304347826087,3,159176 -149.4526945809433,22404.378737720017,0.8025609698996655,3,157952 -149.73771043141943,22351.728378612366,0.8040915050167223,3,156727 -150.0227262818956,22299.140511611473,0.8056220401337794,3,155503 -150.30774213237171,22246.490152503826,0.8071525752508362,3,154278 -150.59275798284784,22193.902285502925,0.808683110367893,3,153054 -150.87777383332397,22141.314418502032,0.8102136454849498,3,151830 -151.16278968380013,22088.66405939438,0.8117441806020066,3,150605 -151.44780553427626,22036.076192393488,0.8132747157190634,3,149381 -151.73282138475238,21983.425833285837,0.8148052508361202,3,148156 -152.0178372352285,21930.83796628494,0.816335785953177,3,146932 -152.30285308570467,21878.18760717729,0.817866321070234,3,145707 -152.5878689361808,21825.599740176393,0.8193968561872909,3,144483 -152.87288478665693,21773.011873175496,0.8209273913043477,3,143259 -153.15790063713308,21720.36151406785,0.8224579264214046,3,142034 -153.4429164876092,21667.77364706695,0.8239884615384614,3,140810 -153.72793233808534,21615.1232879593,0.8255189966555183,3,139585 -154.0129481885615,21562.535420958407,0.8270495317725752,3,138361 -154.29796403903762,21509.885061850757,0.828580066889632,3,137136 -154.58297988951375,21457.297194849863,0.8301106020066888,3,135912 -154.8679957399899,21404.709327848966,0.8316411371237459,3,134688 -155.15301159046604,21352.058968741316,0.8331716722408027,3,133463 -155.43802744094216,21299.471101740422,0.8347022073578595,3,132239 -155.72304329141832,21246.82074263277,0.8362327424749164,3,131014 -156.00805914189445,21194.232875631875,0.8377632775919732,3,129790 -156.29307499237058,21141.582516524224,0.83929381270903,3,128565 -156.57809084284673,21088.993134712055,0.8408243478260871,3,127341 -156.86310669332286,21036.405267711158,0.8423548829431439,3,126117 -157.148122543799,20983.754908603503,0.8438854180602006,3,124892 -157.43313839427515,20931.16704160261,0.8454159531772575,3,123668 -157.71815424475128,20878.51668249496,0.8469464882943143,3,122443 -158.0031700952274,20825.928815494062,0.8484770234113711,3,121219 -158.28818594570356,20773.27845638641,0.8500075585284281,3,119994 -158.5732017961797,20720.69058938552,0.8515380936454849,3,118770 -158.85821764665582,20668.10272238462,0.8530686287625417,3,117546 -159.14323349713194,20615.45236327697,0.8545991638795986,3,116321 -159.4282493476081,20563.69918904202,0.8561296989966555,2,115097 -159.71326519808423,20511.979658520824,0.8576602341137123,2,113872 -159.99828104856036,20460.321970540033,0.8591907692307691,2,112648 -160.2832968990365,20408.602440018836,0.8607213043478259,2,111423 -160.56831274951264,20356.944752038045,0.8622518394648829,2,110199 -160.85332859998877,20305.28706405725,0.8637823745819397,2,108975 -161.1383444504649,20253.567533536054,0.8653129096989965,2,107750 -161.42336030094106,20201.909845555263,0.8668434448160535,2,106526 -161.70837615141718,20150.190315034066,0.8683739799331103,2,105301 -161.9933920018933,20098.53262705327,0.8699045150501672,2,104077 -162.27840785236947,20046.81309653208,0.8714350501672241,2,102852 -162.5634237028456,19995.155408551283,0.8729655852842809,2,101628 -162.84843955332173,19943.497720570493,0.8744961204013376,2,100404 -163.13345540379788,19891.778190049296,0.8760266555183945,2,99179 -163.418471254274,19840.1205020685,0.8775571906354513,2,97955 -163.70348710475014,19788.400971547308,0.8790877257525082,2,96730 -163.9885029552263,19736.743283566517,0.8806182608695652,2,95506 -164.27351880570242,19685.02375304532,0.882148795986622,2,94281 -164.55853465617855,19633.366065064525,0.8836793311036788,2,93057 -164.8435505066547,19581.708377083734,0.8852098662207357,2,91833 -165.12856635713084,19529.98884656254,0.8867404013377925,2,90608 -165.41358220760696,19478.331158581743,0.8882709364548494,2,89384 -165.69859805808312,19426.611628060553,0.8898014715719064,2,88159 -165.98361390855925,19374.953724401188,0.8913320066889632,2,86935 -166.26862975903538,19323.234193879995,0.89286254180602,2,85710 -166.55364560951153,19271.576505899204,0.894393076923077,2,84486 -166.83866145998763,19219.918817918406,0.8959236120401336,2,83262 -167.1236773104638,19168.199287397212,0.8974541471571906,2,82037 -167.40869316093995,19116.54159941642,0.8989846822742475,2,80813 -167.69370901141605,19064.822068895224,0.9005152173913042,2,79588 -167.9787248618922,19013.16438091443,0.9020457525083612,2,78364 -168.26374071236836,18961.44485039324,0.9035762876254182,2,77139 -168.54875656284446,18909.787162412442,0.9051068227424748,2,75915 -168.83377241332062,18858.129474431647,0.9066373578595316,2,74691 -169.11878826379674,18806.409943910454,0.9081678929765885,2,73466 -169.40380411427287,18754.75225592966,0.9096984280936453,2,72242 -169.68881996474903,18703.032725408466,0.9112289632107022,2,71017 -169.97383581522516,18651.37503742767,0.912759498327759,2,69793 -170.2588516657013,18599.655506906478,0.9142900334448159,2,68568 -170.54386751617744,18547.997818925687,0.9158205685618729,2,67344 -170.82888336665357,18496.34013094489,0.9173511036789297,2,66120 -171.1138992171297,18444.620600423696,0.9188816387959865,2,64895 -171.39891506760586,18392.962912442905,0.9204121739130434,2,63671 -171.68393091808198,18341.290399849782,0.9219427090301002,1,62446 -171.9689467685581,18289.91913300881,0.923473244147157,1,61222 -172.25396261903427,18238.48623930601,0.9250037792642141,1,59997 -172.5389784695104,18187.11497246504,0.9265343143812709,1,58773 -172.82399431998653,18135.743705624067,0.9280648494983277,1,57549 -173.10901017046268,18084.31081192127,0.9295953846153846,1,56324 -173.3940260209388,18032.9395450803,0.9311259197324414,1,55100 -173.67904187141494,17981.506651377495,0.9326564548494982,1,53875 -173.9640577218911,17930.135384536527,0.9341869899665552,1,52651 -174.24907357236722,17878.702490833723,0.9357175250836121,1,51426 -174.53408942284335,17827.33122399275,0.9372480602006688,1,50202 -174.8191052733195,17775.959957151783,0.9387785953177257,1,48978 -175.1041211237956,17724.52706344898,0.9403091304347824,1,47753 -175.38913697427176,17673.155796608007,0.9418396655518393,1,46529 -175.67415282474792,17621.72290290521,0.9433702006688963,1,45304 -175.95916867522402,17570.351636064235,0.9449007357859529,1,44080 -176.24418452570018,17518.918742361435,0.9464312709030099,1,42855 -176.52920037617633,17467.547475520467,0.9479618060200669,1,41631 -176.81421622665243,17416.176208679495,0.9494923411371236,1,40407 -177.0992320771286,17364.74331497669,0.9510228762541805,1,39182 -177.38424792760472,17313.37204813572,0.9525534113712374,1,37958 -177.66926377808085,17261.93915443292,0.9540839464882942,1,36733 -177.954279628557,17210.56788759195,0.9556144816053511,1,35509 -178.23929547903313,17159.134993889147,0.9571450167224079,1,34284 -178.52431132950926,17107.76372704818,0.9586755518394647,1,33060 -178.80932717998542,17056.392460207207,0.9602060869565218,1,31836 -179.09434303046154,17004.959566504403,0.9617366220735786,1,30611 -179.37935888093767,16953.588299663435,0.9632671571906354,1,29387 -179.66437473141383,16902.155405960635,0.9647976923076923,1,28162 -179.94939058188996,16850.784139119663,0.9663282274247491,1,26938 -180.2344064323661,16799.35124541686,0.9678587625418059,1,25713 -180.51942228284224,16747.97997857589,0.9693892976588627,1,24489 -180.80443813331837,16696.60871173492,0.9709198327759195,1,23265 -181.0894539837945,16645.175818032116,0.9724503678929765,1,22040 -181.37446983427066,16593.804551191148,0.9739809030100334,1,20816 -181.65948568474678,16542.371657488344,0.9755114381270902,1,19591 -181.9445015352229,16491.000390647372,0.977041973244147,1,18367 -182.22951738569907,16439.567496944575,0.978572508361204,1,17142 -182.5145332361752,16388.196230103604,0.9801030434782608,1,15918 -182.79954908665133,16336.824963262632,0.9816335785953176,1,14694 -183.08456493712748,16285.392069559832,0.9831641137123746,1,13469 -183.36958078760358,16234.02080271886,0.9846946488294313,1,12245 -183.65459663807974,16182.587909016058,0.9862251839464882,1,11020 -183.9396124885559,16131.21664217509,0.9877557190635452,1,9796 -184.224628339032,16079.783748472286,0.9892862541806018,1,8571 -184.50964418950815,16028.412481631316,0.9908167892976588,1,7347 -184.7946600399843,15977.041214790348,0.9923473244147157,1,6123 -185.0796758904604,15925.608321087544,0.9938778595317724,1,4898 -185.36469174093656,15874.237054246574,0.9954083946488294,1,3674 -185.6497075914127,15822.80416054377,0.9969389297658863,1,2449 -185.93472344188882,15771.432893702802,0.9984694648829431,1,1225 +101.0,58391.44787772048,0.54237,10,366104 +101.28501585047614,58231.93547882414,0.5439005351170569,10,364880 +101.57003170095227,58072.423079927816,0.5454310702341137,10,363656 +101.85504755142841,57912.767006200826,0.5469616053511706,10,362431 +102.14006340190454,57753.254607304494,0.5484921404682274,10,361207 +102.42507925238068,57593.598533577504,0.5500226755852843,10,359982 +102.71009510285683,57434.086134681165,0.5515532107023411,10,358758 +102.99511095333295,57274.573735784834,0.5530837458193979,10,357534 +103.2801268038091,57114.91766205785,0.5546142809364548,10,356309 +103.56514265428524,56955.40526316152,0.5561448160535117,10,355085 +103.85015850476137,56795.74918943452,0.5576753511705685,10,353860 +104.13517435523751,56636.2367905382,0.5592058862876255,10,352636 +104.42019020571364,56476.58071681121,0.5607364214046823,10,351411 +104.70520605618978,56317.06831791488,0.5622669565217392,10,350187 +104.99022190666592,56157.55591901855,0.563797491638796,10,348963 +105.27523775714205,55997.89984529155,0.5653280267558528,10,347738 +105.5602536076182,55839.474575619024,0.5668585618729096,9,346514 +105.84526945809434,55689.32978226716,0.5683890969899665,9,345289 +106.13028530857046,55539.32426241306,0.5699196321070233,9,344065 +106.4153011590466,55389.17946906119,0.5714501672240803,9,342840 +106.70031700952273,55239.17394920709,0.5729807023411371,9,341616 +106.98533285999888,55089.16842935299,0.574511237458194,9,340392 +107.27034871047502,54939.023636001126,0.5760417725752509,9,339167 +107.55536456095115,54789.01811614702,0.5775723076923077,9,337943 +107.84038041142729,54638.873322795174,0.5791028428093645,9,336718 +108.12539626190343,54488.86780294106,0.5806333779264214,9,335494 +108.41041211237956,54338.7230095892,0.5821639130434783,9,334269 +108.6954279628557,54188.71748973509,0.5836944481605351,9,333045 +108.98044381333183,54038.71196988099,0.5852249832775919,9,331821 +109.26545966380797,53888.56717652913,0.5867555183946488,9,330596 +109.55047551428412,53738.561656675025,0.5882860535117057,9,329372 +109.83549136476024,53588.41686332315,0.5898165886287625,9,328147 +110.12050721523639,53438.411343469066,0.5913471237458194,9,326923 +110.40552306571252,53288.231985014994,0.5928776588628762,9,325698 +110.69053891618866,53138.226465160915,0.5944081939799332,9,324474 +110.9755547666648,52989.80034951309,0.59593872909699,8,323250 +111.26057061714093,52843.726777279415,0.5974692642140468,8,322025 +111.54558646761707,52697.79049934024,0.5989997993311036,8,320801 +111.83060231809321,52551.71692710657,0.6005303344481605,8,319576 +112.11561816856934,52405.78064916739,0.6020608695652173,8,318352 +112.40063401904548,52259.70707693372,0.6035914046822742,8,317127 +112.68564986952163,52113.77079899455,0.6051219397993312,8,315903 +112.97066571999775,51967.83452105538,0.606652474916388,8,314679 +113.2556815704739,51821.760948821706,0.6081830100334449,8,313454 +113.54069742095002,51675.82467088253,0.6097135451505017,8,312230 +113.82571327142617,51529.751098648856,0.6112440802675585,8,311005 +114.11072912190231,51383.81482070968,0.6127746153846154,8,309781 +114.39574497237844,51237.74124847601,0.6143051505016722,8,308556 +114.68076082285458,51091.80497053684,0.615835685618729,8,307332 +114.96577667333071,50945.86869259767,0.6173662207357858,8,306108 +115.25079252380685,50799.795120364,0.6188967558528428,8,304883 +115.535808374283,50653.85884242482,0.6204272909698997,8,303659 +115.82082422475912,50507.78527019114,0.6219578260869565,8,302434 +116.10584007523526,50361.84899225197,0.6234883612040134,8,301210 +116.3908559257114,50215.7754200183,0.6250188963210702,8,299985 +116.67587177618753,50069.83914207913,0.6265494314381271,8,298761 +116.96088762666368,49924.09094506062,0.6280799665551839,7,297537 +117.24590347713982,49778.30145792985,0.6296105016722408,7,296312 +117.53091932761595,49632.649119632704,0.6311410367892976,7,295088 +117.81593517809209,49486.85963250194,0.6326715719063545,7,293863 +118.10095102856822,49341.20729420479,0.6342021070234113,7,292639 +118.38596687904436,49195.417807074016,0.6357326421404682,7,291414 +118.67098272952049,49049.765468776866,0.637263177257525,7,290190 +118.95599857999663,48904.11313047972,0.6387937123745819,7,288966 +119.24101443047277,48758.32364334895,0.6403242474916389,7,287741 +119.5260302809489,48612.65359180193,0.6418547826086957,7,286517 +119.81104613142504,48466.86410467116,0.6433853177257525,7,285292 +120.09606198190119,48321.211766374014,0.6449158528428094,7,284068 +120.38107783237731,48175.422279243234,0.6464463879598662,7,282843 +120.66609368285346,48029.76994094609,0.647976923076923,7,281619 +120.9511095333296,47884.11760264895,0.6495074581939799,7,280395 +121.23612538380573,47738.32811551818,0.6510379933110367,7,279170 +121.52114123428187,47592.675777221026,0.6525685284280937,7,277946 +121.806157084758,47446.88629009026,0.6540990635451505,7,276721 +122.09117293523414,47301.23395179312,0.6556295986622074,7,275497 +122.37618878571027,47155.444464662345,0.6571601337792642,7,274272 +122.66120463618641,47009.792126365195,0.6586906688963211,7,273048 +122.94622048666255,46864.13978806805,0.6602212040133779,7,271824 +123.23123633713868,46718.35030093729,0.6617517391304347,7,270599 +123.51625218761482,46573.01881199241,0.6632822742474915,6,269375 +123.80126803809097,46427.75759774886,0.6648128093645485,6,268150 +124.0862838885671,46282.63324663159,0.6663433444816053,6,266926 +124.37129973904324,46137.37203238804,0.6678738795986622,6,265701 +124.65631558951938,45992.24768127076,0.6694044147157191,6,264477 +124.94133143999551,45847.12333015348,0.6709349498327759,6,263253 +125.22634729047165,45701.862115909935,0.6724654849498327,6,262028 +125.5113631409478,45556.73776479266,0.6739960200668896,6,260804 +125.79637899142392,45411.47655054911,0.6755265551839464,6,259579 +126.08139484190006,45266.35219943183,0.6770570903010034,6,258355 +126.36641069237619,45121.09098518829,0.6785876254180602,6,257130 +126.65142654285233,44975.96663407102,0.6801181605351171,6,255906 +126.93644239332846,44830.84228295374,0.6816486956521739,6,254682 +127.2214582438046,44685.581068710184,0.6831792307692307,6,253457 +127.50647409428075,44540.45671759291,0.6847097658862875,6,252233 +127.79148994475688,44395.19550334936,0.6862403010033443,6,251008 +128.076505795233,44250.07115223208,0.6877708361204011,6,249784 +128.36152164570916,44104.80993798853,0.6893013712374582,6,248559 +128.6465374961853,43959.68558687125,0.690831906354515,6,247335 +128.93155334666142,43814.545236748185,0.6923624414715718,6,246111 +129.21656919713757,43669.28402250464,0.6938929765886287,6,244886 +129.5015850476137,43524.15967138736,0.6954235117056855,6,243662 +129.78660089808983,43378.89845714381,0.6969540468227424,6,242437 +130.071616748566,43233.77410602654,0.6984845819397993,6,241213 +130.35663259904211,43088.512891782986,0.7000151170568562,6,239988 +130.64164844951824,42943.38854066571,0.701545652173913,6,238764 +130.9266642999944,42799.441741669325,0.70307618729097,5,237540 +131.21168015047053,42655.64826203361,0.7046067224080268,5,236315 +131.49669600094666,42511.990804415494,0.7061372575250836,5,235091 +131.7817118514228,42368.19732477978,0.7076677926421405,5,233866 +132.06672770189894,42224.53986716167,0.7091983277591973,5,232642 +132.35174355237507,42080.74638752595,0.7107288628762541,5,231417 +132.63675940285123,41937.08892990785,0.7122593979933112,5,230193 +132.92177525332735,41793.43147228974,0.713789933110368,5,228969 +133.20679110380348,41649.63799265402,0.7153204682274248,5,227744 +133.49180695427964,41505.98053503591,0.7168510033444816,5,226520 +133.77682280475577,41362.18705540019,0.7183815384615384,5,225295 +134.0618386552319,41218.52959778208,0.7199120735785952,5,224071 +134.34685450570802,41074.736118146364,0.721442608695652,5,222846 +134.63187035618418,40931.078660528256,0.722973143812709,5,221622 +134.9168862066603,40787.42120291016,0.7245036789297659,5,220398 +135.20190205713644,40643.62772327444,0.7260342140468227,5,219173 +135.48691790761256,40499.97026565633,0.7275647491638795,5,217949 +135.77193375808872,40356.17678602062,0.7290952842809364,5,216724 +136.05694960856485,40212.5193284025,0.7306258193979932,5,215500 +136.34196545904098,40068.72584876678,0.73215635451505,5,214275 +136.62698130951713,39925.06839114867,0.733686889632107,5,213051 +136.91199715999326,39781.41093353057,0.7352174247491639,5,211827 +137.1970130104694,39637.61745389485,0.7367479598662207,5,210602 +137.48202886094555,39493.959996276746,0.7382784949832776,5,209378 +137.76704471142168,39350.166516641024,0.7398090301003344,5,208153 +138.0520605618978,39206.49726556041,0.7413395652173913,5,206929 +138.33707641237396,39062.70378592469,0.7428701003344482,5,205704 +138.6220922628501,38919.046328306584,0.744400635451505,5,204480 +138.90710811332622,38775.388870688475,0.7459311705685618,5,203256 +139.19212396380237,38633.35068627388,0.7474617056856189,4,202031 +139.4771398142785,38492.11432551249,0.7489922408026755,4,200807 +139.76215566475463,38350.74341901207,0.7505227759197323,4,199582 +140.0471715152308,38209.50705825069,0.7520533110367893,4,198358 +140.33218736570691,38068.13615175026,0.7535838461538461,4,197133 +140.61720321618304,37926.899790988886,0.7551143812709029,4,195909 +140.9022190666592,37785.6634302275,0.7566449163879598,4,194685 +141.18723491713533,37644.292523727076,0.7581754515050166,4,193460 +141.47225076761146,37503.056162965695,0.7597059866220734,4,192236 +141.7572666180876,37361.685256465265,0.7612365217391305,4,191011 +142.04228246856374,37220.44889570389,0.7627670568561873,4,189787 +142.32729831903987,37079.07798920346,0.7642975919732441,4,188562 +142.612314169516,36937.841628442075,0.7658281270903009,4,187338 +142.89733001999215,36796.6052676807,0.7673586622073579,4,186114 +143.18234587046828,36655.23436118027,0.7688891973244147,4,184889 +143.4673617209444,36513.998000418884,0.7704197324414715,4,183665 +143.75237757142054,36372.62709391846,0.7719502675585284,4,182440 +144.0373934218967,36231.39073315708,0.7734808026755853,4,181216 +144.32240927237282,36090.01982665666,0.7750113377926421,4,179991 +144.60742512284895,35948.78346589527,0.7765418729096989,4,178767 +144.8924409733251,35807.54710513389,0.7780724080267559,4,177543 +145.17745682380124,35666.17619863346,0.7796029431438126,4,176318 +145.46247267427736,35524.93983787208,0.7811334782608694,4,175094 +145.74748852475352,35383.56893137166,0.7826640133779263,4,173869 +146.03250437522965,35242.33257061028,0.7841945484949832,4,172645 +146.31752022570578,35100.96166410985,0.78572508361204,4,171420 +146.60253607618193,34959.72530334846,0.787255618729097,4,170196 +146.88755192665806,34818.488942587086,0.7887861538461538,4,168972 +147.1725677771342,34677.118036086664,0.7903166889632106,4,167747 +147.45758362761035,34535.875786977056,0.7918472240802675,4,166523 +147.74259947808648,34394.504880476634,0.7933777591973243,4,165298 +148.0276153285626,34253.26851971525,0.7949082943143811,4,164074 +148.31263117903876,34111.897613214824,0.7964388294314382,4,162849 +148.5976470295149,33971.223384159865,0.797969364548495,3,161625 +148.88266287999102,33830.77989236181,0.7994998996655518,3,160401 +149.16767873046717,33690.20237101544,0.8010304347826087,3,159176 +149.4526945809433,33549.758879217385,0.8025609698996655,3,157952 +149.73771043141943,33409.18135787102,0.8040915050167223,3,156727 +150.0227262818956,33268.73786607297,0.8056220401337794,3,155503 +150.30774213237171,33128.1603447266,0.8071525752508362,3,154278 +150.59275798284784,32987.71685292855,0.808683110367893,3,153054 +150.87777383332397,32847.27336113049,0.8102136454849498,3,151830 +151.16278968380013,32706.69583978412,0.8117441806020066,3,150605 +151.44780553427626,32566.25234798607,0.8132747157190634,3,149381 +151.73282138475238,32425.674826639704,0.8148052508361202,3,148156 +152.0178372352285,32285.231334841643,0.816335785953177,3,146932 +152.30285308570467,32144.65381349528,0.817866321070234,3,145707 +152.5878689361808,32004.21032169723,0.8193968561872909,3,144483 +152.87288478665693,31863.76682989917,0.8209273913043477,3,143259 +153.15790063713308,31723.189308552806,0.8224579264214046,3,142034 +153.4429164876092,31582.74581675475,0.8239884615384614,3,140810 +153.72793233808534,31442.16829540838,0.8255189966555183,3,139585 +154.0129481885615,31301.724803610326,0.8270495317725752,3,138361 +154.29796403903762,31161.14728226396,0.828580066889632,3,137136 +154.58297988951375,31020.70379046591,0.8301106020066888,3,135912 +154.8679957399899,30880.26029866785,0.8316411371237459,3,134688 +155.15301159046604,30739.682777321483,0.8331716722408027,3,133463 +155.43802744094216,30599.239285523432,0.8347022073578595,3,132239 +155.72304329141832,30458.661764177064,0.8362327424749164,3,131014 +156.00805914189445,30318.218272379007,0.8377632775919732,3,129790 +156.29307499237058,30177.640751032643,0.83929381270903,3,128565 +156.57809084284673,30037.19291945856,0.8408243478260871,3,127341 +156.86310669332286,29896.749427660507,0.8423548829431439,3,126117 +157.148122543799,29756.17190631414,0.8438854180602006,3,124892 +157.43313839427515,29615.728414516085,0.8454159531772575,3,123668 +157.71815424475128,29475.150893169714,0.8469464882943143,3,122443 +158.0031700952274,29334.707401371656,0.8484770234113711,3,121219 +158.28818594570356,29194.129880025295,0.8500075585284281,3,119994 +158.5732017961797,29053.68638822724,0.8515380936454849,3,118770 +158.85821764665582,28913.242896429183,0.8530686287625417,3,117546 +159.14323349713194,28772.66537508282,0.8545991638795986,3,116321 +159.4282493476081,28634.614168249944,0.8561296989966555,2,115097 +159.71326519808423,28496.704463522325,0.8576602341137123,2,113872 +159.99828104856036,28358.92692664266,0.8591907692307691,2,112648 +160.2832968990365,28221.017221915045,0.8607213043478259,2,111423 +160.56831274951264,28083.239685035383,0.8622518394648829,2,110199 +160.85332859998877,27945.46214815572,0.8637823745819397,2,108975 +161.1383444504649,27807.552443428103,0.8653129096989965,2,107750 +161.42336030094106,27669.774906548442,0.8668434448160535,2,106526 +161.70837615141718,27531.865201820827,0.8683739799331103,2,105301 +161.9933920018933,27394.087664941162,0.8699045150501672,2,104077 +162.27840785236947,27256.17796021355,0.8714350501672241,2,102852 +162.5634237028456,27118.400423333886,0.8729655852842809,2,101628 +162.84843955332173,26980.622886454217,0.8744961204013376,2,100404 +163.13345540379788,26842.713181726605,0.8760266555183945,2,99179 +163.418471254274,26704.93564484694,0.8775571906354513,2,97955 +163.70348710475014,26567.025940119333,0.8790877257525082,2,96730 +163.9885029552263,26429.248403239664,0.8806182608695652,2,95506 +164.27351880570242,26291.33869851205,0.882148795986622,2,94281 +164.55853465617855,26153.561161632384,0.8836793311036788,2,93057 +164.8435505066547,26015.783624752723,0.8852098662207357,2,91833 +165.12856635713084,25877.873920025108,0.8867404013377925,2,90608 +165.41358220760696,25740.096383145443,0.8882709364548494,2,89384 +165.69859805808312,25602.186678417835,0.8898014715719064,2,88159 +165.98361390855925,25464.408525162864,0.8913320066889632,2,86935 +166.26862975903538,25326.49882043525,0.89286254180602,2,85710 +166.55364560951153,25188.721283555587,0.894393076923077,2,84486 +166.83866145998763,25050.943746675915,0.8959236120401336,2,83262 +167.1236773104638,24913.034041948307,0.8974541471571906,2,82037 +167.40869316093995,24775.256505068643,0.8989846822742475,2,80813 +167.69370901141605,24637.346800341023,0.9005152173913042,2,79588 +167.9787248618922,24499.569263461362,0.9020457525083612,2,78364 +168.26374071236836,24361.659558733754,0.9035762876254182,2,77139 +168.54875656284446,24223.882021854086,0.9051068227424748,2,75915 +168.83377241332062,24086.10448497442,0.9066373578595316,2,74691 +169.11878826379674,23948.194780246802,0.9081678929765885,2,73466 +169.40380411427287,23810.41724336714,0.9096984280936453,2,72242 +169.68881996474903,23672.50753863953,0.9112289632107022,2,71017 +169.97383581522516,23534.730001759865,0.912759498327759,2,69793 +170.2588516657013,23396.82029703225,0.9142900334448159,2,68568 +170.54386751617744,23259.042760152588,0.9158205685618729,2,67344 +170.82888336665357,23121.26522327292,0.9173511036789297,2,66120 +171.1138992171297,22983.355518545304,0.9188816387959865,2,64895 +171.39891506760586,22845.577981665643,0.9204121739130434,2,63671 +171.68393091808198,22707.802646754037,0.9219427090301002,1,62446 +171.9689467685581,22570.843656276473,0.923473244147157,1,61222 +172.25396261903427,22433.75311432626,0.9250037792642141,1,59997 +172.5389784695104,22296.794123848696,0.9265343143812709,1,58773 +172.82399431998653,22159.83513337113,0.9280648494983277,1,57549 +173.10901017046268,22022.74459142092,0.9295953846153846,1,56324 +173.3940260209388,21885.785600943353,0.9311259197324414,1,55100 +173.67904187141494,21748.695058993144,0.9326564548494982,1,53875 +173.9640577218911,21611.736068515576,0.9341869899665552,1,52651 +174.24907357236722,21474.645526565368,0.9357175250836121,1,51426 +174.53408942284335,21337.686536087796,0.9372480602006688,1,50202 +174.8191052733195,21200.727545610236,0.9387785953177257,1,48978 +175.1041211237956,21063.63700366002,0.9403091304347824,1,47753 +175.38913697427176,20926.67801318246,0.9418396655518393,1,46529 +175.67415282474792,20789.58747123225,0.9433702006688963,1,45304 +175.95916867522402,20652.62848075468,0.9449007357859529,1,44080 +176.24418452570018,20515.53793880447,0.9464312709030099,1,42855 +176.52920037617633,20378.578948326907,0.9479618060200669,1,41631 +176.81421622665243,20241.619957849343,0.9494923411371236,1,40407 +177.0992320771286,20104.529415899127,0.9510228762541805,1,39182 +177.38424792760472,19967.570425421563,0.9525534113712374,1,37958 +177.66926377808085,19830.47988347135,0.9540839464882942,1,36733 +177.954279628557,19693.52089299379,0.9556144816053511,1,35509 +178.23929547903313,19556.430351043575,0.9571450167224079,1,34284 +178.52431132950926,19419.47136056601,0.9586755518394647,1,33060 +178.80932717998542,19282.512370088447,0.9602060869565218,1,31836 +179.09434303046154,19145.421828138235,0.9617366220735786,1,30611 +179.37935888093767,19008.46283766067,0.9632671571906354,1,29387 +179.66437473141383,18871.372295710462,0.9647976923076923,1,28162 +179.94939058188996,18734.41330523289,0.9663282274247491,1,26938 +180.2344064323661,18597.322763282682,0.9678587625418059,1,25713 +180.51942228284224,18460.363772805114,0.9693892976588627,1,24489 +180.80443813331837,18323.40478232755,0.9709198327759195,1,23265 +181.0894539837945,18186.314240377338,0.9724503678929765,1,22040 +181.37446983427066,18049.355249899774,0.9739809030100334,1,20816 +181.65948568474678,17912.264707949565,0.9755114381270902,1,19591 +181.9445015352229,17775.305717471998,0.977041973244147,1,18367 +182.22951738569907,17638.21517552179,0.978572508361204,1,17142 +182.5145332361752,17501.25618504422,0.9801030434782608,1,15918 +182.79954908665133,17364.297194566658,0.9816335785953176,1,14694 +183.08456493712748,17227.20665261645,0.9831641137123746,1,13469 +183.36958078760358,17090.24766213888,0.9846946488294313,1,12245 +183.65459663807974,16953.15712018867,0.9862251839464882,1,11020 +183.9396124885559,16816.198129711105,0.9877557190635452,1,9796 +184.224628339032,16679.107587760893,0.9892862541806018,1,8571 +184.50964418950815,16542.14859728333,0.9908167892976588,1,7347 +184.7946600399843,16405.189606805765,0.9923473244147157,1,6123 +185.0796758904604,16268.099064855553,0.9938778595317724,1,4898 +185.36469174093656,16131.140074377987,0.9954083946488294,1,3674 +185.6497075914127,15994.049532427774,0.9969389297658863,1,2449 +185.93472344188882,15857.09054195021,0.9984694648829431,1,1225 186.21973929236498,15720.0,1.0,0,0 diff --git a/p1/pareto_combined_range.png b/p1/pareto_combined_range.png index 26756df..9948596 100644 Binary files a/p1/pareto_combined_range.png and b/p1/pareto_combined_range.png differ diff --git a/p1/pareto_front_data.csv b/p1/pareto_front_data.csv index 41d47ac..b1668b1 100644 --- a/p1/pareto_front_data.csv +++ b/p1/pareto_front_data.csv @@ -1,218 +1,218 @@ years,energy_PJ,elevator_fraction,sites_used,rocket_launches -100.80160320641282,31721.015809442823,0.5413046092184368,10,366957 -101.20240480961924,31637.791423463375,0.5434569138276553,10,365235 -101.60320641282566,31554.5415104297,0.5456092184368738,10,363513 -102.00400801603206,31471.317124450256,0.5477615230460922,10,361791 -102.40480961923848,31388.092738470812,0.5499138276553106,10,360069 -102.8056112224449,31304.908639411875,0.552066132264529,10,358348 -103.2064128256513,31221.684253432435,0.5542184368737475,10,356626 -103.60721442885772,31138.459867452988,0.556370741482966,10,354904 -104.00801603206413,31055.235481473548,0.5585230460921844,10,353182 -104.40881763527054,30971.98556843986,0.5606753507014028,10,351460 -104.80961923847696,30888.761182460417,0.5628276553106213,10,349738 -105.21042084168337,30805.602610455724,0.5649799599198397,10,348017 -105.61122244488978,30723.31263851132,0.5671322645290581,9,346295 -106.0120240480962,30644.663419167766,0.5692845691382766,9,344573 -106.41282565130261,30566.014199824203,0.5714368737474951,9,342851 -106.81362725450902,30487.364980480637,0.5735891783567134,9,341129 -107.21442885771543,30408.703796829792,0.5757414829659319,9,339407 -107.61523046092185,30330.054577486233,0.5778937875751503,9,337685 -108.01603206412825,30251.469665145545,0.5800460921843688,9,335964 -108.41683366733467,30172.808481494696,0.5821983967935872,9,334242 -108.81763527054107,30094.15926215113,0.5843507014028057,9,332520 -109.21843687374749,30015.510042807575,0.5865030060120241,9,330798 -109.61923847695391,29936.84885915672,0.5886553106212425,9,329076 -110.02004008016033,29858.19963981316,0.590807615230461,9,327354 -110.42084168336673,29779.614727472468,0.5929599198396793,9,325633 -110.82164328657315,29700.965508128913,0.5951122244488979,9,323911 -111.22244488977955,29624.06439991274,0.5972645290581162,8,322189 -111.62324649298597,29547.38750240176,0.5994168336673347,8,320467 -112.02404809619239,29470.710604890784,0.6015691382765531,8,318745 -112.4248496993988,29394.027202786925,0.6037214428857716,8,317023 -112.82565130260521,29317.41392981451,0.60587374749499,8,315302 -113.22645290581163,29240.73703230353,0.6080260521042085,8,313580 -113.62725450901803,29164.060134792555,0.6101783567134269,8,311858 -114.02805611222445,29087.376732688695,0.6123306613226454,8,310136 -114.42885771543087,29010.699835177722,0.6144829659318638,8,308414 -114.82965931863727,28934.02293766674,0.6166352705410821,8,306692 -115.23046092184369,28857.33953556288,0.6187875751503006,8,304970 -115.6312625250501,28780.726262590473,0.620939879759519,8,303249 -116.03206412825651,28704.049365079496,0.6230921843687374,8,301527 -116.43286573146293,28627.37246756852,0.6252444889779559,8,299805 -116.83366733466934,28550.71043327357,0.6273967935871744,7,298083 -117.23446893787576,28474.171496392344,0.6295490981963928,7,296361 -117.63527054108216,28397.63255951111,0.6317014028056112,7,294639 -118.03607214428858,28321.151044238755,0.6338537074148296,7,292918 -118.43687374749499,28244.612107357527,0.636006012024048,7,291196 -118.8376753507014,28168.073170476295,0.6381583166332665,7,289474 -119.23847695390782,28091.52808094257,0.640310621242485,7,287752 -119.63927855711422,28014.989144061346,0.6424629258517034,7,286030 -120.04008016032064,27938.45020718012,0.6446152304609218,7,284308 -120.44088176352706,27861.911270298886,0.6467675350701403,7,282586 -120.84168336673346,27785.429755026526,0.6489198396793586,7,280865 -121.24248496993988,27708.890818145297,0.6510721442885772,7,279143 -121.6432865731463,27632.351881264072,0.6532244488977956,7,277421 -122.0440881763527,27555.80679173035,0.655376753507014,7,275699 -122.44488977955912,27479.267854849113,0.6575290581162324,7,273977 -122.84569138276554,27402.72891796789,0.659681362725451,7,272255 -123.24649298597194,27326.25355534803,0.6618336673346693,7,270534 -123.64729458917836,27249.903497244704,0.6639859719438878,6,268812 -124.04809619238478,27173.62124306671,0.6661382765531062,6,267090 -124.44889779559118,27097.338988888714,0.6682905811623246,6,265368 -124.8496993987976,27021.051174858923,0.6704428857715431,6,263646 -125.250501002004,26944.76892068093,0.6725951903807614,6,261924 -125.65130260521042,26868.55014196419,0.67474749498998,6,260203 -126.05210420841684,26792.262327934397,0.6768997995991984,6,258481 -126.45290581162325,26715.980073756407,0.6790521042084169,6,256759 -126.85370741482966,26639.69781957841,0.6812044088176353,6,255037 -127.25450901803607,26563.415565400413,0.6833567134268537,6,253315 -127.65531062124248,26487.127751370626,0.6855090180360721,6,251593 -128.0561122244489,26410.84549719263,0.6876613226452907,6,249871 -128.4569138276553,26334.626718475887,0.689813627254509,6,248150 -128.85771543086173,26258.3389044461,0.6919659318637276,6,246428 -129.25851703406815,26182.0566502681,0.6941182364729459,6,244706 -129.65931863727454,26105.774396090103,0.6962705410821642,6,242984 -130.06012024048096,26029.49214191211,0.6984228456913827,6,241262 -130.46092184368737,25953.20432788232,0.7005751503006011,6,239540 -130.8617234468938,25877.277074070076,0.7027274549098197,5,237819 -131.2625250501002,25801.708924852963,0.704879759519038,5,236097 -131.66332665330663,25726.13667195241,0.7070320641282566,5,234375 -132.06412825651302,25650.568522735288,0.7091843687374748,5,232653 -132.46492985971943,25575.00037351817,0.7113366733466934,5,230931 -132.86573146292585,25499.432224301057,0.7134889779559117,5,229209 -133.26653306613227,25423.8599714005,0.7156412825651303,5,227487 -133.6673346693387,25348.355006410962,0.7177935871743487,5,225766 -134.06813627254508,25272.78685719384,0.719945891783567,5,224044 -134.46893787575152,25197.214604293287,0.7220981963927856,5,222322 -134.8697394789579,25121.646455076167,0.7242505010020039,5,220600 -135.27054108216433,25046.078305859057,0.7264028056112224,5,218878 -135.67134268537075,24970.506052958503,0.728555110220441,5,217156 -136.07214428857716,24895.00108796896,0.7307074148296593,5,215435 -136.47294589178358,24819.432938751845,0.7328597194388778,5,213713 -136.87374749498997,24743.864789534724,0.7350120240480961,5,211991 -137.2745490981964,24668.29253663417,0.7371643286573146,5,210269 -137.6753507014028,24592.724387417056,0.739316633266533,5,208547 -138.07615230460922,24517.15623819994,0.7414689378757515,5,206825 -138.47695390781564,24441.647169526965,0.74362124248497,5,205104 -138.87775551102203,24366.079020309848,0.7457735470941883,5,203382 -139.27855711422845,24291.37393740676,0.7479258517034068,4,201660 -139.67935871743487,24216.987635529404,0.7500781563126253,4,199938 -140.08016032064128,24142.599280007358,0.7522304609218436,4,198216 -140.4809619238477,24068.212978130003,0.7543827655310622,4,196494 -140.88176352705412,23993.826676252647,0.7565350701402805,4,194772 -141.28256513026054,23919.500992448495,0.7586873747494991,4,193051 -141.68336673346693,23845.114690571136,0.7608396793587173,4,191329 -142.08416833667334,23770.728388693777,0.7629919839679359,4,189607 -142.48496993987976,23696.340033171735,0.7651442885771543,4,187885 -142.88577154308618,23621.95373129438,0.7672965931863728,4,186163 -143.2865731462926,23547.567429417024,0.7694488977955912,4,184441 -143.68737474949899,23473.243799257554,0.7716012024048096,4,182720 -144.0881763527054,23398.855443735512,0.773753507014028,4,180998 -144.48897795591182,23324.469141858157,0.7759058116232466,4,179276 -144.88977955911824,23250.0828399808,0.7780581162324649,4,177554 -145.29058116232466,23175.69448445876,0.7802104208416835,4,175832 -145.69138276553107,23101.308182581404,0.7823627254509018,4,174110 -146.0921843687375,23026.92188070405,0.7845150300601204,4,172388 -146.49298597194388,22952.59825054458,0.7866673346693386,4,170667 -146.8937875751503,22878.209895022537,0.7888196392785571,4,168945 -147.29458917835672,22803.82359314518,0.7909719438877756,4,167223 -147.69539078156313,22729.437291267826,0.793124248496994,4,165501 -148.09619238476955,22655.04893574578,0.7952765531062125,4,163779 -148.49699398797594,22580.760701549138,0.7974288577154308,3,162057 -148.89779559118236,22506.82485183411,0.7995811623246493,3,160336 -149.29859719438878,22432.826510012335,0.8017334669338678,3,158614 -149.6993987975952,22358.826653379274,0.8038857715430862,3,156892 -150.1002004008016,22284.828311557496,0.8060380761523047,3,155170 -150.501002004008,22210.829969735714,0.8081903807615229,3,153448 -150.90180360721445,22136.83011310266,0.8103426853707416,3,151726 -151.30260521042084,22062.894263387632,0.8124949899799598,3,150005 -151.70340681362725,21988.89592156585,0.8146472945891784,3,148283 -152.10420841683367,21914.89606493279,0.8167995991983968,3,146561 -152.5050100200401,21840.897723111015,0.8189519038076153,3,144839 -152.9058116232465,21766.899381289233,0.8211042084168337,3,143117 -153.3066132264529,21692.901039467455,0.8232565130260521,3,141395 -153.7074148296593,21618.901182834394,0.8254088176352705,3,139673 -154.10821643286573,21544.96533311937,0.8275611222444891,3,137952 -154.50901803607215,21470.966991297588,0.8297134268537074,3,136230 -154.90981963927857,21396.967134664534,0.831865731462926,3,134508 -155.31062124248496,21322.96879284275,0.8340180360721442,3,132786 -155.7114228456914,21248.97045102097,0.8361703406813629,3,131064 -156.1122244488978,21174.97210919919,0.8383226452905811,3,129342 -156.5130260521042,21101.03474467289,0.8404749498997997,3,127621 -156.91382765531063,21027.036402851107,0.8426272545090181,3,125899 -157.31462925851704,20953.038061029325,0.8447795591182367,3,124177 -157.71543086172346,20879.03820439627,0.846931863727455,3,122455 -158.11623246492985,20805.039862574486,0.8490841683366732,3,120733 -158.51703406813627,20731.041520752704,0.8512364729458918,3,119011 -158.9178356713427,20657.04166411965,0.8533887775551101,3,117289 -159.3186372745491,20583.582596109063,0.8555410821643287,2,115568 -159.71943887775552,20510.89248092589,0.8576933867735471,2,113846 -160.1202404809619,20438.202365742713,0.8598456913827655,2,112124 -160.52104208416833,20365.512034880972,0.8619979959919839,2,110402 -160.92184368737475,20292.8219196978,0.8641503006012023,2,108680 -161.32264529058116,20220.13180451462,0.8663026052104208,2,106958 -161.72344689378758,20147.50331619328,0.8684549098196394,2,105237 -162.124248496994,20074.813201010107,0.8706072144288577,2,103515 -162.52505010020042,20002.123085826937,0.8727595190380762,2,101793 -162.9258517034068,19929.43297064376,0.8749118236472945,2,100071 -163.32665330661322,19856.74263978202,0.877064128256513,2,98349 -163.72745490981964,19784.052524598847,0.8792164328657314,2,96627 -164.12825651302606,19711.424251956072,0.8813687374749499,2,94906 -164.52905811623248,19638.73392109433,0.8835210420841684,2,93184 -164.92985971943887,19566.043805911155,0.8856733466933867,2,91462 -165.3306613226453,19493.35369072798,0.8878256513026053,2,89740 -165.7314629258517,19420.663575544808,0.8899779559118237,2,88018 -166.13226452905812,19347.973244683064,0.892130260521042,2,86296 -166.53306613226454,19275.283129499894,0.8942825651302606,2,84574 -166.93386773547093,19202.654856857116,0.8964348697394788,2,82853 -167.33466933867737,19129.964525995376,0.8985871743486975,2,81131 -167.73547094188376,19057.2744108122,0.9007394789579157,2,79409 -168.13627254509018,18984.58429562903,0.9028917835671343,2,77687 -168.5370741482966,18911.893964767285,0.9050440881763527,2,75965 -168.93787575150301,18839.20384958411,0.9071963927855712,2,74243 -169.33867735470943,18766.575576941337,0.9093486973947896,2,72522 -169.73947895791582,18693.885461758164,0.911501002004008,2,70800 -170.14028056112227,18621.19513089642,0.9136533066132265,2,69078 -170.54108216432866,18548.505015713246,0.915805611222445,2,67356 -170.94188376753507,18475.814900530073,0.9179579158316633,2,65634 -171.3426853707415,18403.124569668333,0.9201102204408819,2,63912 -171.74348697394788,18330.54143105545,0.9222625250501001,1,62190 -172.14428857715433,18258.315830301275,0.9244148296593188,1,60469 -172.54509018036072,18186.02860268526,0.926567134268537,1,58747 -172.94589178356713,18113.741375069247,0.9287194388777555,1,57025 -173.34669338677355,18041.454147453234,0.930871743486974,1,55303 -173.74749498997994,17969.166919837222,0.9330240480961923,1,53581 -174.1482965931864,17896.87969222121,0.9351763527054109,1,51859 -174.54909819639278,17824.65409146703,0.9373286573146292,1,50138 -174.9498997995992,17752.366863851017,0.9394809619238477,1,48416 -175.3507014028056,17680.079636235005,0.9416332665330662,1,46694 -175.75150300601203,17607.792408618992,0.9437855711422846,1,44972 -176.15230460921845,17535.50518100298,0.9459378757515031,1,43250 -176.55310621242484,17463.217953386964,0.9480901803607213,1,41528 -176.95390781563128,17390.992352632788,0.95024248496994,1,39807 -177.35470941883767,17318.70512501677,0.9523947895791582,1,38085 -177.7555110220441,17246.41789740076,0.9545470941883768,1,36363 -178.1563126252505,17174.130669784747,0.9566993987975952,1,34641 -178.5571142284569,17101.843442168734,0.9588517034068136,1,32919 -178.95791583166334,17029.556214552722,0.9610040080160321,1,31197 -179.35871743486973,16957.26898693671,0.9631563126252505,1,29475 -179.75951903807615,16885.043386182526,0.9653086172344689,1,27754 -180.16032064128257,16812.756158566517,0.9674609218436875,1,26032 -180.56112224448898,16740.468930950505,0.9696132264529058,1,24310 -180.9619238476954,16668.181703334492,0.9717655310621244,1,22588 -181.3627254509018,16595.894475718476,0.9739178356713426,1,20866 -181.76352705410824,16523.607248102468,0.9760701402805613,1,19144 -182.16432865731463,16451.381647348284,0.9782224448897795,1,17423 -182.56513026052104,16379.094419732273,0.980374749498998,1,15701 -182.96593186372746,16306.80719211626,0.9825270541082165,1,13979 -183.36673346693385,16234.519964500247,0.9846793587174348,1,12257 -183.7675350701403,16162.232736884236,0.9868316633266534,1,10535 -184.1683366733467,16089.945509268222,0.9889839679358717,1,8813 -184.5691382765531,16017.65828165221,0.9911362725450902,1,7091 -184.96993987975952,15945.43268089803,0.9932885771543087,1,5370 -185.37074148296594,15873.145453282015,0.9954408817635271,1,3648 -185.77154308617236,15800.858225666005,0.9975931863727456,1,1926 -186.17234468937875,15728.570998049989,0.9997454909819639,1,204 +100.80160320641282,58502.66949335297,0.5413046092184368,10,366957 +101.20240480961924,58278.265807082054,0.5434569138276553,10,365235 +101.60320641282566,58053.7879437129,0.5456092184368738,10,363513 +102.00400801603206,57829.38425744196,0.5477615230460922,10,361791 +102.40480961923848,57604.980571171036,0.5499138276553106,10,360069 +102.8056112224449,57380.64638263256,0.552066132264529,10,358348 +103.2064128256513,57156.24269636164,0.5542184368737475,10,356626 +103.60721442885772,56931.8390100907,0.556370741482966,10,354904 +104.00801603206413,56707.43532381976,0.5585230460921844,10,353182 +104.40881763527054,56482.95746045063,0.5606753507014028,10,351460 +104.80961923847696,56258.55377417968,0.5628276553106213,10,349738 +105.21042084168337,56034.29376273941,0.5649799599198397,10,348017 +105.61122244488978,55812.61954842115,0.5671322645290581,9,346295 +106.0120240480962,55601.578308804026,0.5692845691382766,9,344573 +106.41282565130261,55390.53706918689,0.5714368737474951,9,342851 +106.81362725450902,55179.495829569765,0.5735891783567134,9,341129 +107.21442885771543,54968.42002485045,0.5757414829659319,9,339407 +107.61523046092185,54757.378785233304,0.5778937875751503,9,337685 +108.01603206412825,54546.47681911395,0.5800460921843688,9,335964 +108.41683366733467,54335.401014394636,0.5821983967935872,9,334242 +108.81763527054107,54124.3597747775,0.5843507014028057,9,332520 +109.21843687374749,53913.31853516038,0.5865030060120241,9,330798 +109.61923847695391,53702.24273044106,0.5886553106212425,9,329076 +110.02004008016033,53491.20149082393,0.590807615230461,9,327354 +110.42084168336673,53280.29952470457,0.5929599198396793,9,325633 +110.82164328657315,53069.25828508744,0.5951122244488979,9,323911 +111.22244488977955,52863.28684559116,0.5972645290581162,8,322189 +111.62324649298597,52657.96550341282,0.5994168336673347,8,320467 +112.02404809619239,52452.64416123447,0.6015691382765531,8,318745 +112.4248496993988,52247.304087580065,0.6037214428857716,8,317023 +112.82565130260521,52042.12003969622,0.60587374749499,8,315302 +113.22645290581163,51836.79869751787,0.6080260521042085,8,313580 +113.62725450901803,51631.47735533953,0.6101783567134269,8,311858 +114.02805611222445,51426.13728168512,0.6123306613226454,8,310136 +114.42885771543087,51220.815939506785,0.6144829659318638,8,308414 +114.82965931863727,51015.49459732843,0.6166352705410821,8,306692 +115.23046092184369,50810.15452367403,0.6187875751503006,8,304970 +115.6312625250501,50604.97047579018,0.620939879759519,8,303249 +116.03206412825651,50399.64913361183,0.6230921843687374,8,301527 +116.43286573146293,50194.32779143348,0.6252444889779559,8,299805 +116.83366733466934,49989.04953865401,0.6273967935871744,7,298083 +117.23446893787576,49784.12734113637,0.6295490981963928,7,296361 +117.63527054108216,49579.20514361874,0.6317014028056112,7,294639 +118.03607214428858,49374.40238168484,0.6338537074148296,7,292918 +118.43687374749499,49169.48018416721,0.636006012024048,7,291196 +118.8376753507014,48964.55798664957,0.6381583166332665,7,289474 +119.23847695390782,48759.61807588206,0.640310621242485,7,287752 +119.63927855711422,48554.69587836443,0.6424629258517034,7,286030 +120.04008016032064,48349.773680846796,0.6446152304609218,7,284308 +120.44088176352706,48144.85148332917,0.6467675350701403,7,282586 +120.84168336673346,47940.04872139528,0.6489198396793586,7,280865 +121.24248496993988,47735.12652387765,0.6510721442885772,7,279143 +121.6432865731463,47530.20432636001,0.6532244488977956,7,277421 +122.0440881763527,47325.26441559249,0.655376753507014,7,275699 +122.44488977955912,47120.34221807486,0.6575290581162324,7,273977 +122.84569138276554,46915.420020557234,0.659681362725451,7,272255 +123.24649298597194,46710.634971873216,0.6618336673346693,7,270534 +123.64729458917836,46506.25904741148,0.6639859719438878,6,268812 +124.04809619238478,46302.079117585025,0.6661382765531062,6,267090 +124.44889779559118,46097.89918775857,0.6682905811623246,6,265368 +124.8496993987976,45893.70325892633,0.6704428857715431,6,263646 +125.250501002004,45689.52332909988,0.6725951903807614,6,261924 +125.65130260521042,45485.4802623997,0.67474749498998,6,260203 +126.05210420841684,45281.28433356746,0.6768997995991984,6,258481 +126.45290581162325,45077.10440374101,0.6790521042084169,6,256759 +126.85370741482966,44872.92447391456,0.6812044088176353,6,255037 +127.25450901803607,44668.744544088106,0.6833567134268537,6,253315 +127.65531062124248,44464.548615255866,0.6855090180360721,6,251593 +128.0561122244489,44260.36868542941,0.6876613226452907,6,249871 +128.4569138276553,44056.32561872923,0.689813627254509,6,248150 +128.85771543086173,43852.129689896996,0.6919659318637276,6,246428 +129.25851703406815,43647.94976007055,0.6941182364729459,6,244706 +129.65931863727454,43443.7698302441,0.6962705410821642,6,242984 +130.06012024048096,43239.589900417646,0.6984228456913827,6,241262 +130.46092184368737,43035.3939715854,0.7005751503006011,6,239540 +130.8617234468938,42832.192854651665,0.7027274549098197,5,237819 +131.2625250501002,42630.07532325409,0.704879759519038,5,236097 +131.66332665330663,42427.94599839402,0.7070320641282566,5,234375 +132.06412825651302,42225.82846699645,0.7091843687374748,5,232653 +132.46492985971943,42023.71093559887,0.7113366733466934,5,230931 +132.86573146292585,41821.5934042013,0.7134889779559117,5,229209 +133.26653306613227,41619.46407934123,0.7156412825651303,5,227487 +133.6673346693387,41417.482569961256,0.7177935871743487,5,225766 +134.06813627254508,41215.365038563694,0.719945891783567,5,224044 +134.46893787575152,41013.23571370362,0.7220981963927856,5,222322 +134.8697394789579,40811.118182306054,0.7242505010020039,5,220600 +135.27054108216433,40609.000650908485,0.7264028056112224,5,218878 +135.67134268537075,40406.8713260484,0.728555110220441,5,217156 +136.07214428857716,40204.889816668445,0.7307074148296593,5,215435 +136.47294589178358,40002.772285270876,0.7328597194388778,5,213713 +136.87374749498997,39800.65475387331,0.7350120240480961,5,211991 +137.2745490981964,39598.525429013236,0.7371643286573146,5,210269 +137.6753507014028,39396.40789761566,0.739316633266533,5,208547 +138.07615230460922,39194.29036621809,0.7414689378757515,5,206825 +138.47695390781564,38992.29706337563,0.74362124248497,5,205104 +138.87775551102203,38790.17953197806,0.7457735470941883,5,203382 +139.27855711422845,38590.54805369434,0.7479258517034068,4,201660 +139.67935871743487,38391.83482068189,0.7500781563126253,4,199938 +140.08016032064128,38193.11569932123,0.7522304609218436,4,198216 +140.4809619238477,37994.402466308784,0.7543827655310622,4,196494 +140.88176352705412,37795.68923329634,0.7565350701402805,4,194772 +141.28256513026054,37597.10465767472,0.7586873747494991,4,193051 +141.68336673346693,37398.39142466227,0.7608396793587173,4,191329 +142.08416833667334,37199.67819164982,0.7629919839679359,4,189607 +142.48496993987976,37000.959070289166,0.7651442885771543,4,187885 +142.88577154308618,36802.245837276714,0.7672965931863728,4,186163 +143.2865731462926,36603.53260426427,0.7694488977955912,4,184441 +143.68737474949899,36404.95391699087,0.7716012024048096,4,182720 +144.0881763527054,36206.2347956302,0.773753507014028,4,180998 +144.48897795591182,36007.52156261776,0.7759058116232466,4,179276 +144.88977955911824,35808.808329605316,0.7780581162324649,4,177554 +145.29058116232466,35610.08920824465,0.7802104208416835,4,175832 +145.69138276553107,35411.3759752322,0.7823627254509018,4,174110 +146.0921843687375,35212.662742219756,0.7845150300601204,4,172388 +146.49298597194388,35014.084054946354,0.7866673346693386,4,170667 +146.8937875751503,34815.36493358569,0.7888196392785571,4,168945 +147.29458917835672,34616.65170057324,0.7909719438877756,4,167223 +147.69539078156313,34417.938467560794,0.793124248496994,4,165501 +148.09619238476955,34219.21934620013,0.7952765531062125,4,163779 +148.49699398797594,34020.787953326995,0.7974288577154308,3,162057 +148.89779559118236,33823.32372184254,0.7995811623246493,3,160336 +149.29859719438878,33625.72546080977,0.8017334669338678,3,158614 +149.6993987975952,33428.12286000098,0.8038857715430862,3,156892 +150.1002004008016,33230.524598968215,0.8060380761523047,3,155170 +150.501002004008,33032.92633793545,0.8081903807615229,3,153448 +150.90180360721445,32835.32373712666,0.8103426853707416,3,151726 +151.30260521042084,32637.859505642202,0.8124949899799598,3,150005 +151.70340681362725,32440.261244609435,0.8146472945891784,3,148283 +152.10420841683367,32242.658643800638,0.8167995991983968,3,146561 +152.5050100200401,32045.060382767875,0.8189519038076153,3,144839 +152.9058116232465,31847.462121735112,0.8211042084168337,3,143117 +153.3066132264529,31649.863860702346,0.8232565130260521,3,141395 +153.7074148296593,31452.261259893556,0.8254088176352705,3,139673 +154.10821643286573,31254.7970284091,0.8275611222444891,3,137952 +154.50901803607215,31057.198767376332,0.8297134268537074,3,136230 +154.90981963927857,30859.59616656754,0.831865731462926,3,134508 +155.31062124248496,30661.997905534772,0.8340180360721442,3,132786 +155.7114228456914,30464.39964450201,0.8361703406813629,3,131064 +156.1122244488978,30266.801383469236,0.8383226452905811,3,129342 +156.5130260521042,30069.33281220876,0.8404749498997997,3,127621 +156.91382765531063,29871.734551175996,0.8426272545090181,3,125899 +157.31462925851704,29674.13629014323,0.8447795591182367,3,124177 +157.71543086172346,29476.533689334432,0.846931863727455,3,122455 +158.11623246492985,29278.93542830167,0.8490841683366732,3,120733 +158.51703406813627,29081.3371672689,0.8512364729458918,3,119011 +158.9178356713427,28883.734566460105,0.8533887775551101,3,117289 +159.3186372745491,28687.63682304137,0.8555410821643287,2,115568 +159.71943887775552,28493.788026537677,0.8576933867735471,2,113846 +160.1202404809619,28299.939230033986,0.8598456913827655,2,112124 +160.52104208416833,28106.089817154992,0.8619979959919839,2,110402 +160.92184368737475,27912.24102065131,0.8641503006012023,2,108680 +161.32264529058116,27718.39222414762,0.8663026052104208,2,106958 +161.72344689378758,27524.67497911658,0.8684549098196394,2,105237 +162.124248496994,27330.826182612884,0.8706072144288577,2,103515 +162.52505010020042,27136.977386109204,0.8727595190380762,2,101793 +162.9258517034068,26943.128589605512,0.8749118236472945,2,100071 +163.32665330661322,26749.27917672652,0.877064128256513,2,98349 +163.72745490981964,26555.43038022283,0.8792164328657314,2,96627 +164.12825651302606,26361.71375156709,0.8813687374749499,2,94906 +164.52905811623248,26167.864338688098,0.8835210420841684,2,93184 +164.92985971943887,25974.01554218441,0.8856733466933867,2,91462 +165.3306613226453,25780.166745680723,0.8878256513026053,2,89740 +165.7314629258517,25586.317949177035,0.8899779559118237,2,88018 +166.13226452905812,25392.468536298045,0.892130260521042,2,86296 +166.53306613226454,25198.619739794354,0.8942825651302606,2,84574 +166.93386773547093,25004.90311113861,0.8964348697394788,2,82853 +167.33466933867737,24811.053698259624,0.8985871743486975,2,81131 +167.73547094188376,24617.204901755933,0.9007394789579157,2,79409 +168.13627254509018,24423.35610525225,0.9028917835671343,2,77687 +168.5370741482966,24229.50669237326,0.9050440881763527,2,75965 +168.93787575150301,24035.657895869568,0.9071963927855712,2,74243 +169.33867735470943,23841.941267213828,0.9093486973947896,2,72522 +169.73947895791582,23648.092470710137,0.911501002004008,2,70800 +170.14028056112227,23454.243057831147,0.9136533066132265,2,69078 +170.54108216432866,23260.39426132746,0.915805611222445,2,67356 +170.94188376753507,23066.54546482377,0.9179579158316633,2,65634 +171.3426853707415,22872.69605194478,0.9201102204408819,2,63912 +171.74348697394788,22679.15297759127,0.9222625250501001,1,62190 +172.14428857715433,22486.587121625835,0.9244148296593188,1,60469 +172.54509018036072,22293.889714187746,0.926567134268537,1,58747 +172.94589178356713,22101.19230674966,0.9287194388777555,1,57025 +173.34669338677355,21908.494899311576,0.930871743486974,1,55303 +173.74749498997994,21715.797491873487,0.9330240480961923,1,53581 +174.1482965931864,21523.10008443541,0.9351763527054109,1,51859 +174.54909819639278,21330.53422846997,0.9373286573146292,1,50138 +174.9498997995992,21137.836821031884,0.9394809619238477,1,48416 +175.3507014028056,20945.1394135938,0.9416332665330662,1,46694 +175.75150300601203,20752.442006155714,0.9437855711422846,1,44972 +176.15230460921845,20559.74459871763,0.9459378757515031,1,43250 +176.55310621242484,20367.047191279544,0.9480901803607213,1,41528 +176.95390781563128,20174.481335314107,0.95024248496994,1,39807 +177.35470941883767,19981.78392787602,0.9523947895791582,1,38085 +177.7555110220441,19789.086520437937,0.9545470941883768,1,36363 +178.1563126252505,19596.38911299985,0.9566993987975952,1,34641 +178.5571142284569,19403.691705561763,0.9588517034068136,1,32919 +178.95791583166334,19210.99429812368,0.9610040080160321,1,31197 +179.35871743486973,19018.296890685597,0.9631563126252505,1,29475 +179.75951903807615,18825.731034720153,0.9653086172344689,1,27754 +180.16032064128257,18633.03362728207,0.9674609218436875,1,26032 +180.56112224448898,18440.336219843986,0.9696132264529058,1,24310 +180.9619238476954,18247.638812405905,0.9717655310621244,1,22588 +181.3627254509018,18054.941404967816,0.9739178356713426,1,20866 +181.76352705410824,17862.243997529735,0.9760701402805613,1,19144 +182.16432865731463,17669.67814156429,0.9782224448897795,1,17423 +182.56513026052104,17476.980734126206,0.980374749498998,1,15701 +182.96593186372746,17284.283326688124,0.9825270541082165,1,13979 +183.36673346693385,17091.585919250036,0.9846793587174348,1,12257 +183.7675350701403,16898.888511811954,0.9868316633266534,1,10535 +184.1683366733467,16706.19110437387,0.9889839679358717,1,8813 +184.5691382765531,16513.493696935784,0.9911362725450902,1,7091 +184.96993987975952,16320.927840970344,0.9932885771543087,1,5370 +185.37074148296594,16128.230433532259,0.9954408817635271,1,3648 +185.77154308617236,15935.533026094176,0.9975931863727456,1,1926 +186.17234468937875,15742.835618656089,0.9997454909819639,1,204 186.5731462925852,15720.0,1.0,0,0 186.97394789579158,15720.0,1.0,0,0 187.374749498998,15720.0,1.0,0,0 diff --git a/p1/pareto_knee_analysis.png b/p1/pareto_knee_analysis.png index 364785d..a039748 100644 Binary files a/p1/pareto_knee_analysis.png and b/p1/pareto_knee_analysis.png differ diff --git a/p1/pareto_optimization.py b/p1/pareto_optimization.py index 787d90c..579c28a 100644 --- a/p1/pareto_optimization.py +++ b/p1/pareto_optimization.py @@ -37,8 +37,8 @@ ELEVATOR_SPECIFIC_ENERGY = 157.2e9 # J per metric ton (157.2 MJ/kg * 1000) # 火箭参数 PAYLOAD_PER_LAUNCH = 125 # metric tons per launch -ISP = 450 -SPECIFIC_FUEL_ENERGY = 15.5e6 # J/kg +ISP = 363 # 比冲 (秒) - 液氧甲烷 (LOX/CH4, Raptor-class) +SPECIFIC_FUEL_ENERGY = 11.9e6 # J/kg ALPHA = 0.10 NUM_STAGES = 3 DELTA_V_BASE = 13300 # m/s diff --git a/p1/rocket_launch_scenario.py b/p1/rocket_launch_scenario.py index 4e9ff3f..baba2fb 100644 --- a/p1/rocket_launch_scenario.py +++ b/p1/rocket_launch_scenario.py @@ -35,8 +35,8 @@ PAYLOAD_PER_LAUNCH = 125 # metric tons per launch (average of 100-150) TOTAL_LAUNCHES_NEEDED = TOTAL_PAYLOAD / PAYLOAD_PER_LAUNCH # 800,000 launches # 火箭参数 -ISP = 450 # 比冲 (秒) - 液氧液氢 -SPECIFIC_FUEL_ENERGY = 15.5e6 # J/kg 燃料比能量 +ISP = 363 # 比冲 (秒) - 液氧甲烷 (LOX/CH4, Raptor-class) +SPECIFIC_FUEL_ENERGY = 11.9e6 # J/kg 燃料比能量 ALPHA = 0.10 # 结构系数 NUM_STAGES = 3 # 3级火箭 diff --git a/p1/sensitivity_alpha.csv b/p1/sensitivity_alpha.csv new file mode 100644 index 0000000..201b52d --- /dev/null +++ b/p1/sensitivity_alpha.csv @@ -0,0 +1,10 @@ +alpha,fuel_ratio,min_timeline,optimal_T_lambda504,optimal_E_lambda504 +0.06,63.02605457895038,101.10220440881763,101.10220440881763,43868.89867149817 +0.07,68.29395722323875,101.10220440881763,101.10220440881763,46867.31671096497 +0.08,74.20197456904802,101.10220440881763,101.10220440881763,50235.617816131955 +0.09,80.85242443796794,101.10220440881763,101.10220440881763,54033.847318345346 +0.1,88.36809547494757,101.10220440881763,138.51371083876296,38973.75515736591 +0.11000000000000001,96.89721699661537,101.10220440881763,185.65220894049406,16023.925174458536 +0.12000000000000001,106.61986205811633,101.10220440881763,185.65220894049406,16059.242009669968 +0.13,117.75626714631346,101.10220440881763,186.40043906909295,15720.0 +0.14,130.57774039779378,101.10220440881763,186.40043906909295,15720.0 diff --git a/p1/sensitivity_analysis.png b/p1/sensitivity_analysis.png new file mode 100644 index 0000000..cea9356 Binary files /dev/null and b/p1/sensitivity_analysis.png differ diff --git a/p1/sensitivity_analysis.py b/p1/sensitivity_analysis.py new file mode 100644 index 0000000..f4d4938 --- /dev/null +++ b/p1/sensitivity_analysis.py @@ -0,0 +1,763 @@ +""" +Task 1 Sensitivity Analysis for Moon Colony Logistics + +This module performs comprehensive sensitivity analysis on key model parameters: +1. Rocket payload capacity (100-150 tons, as specified in problem) +2. Elevator capacity (±20%) +3. Launch frequency (0.5-2 launches/day) +4. Engine technology (Isp variations) +5. Structural coefficient α + +Author: MCM 2026 Team +""" + +import numpy as np +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +from matplotlib import rcParams +import pandas as pd +from typing import Dict, List, Tuple, Optional +from dataclasses import dataclass +import warnings +warnings.filterwarnings('ignore') + +# Font settings +rcParams['font.sans-serif'] = ['Arial Unicode MS', 'DejaVu Sans', 'SimHei'] +rcParams['axes.unicode_minus'] = False + +# ============== Physical Constants ============== +G0 = 9.81 # m/s² +OMEGA_EARTH = 7.27e-5 # rad/s +R_EARTH = 6.371e6 # m + +# Baseline Mission parameters +TOTAL_PAYLOAD = 100e6 # 100 million metric tons + +# Baseline Space Elevator parameters +BASELINE_NUM_ELEVATORS = 3 +BASELINE_ELEVATOR_CAPACITY_PER_YEAR = 179000 # metric tons per elevator per year +BASELINE_ELEVATOR_SPECIFIC_ENERGY = 157.2e9 # J per metric ton + +# Baseline Rocket parameters +BASELINE_PAYLOAD_PER_LAUNCH = 125 # metric tons (range: 100-150) +BASELINE_ISP = 363 # seconds (LOX/CH4) +BASELINE_SPECIFIC_FUEL_ENERGY = 11.9e6 # J/kg +BASELINE_ALPHA = 0.10 # structural coefficient +BASELINE_NUM_STAGES = 3 +BASELINE_DELTA_V = 13300 # m/s + +# Baseline Launch frequency +BASELINE_LAUNCHES_PER_DAY = 1 # per site + + +# ============== Launch Sites ============== +@dataclass +class LaunchSite: + name: str + short_name: str + latitude: float + + @property + def abs_latitude(self) -> float: + return abs(self.latitude) + + def delta_v_loss(self, omega=OMEGA_EARTH, r=R_EARTH) -> float: + v_equator = omega * r + v_site = omega * r * np.cos(np.radians(self.abs_latitude)) + return v_equator - v_site + + +LAUNCH_SITES = [ + LaunchSite("Kourou", "Kourou", 5.2), + LaunchSite("SDSC", "SDSC", 13.7), + LaunchSite("Texas", "Texas", 26.0), + LaunchSite("Florida", "Florida", 28.5), + LaunchSite("California", "California", 34.7), + LaunchSite("Virginia", "Virginia", 37.8), + LaunchSite("Taiyuan", "Taiyuan", 38.8), + LaunchSite("Mahia", "Mahia", 39.3), + LaunchSite("Baikonur", "Baikonur", 45.6), + LaunchSite("Alaska", "Alaska", 57.4), +] +LAUNCH_SITES = sorted(LAUNCH_SITES, key=lambda x: x.abs_latitude) +NUM_SITES = len(LAUNCH_SITES) + + +# ============== Core Calculation Functions ============== + +def fuel_ratio_multistage(delta_v: float, isp: float, alpha: float, num_stages: int) -> float: + """Calculate multi-stage rocket fuel/payload ratio""" + ve = isp * G0 + delta_v_per_stage = delta_v / num_stages + R_stage = np.exp(delta_v_per_stage / ve) + + denominator = 1 - alpha * (R_stage - 1) + if denominator <= 0: + return np.inf + + k_stage = (R_stage - 1) / denominator + + total_fuel_ratio = 0 + remaining_ratio = 1.0 + + for _ in range(num_stages): + fuel_this_stage = remaining_ratio * k_stage + total_fuel_ratio += fuel_this_stage + remaining_ratio *= (1 + k_stage * (1 + alpha)) + + return total_fuel_ratio + + +def calculate_scenario( + completion_years: float, + payload_per_launch: float = BASELINE_PAYLOAD_PER_LAUNCH, + elevator_capacity: float = BASELINE_NUM_ELEVATORS * BASELINE_ELEVATOR_CAPACITY_PER_YEAR, + launches_per_day: float = BASELINE_LAUNCHES_PER_DAY, + isp: float = BASELINE_ISP, + alpha: float = BASELINE_ALPHA, + num_stages: int = BASELINE_NUM_STAGES, + delta_v_base: float = BASELINE_DELTA_V, + specific_fuel_energy: float = BASELINE_SPECIFIC_FUEL_ENERGY, +) -> Optional[Dict]: + """Calculate scenario for given parameters""" + + # Space elevator transport + elevator_payload = min(elevator_capacity * completion_years, TOTAL_PAYLOAD) + elevator_energy = elevator_payload * BASELINE_ELEVATOR_SPECIFIC_ENERGY + + # Remaining payload for rockets + remaining_payload = TOTAL_PAYLOAD - elevator_payload + + if remaining_payload <= 0: + return { + 'years': completion_years, + 'elevator_payload': elevator_payload, + 'rocket_payload': 0, + 'total_energy_PJ': elevator_energy / 1e15, + 'rocket_launches': 0, + 'elevator_fraction': 1.0, + 'feasible': True, + } + + # Rocket launches needed + rocket_launches_needed = int(np.ceil(remaining_payload / payload_per_launch)) + + # Check feasibility + days_available = completion_years * 365 + max_launches_per_site = int(days_available * launches_per_day) + total_rocket_capacity = NUM_SITES * max_launches_per_site * payload_per_launch + + if remaining_payload > total_rocket_capacity: + return { + 'years': completion_years, + 'feasible': False, + 'shortage': remaining_payload - total_rocket_capacity, + } + + # Calculate rocket energy (low-latitude priority) + rocket_energy = 0 + remaining_launches = rocket_launches_needed + + for site in LAUNCH_SITES: + if remaining_launches <= 0: + break + allocated = min(remaining_launches, max_launches_per_site) + + # Calculate fuel ratio for this site + total_dv = delta_v_base + site.delta_v_loss() + k = fuel_ratio_multistage(total_dv, isp, alpha, num_stages) + fuel_per_ton = k * 1000 # kg fuel per metric ton payload + energy_per_ton = fuel_per_ton * specific_fuel_energy + + rocket_energy += energy_per_ton * payload_per_launch * allocated + remaining_launches -= allocated + + total_energy = elevator_energy + rocket_energy + + return { + 'years': completion_years, + 'elevator_payload': elevator_payload, + 'rocket_payload': remaining_payload, + 'total_energy_PJ': total_energy / 1e15, + 'rocket_launches': rocket_launches_needed, + 'elevator_fraction': elevator_payload / TOTAL_PAYLOAD, + 'feasible': True, + } + + +def find_minimum_timeline( + payload_per_launch: float = BASELINE_PAYLOAD_PER_LAUNCH, + elevator_capacity: float = BASELINE_NUM_ELEVATORS * BASELINE_ELEVATOR_CAPACITY_PER_YEAR, + launches_per_day: float = BASELINE_LAUNCHES_PER_DAY, + **kwargs +) -> float: + """Find minimum feasible timeline""" + for years in np.linspace(50, 300, 500): + result = calculate_scenario( + years, payload_per_launch, elevator_capacity, launches_per_day, **kwargs + ) + if result and result.get('feasible', False): + return years + return 300 # fallback + + +def generate_tradeoff_curve( + year_min: float = None, + year_max: float = 250, + num_points: int = 200, + **kwargs +) -> pd.DataFrame: + """Generate trade-off curve for given parameters""" + + if year_min is None: + year_min = find_minimum_timeline(**kwargs) + + years_range = np.linspace(year_min, year_max, num_points) + + results = [] + for years in years_range: + scenario = calculate_scenario(years, **kwargs) + if scenario and scenario.get('feasible', False): + results.append({ + 'years': years, + 'energy_PJ': scenario['total_energy_PJ'], + 'elevator_fraction': scenario['elevator_fraction'], + 'rocket_launches': scenario.get('rocket_launches', 0), + }) + + return pd.DataFrame(results) + + +def find_optimal_point(df: pd.DataFrame, lambda_cost: float) -> Dict: + """Find optimal point for given λ""" + if df.empty: + return {'years': np.nan, 'energy_PJ': np.nan} + + total_cost = df['energy_PJ'].values + lambda_cost * df['years'].values + opt_idx = np.argmin(total_cost) + + return { + 'years': df['years'].iloc[opt_idx], + 'energy_PJ': df['energy_PJ'].iloc[opt_idx], + 'elevator_fraction': df['elevator_fraction'].iloc[opt_idx], + } + + +# ============== Sensitivity Analysis Functions ============== + +def sensitivity_payload_capacity(): + """Analyze sensitivity to rocket payload capacity (100-150 tons)""" + print("\n[1] Analyzing Rocket Payload Capacity Sensitivity (100-150 tons)...") + + payload_range = np.linspace(100, 150, 11) + results = [] + + for payload in payload_range: + elevator_cap = BASELINE_NUM_ELEVATORS * BASELINE_ELEVATOR_CAPACITY_PER_YEAR + t_min = find_minimum_timeline(payload_per_launch=payload, elevator_capacity=elevator_cap) + t_elev = TOTAL_PAYLOAD / elevator_cap + + df = generate_tradeoff_curve( + year_min=t_min, year_max=250, + payload_per_launch=payload, elevator_capacity=elevator_cap + ) + + if not df.empty: + opt_504 = find_optimal_point(df, 504) + energy_at_139 = df[df['years'] >= 139]['energy_PJ'].iloc[0] if any(df['years'] >= 139) else np.nan + + results.append({ + 'payload_tons': payload, + 'min_timeline': t_min, + 'elevator_only_timeline': t_elev, + 'optimal_T_lambda504': opt_504['years'], + 'optimal_E_lambda504': opt_504['energy_PJ'], + 'energy_at_139y': energy_at_139, + }) + + return pd.DataFrame(results) + + +def sensitivity_elevator_capacity(): + """Analyze sensitivity to elevator capacity (±20%)""" + print("\n[2] Analyzing Elevator Capacity Sensitivity (±20%)...") + + baseline_cap = BASELINE_NUM_ELEVATORS * BASELINE_ELEVATOR_CAPACITY_PER_YEAR + capacity_factors = np.linspace(0.8, 1.2, 9) + results = [] + + for factor in capacity_factors: + elevator_cap = baseline_cap * factor + t_min = find_minimum_timeline(elevator_capacity=elevator_cap) + t_elev = TOTAL_PAYLOAD / elevator_cap + + df = generate_tradeoff_curve( + year_min=t_min, year_max=300, + elevator_capacity=elevator_cap + ) + + if not df.empty: + # Find critical λ + lambda_crit = None + for lam in np.linspace(300, 700, 200): + opt = find_optimal_point(df, lam) + if opt['years'] < t_elev - 5: + lambda_crit = lam + break + + opt_504 = find_optimal_point(df, 504) + + results.append({ + 'capacity_factor': factor, + 'capacity_tons_per_year': elevator_cap, + 'min_timeline': t_min, + 'elevator_only_timeline': t_elev, + 'critical_lambda': lambda_crit, + 'optimal_T_lambda504': opt_504['years'], + 'optimal_E_lambda504': opt_504['energy_PJ'], + }) + + return pd.DataFrame(results) + + +def sensitivity_launch_frequency(): + """Analyze sensitivity to launch frequency""" + print("\n[3] Analyzing Launch Frequency Sensitivity (0.5-2 launches/day)...") + + frequency_range = np.linspace(0.5, 2.0, 7) + results = [] + + for freq in frequency_range: + elevator_cap = BASELINE_NUM_ELEVATORS * BASELINE_ELEVATOR_CAPACITY_PER_YEAR + t_min = find_minimum_timeline(launches_per_day=freq, elevator_capacity=elevator_cap) + t_elev = TOTAL_PAYLOAD / elevator_cap + + df = generate_tradeoff_curve( + year_min=t_min, year_max=250, + launches_per_day=freq, elevator_capacity=elevator_cap + ) + + if not df.empty: + opt_504 = find_optimal_point(df, 504) + + results.append({ + 'launches_per_day': freq, + 'min_timeline': t_min, + 'elevator_only_timeline': t_elev, + 'optimal_T_lambda504': opt_504['years'], + 'optimal_E_lambda504': opt_504['energy_PJ'], + 'rocket_capacity_tons_per_year': freq * 365 * NUM_SITES * BASELINE_PAYLOAD_PER_LAUNCH, + }) + + return pd.DataFrame(results) + + +def sensitivity_engine_technology(): + """Analyze sensitivity to engine technology (Isp)""" + print("\n[4] Analyzing Engine Technology Sensitivity (Isp)...") + + engines = [ + ('Solid', 280, 5.0e6), + ('LOX/Kerosene', 350, 10.3e6), + ('LOX/Methane', 363, 11.9e6), + ('LOX/Hydrogen', 450, 15.5e6), + ] + + results = [] + + for name, isp, specific_energy in engines: + elevator_cap = BASELINE_NUM_ELEVATORS * BASELINE_ELEVATOR_CAPACITY_PER_YEAR + t_min = find_minimum_timeline( + isp=isp, specific_fuel_energy=specific_energy, elevator_capacity=elevator_cap + ) + + df = generate_tradeoff_curve( + year_min=t_min, year_max=250, + isp=isp, specific_fuel_energy=specific_energy, elevator_capacity=elevator_cap + ) + + if not df.empty: + opt_504 = find_optimal_point(df, 504) + + # Calculate fuel ratio at equator + k = fuel_ratio_multistage(BASELINE_DELTA_V, isp, BASELINE_ALPHA, BASELINE_NUM_STAGES) + + results.append({ + 'engine_type': name, + 'isp_seconds': isp, + 'specific_energy_MJ_kg': specific_energy / 1e6, + 'fuel_ratio': k, + 'min_timeline': t_min, + 'optimal_T_lambda504': opt_504['years'], + 'optimal_E_lambda504': opt_504['energy_PJ'], + }) + + return pd.DataFrame(results) + + +def sensitivity_structural_coefficient(): + """Analyze sensitivity to structural coefficient α""" + print("\n[5] Analyzing Structural Coefficient Sensitivity (α)...") + + alpha_range = np.linspace(0.06, 0.14, 9) + results = [] + + for alpha in alpha_range: + elevator_cap = BASELINE_NUM_ELEVATORS * BASELINE_ELEVATOR_CAPACITY_PER_YEAR + t_min = find_minimum_timeline(alpha=alpha, elevator_capacity=elevator_cap) + + df = generate_tradeoff_curve( + year_min=t_min, year_max=250, + alpha=alpha, elevator_capacity=elevator_cap + ) + + if not df.empty: + opt_504 = find_optimal_point(df, 504) + k = fuel_ratio_multistage(BASELINE_DELTA_V, BASELINE_ISP, alpha, BASELINE_NUM_STAGES) + + results.append({ + 'alpha': alpha, + 'fuel_ratio': k, + 'min_timeline': t_min, + 'optimal_T_lambda504': opt_504['years'], + 'optimal_E_lambda504': opt_504['energy_PJ'], + }) + + return pd.DataFrame(results) + + +# ============== Visualization ============== + +def plot_sensitivity_analysis( + payload_df: pd.DataFrame, + elevator_df: pd.DataFrame, + frequency_df: pd.DataFrame, + engine_df: pd.DataFrame, + alpha_df: pd.DataFrame, + save_path: str = '/Volumes/Files/code/mm/20260130_b/p1/sensitivity_analysis.png' +): + """Create comprehensive sensitivity analysis visualization""" + + fig, axes = plt.subplots(2, 3, figsize=(18, 12)) + + # ========== Plot 1: Rocket Payload Capacity ========== + ax1 = axes[0, 0] + + ax1.plot(payload_df['payload_tons'], payload_df['min_timeline'], + 'b-o', linewidth=2, markersize=8, label='Minimum Timeline') + ax1.plot(payload_df['payload_tons'], payload_df['optimal_T_lambda504'], + 'r-s', linewidth=2, markersize=8, label='Optimal T* (λ=504)') + + ax1.axhline(y=186.2, color='green', linestyle='--', alpha=0.7, label='Elevator-only') + ax1.axvline(x=125, color='gray', linestyle=':', alpha=0.7, label='Baseline (125t)') + + ax1.fill_betweenx([80, 220], 100, 150, alpha=0.1, color='blue', label='Problem range') + + ax1.set_xlabel('Rocket Payload Capacity (metric tons)', fontsize=11) + ax1.set_ylabel('Timeline (years)', fontsize=11) + ax1.set_title('(a) Sensitivity to Rocket Payload Capacity\n(Problem specifies 100-150 tons)', fontsize=12) + ax1.legend(loc='upper right', fontsize=9) + ax1.grid(True, alpha=0.3) + ax1.set_xlim(95, 155) + ax1.set_ylim(80, 200) + + # ========== Plot 2: Elevator Capacity ========== + ax2 = axes[0, 1] + + ax2.plot(elevator_df['capacity_factor'] * 100, elevator_df['elevator_only_timeline'], + 'g-o', linewidth=2, markersize=8, label='Elevator-only Timeline') + ax2.plot(elevator_df['capacity_factor'] * 100, elevator_df['optimal_T_lambda504'], + 'r-s', linewidth=2, markersize=8, label='Optimal T* (λ=504)') + ax2.plot(elevator_df['capacity_factor'] * 100, elevator_df['min_timeline'], + 'b-^', linewidth=2, markersize=8, label='Minimum Timeline') + + ax2.axvline(x=100, color='gray', linestyle=':', alpha=0.7, label='Baseline') + + ax2.set_xlabel('Elevator Capacity (% of baseline)', fontsize=11) + ax2.set_ylabel('Timeline (years)', fontsize=11) + ax2.set_title('(b) Sensitivity to Elevator Capacity (±20%)', fontsize=12) + ax2.legend(loc='upper right', fontsize=9) + ax2.grid(True, alpha=0.3) + ax2.set_xlim(75, 125) + + # ========== Plot 3: Launch Frequency ========== + ax3 = axes[0, 2] + + ax3.plot(frequency_df['launches_per_day'], frequency_df['min_timeline'], + 'b-o', linewidth=2, markersize=8, label='Minimum Timeline') + ax3.plot(frequency_df['launches_per_day'], frequency_df['optimal_T_lambda504'], + 'r-s', linewidth=2, markersize=8, label='Optimal T* (λ=504)') + + ax3.axhline(y=186.2, color='green', linestyle='--', alpha=0.7, label='Elevator-only') + ax3.axvline(x=1.0, color='gray', linestyle=':', alpha=0.7, label='Baseline (1/day)') + + ax3.set_xlabel('Launch Frequency (launches/site/day)', fontsize=11) + ax3.set_ylabel('Timeline (years)', fontsize=11) + ax3.set_title('(c) Sensitivity to Launch Frequency', fontsize=12) + ax3.legend(loc='upper right', fontsize=9) + ax3.grid(True, alpha=0.3) + + # ========== Plot 4: Engine Technology ========== + ax4 = axes[1, 0] + + x_pos = np.arange(len(engine_df)) + width = 0.35 + + bars1 = ax4.bar(x_pos - width/2, engine_df['optimal_E_lambda504'] / 1000, width, + label='Energy at T* (×10³ PJ)', color='steelblue', alpha=0.8) + + ax4_twin = ax4.twinx() + bars2 = ax4_twin.bar(x_pos + width/2, engine_df['fuel_ratio'], width, + label='Fuel Ratio k', color='coral', alpha=0.8) + + ax4.set_xlabel('Engine Type', fontsize=11) + ax4.set_ylabel('Energy (×10³ PJ)', fontsize=11, color='steelblue') + ax4_twin.set_ylabel('Fuel Ratio k', fontsize=11, color='coral') + ax4.set_title('(d) Sensitivity to Engine Technology', fontsize=12) + ax4.set_xticks(x_pos) + ax4.set_xticklabels(engine_df['engine_type'], rotation=15) + ax4.legend(loc='upper left', fontsize=9) + ax4_twin.legend(loc='upper right', fontsize=9) + ax4.grid(True, alpha=0.3, axis='y') + + # ========== Plot 5: Structural Coefficient ========== + ax5 = axes[1, 1] + + ax5.plot(alpha_df['alpha'], alpha_df['fuel_ratio'], + 'g-o', linewidth=2, markersize=8, label='Fuel Ratio k') + + ax5_twin = ax5.twinx() + ax5_twin.plot(alpha_df['alpha'], alpha_df['optimal_E_lambda504'] / 1000, + 'r-s', linewidth=2, markersize=8, label='Energy at T* (×10³ PJ)') + + ax5.axvline(x=0.10, color='gray', linestyle=':', alpha=0.7, label='Baseline') + + ax5.set_xlabel('Structural Coefficient α', fontsize=11) + ax5.set_ylabel('Fuel Ratio k', fontsize=11, color='green') + ax5_twin.set_ylabel('Energy (×10³ PJ)', fontsize=11, color='red') + ax5.set_title('(e) Sensitivity to Structural Coefficient α', fontsize=12) + ax5.legend(loc='upper left', fontsize=9) + ax5_twin.legend(loc='upper right', fontsize=9) + ax5.grid(True, alpha=0.3) + + # ========== Plot 6: Summary Tornado Chart ========== + ax6 = axes[1, 2] + + # Calculate sensitivity indices (% change in T* for parameter variation) + baseline_T = 139 # baseline optimal timeline + + sensitivities = [ + ('Payload\n(100→150t)', + (payload_df['optimal_T_lambda504'].iloc[0] - baseline_T) / baseline_T * 100, + (payload_df['optimal_T_lambda504'].iloc[-1] - baseline_T) / baseline_T * 100), + ('Elevator Cap.\n(80%→120%)', + (elevator_df['optimal_T_lambda504'].iloc[0] - baseline_T) / baseline_T * 100, + (elevator_df['optimal_T_lambda504'].iloc[-1] - baseline_T) / baseline_T * 100), + ('Launch Freq.\n(0.5→2/day)', + (frequency_df['optimal_T_lambda504'].iloc[0] - baseline_T) / baseline_T * 100, + (frequency_df['optimal_T_lambda504'].iloc[-1] - baseline_T) / baseline_T * 100), + ('Struct. Coef.\n(0.06→0.14)', + (alpha_df['optimal_T_lambda504'].iloc[0] - baseline_T) / baseline_T * 100, + (alpha_df['optimal_T_lambda504'].iloc[-1] - baseline_T) / baseline_T * 100), + ] + + y_pos = np.arange(len(sensitivities)) + + for i, (name, low, high) in enumerate(sensitivities): + ax6.barh(i, high - low, left=min(low, high), height=0.6, + color='steelblue' if high > low else 'coral', alpha=0.7) + ax6.plot([low, high], [i, i], 'k-', linewidth=2) + ax6.plot(low, i, 'ko', markersize=8) + ax6.plot(high, i, 'k^', markersize=8) + + ax6.axvline(x=0, color='black', linestyle='-', linewidth=1) + ax6.set_yticks(y_pos) + ax6.set_yticklabels([s[0] for s in sensitivities]) + ax6.set_xlabel('Change in Optimal Timeline T* (%)', fontsize=11) + ax6.set_title('(f) Sensitivity Summary (Tornado Chart)', fontsize=12) + ax6.grid(True, alpha=0.3, axis='x') + + plt.tight_layout() + plt.savefig(save_path, dpi=150, bbox_inches='tight') + print(f"\nSensitivity analysis plot saved to: {save_path}") + + return fig + + +def plot_tradeoff_comparison( + save_path: str = '/Volumes/Files/code/mm/20260130_b/p1/sensitivity_tradeoff.png' +): + """Plot trade-off curves for different parameter values""" + + fig, axes = plt.subplots(2, 2, figsize=(14, 12)) + + elevator_cap = BASELINE_NUM_ELEVATORS * BASELINE_ELEVATOR_CAPACITY_PER_YEAR + + # ========== Plot 1: Different Payload Capacities ========== + ax1 = axes[0, 0] + + for payload, color in [(100, 'red'), (125, 'blue'), (150, 'green')]: + df = generate_tradeoff_curve(payload_per_launch=payload, elevator_capacity=elevator_cap) + if not df.empty: + ax1.plot(df['years'], df['energy_PJ'] / 1000, color=color, linewidth=2, + label=f'{payload} tons') + + ax1.set_xlabel('Timeline (years)', fontsize=11) + ax1.set_ylabel('Energy (×10³ PJ)', fontsize=11) + ax1.set_title('Trade-off Curves: Rocket Payload Capacity', fontsize=12) + ax1.legend(title='Payload') + ax1.grid(True, alpha=0.3) + ax1.set_xlim(95, 200) + + # ========== Plot 2: Different Elevator Capacities ========== + ax2 = axes[0, 1] + + for factor, color in [(0.8, 'red'), (1.0, 'blue'), (1.2, 'green')]: + df = generate_tradeoff_curve(elevator_capacity=elevator_cap * factor) + if not df.empty: + ax2.plot(df['years'], df['energy_PJ'] / 1000, color=color, linewidth=2, + label=f'{factor*100:.0f}%') + + ax2.set_xlabel('Timeline (years)', fontsize=11) + ax2.set_ylabel('Energy (×10³ PJ)', fontsize=11) + ax2.set_title('Trade-off Curves: Elevator Capacity', fontsize=12) + ax2.legend(title='Capacity') + ax2.grid(True, alpha=0.3) + ax2.set_xlim(95, 250) + + # ========== Plot 3: Different Launch Frequencies ========== + ax3 = axes[1, 0] + + for freq, color in [(0.5, 'red'), (1.0, 'blue'), (2.0, 'green')]: + df = generate_tradeoff_curve(launches_per_day=freq, elevator_capacity=elevator_cap) + if not df.empty: + ax3.plot(df['years'], df['energy_PJ'] / 1000, color=color, linewidth=2, + label=f'{freq}/day') + + ax3.set_xlabel('Timeline (years)', fontsize=11) + ax3.set_ylabel('Energy (×10³ PJ)', fontsize=11) + ax3.set_title('Trade-off Curves: Launch Frequency', fontsize=12) + ax3.legend(title='Frequency') + ax3.grid(True, alpha=0.3) + ax3.set_xlim(45, 200) + + # ========== Plot 4: Different Engine Types ========== + ax4 = axes[1, 1] + + engines = [ + ('LOX/Kerosene', 350, 10.3e6, 'red'), + ('LOX/Methane', 363, 11.9e6, 'blue'), + ('LOX/Hydrogen', 450, 15.5e6, 'green'), + ] + + for name, isp, se, color in engines: + df = generate_tradeoff_curve(isp=isp, specific_fuel_energy=se, elevator_capacity=elevator_cap) + if not df.empty: + ax4.plot(df['years'], df['energy_PJ'] / 1000, color=color, linewidth=2, + label=f'{name}') + + ax4.set_xlabel('Timeline (years)', fontsize=11) + ax4.set_ylabel('Energy (×10³ PJ)', fontsize=11) + ax4.set_title('Trade-off Curves: Engine Technology', fontsize=12) + ax4.legend(title='Engine') + ax4.grid(True, alpha=0.3) + ax4.set_xlim(95, 200) + + plt.tight_layout() + plt.savefig(save_path, dpi=150, bbox_inches='tight') + print(f"Trade-off comparison plot saved to: {save_path}") + + return fig + + +# ============== Main ============== + +def main(): + print("=" * 70) + print("Task 1 Sensitivity Analysis for Moon Colony Logistics") + print("=" * 70) + + # Run all sensitivity analyses + payload_df = sensitivity_payload_capacity() + elevator_df = sensitivity_elevator_capacity() + frequency_df = sensitivity_launch_frequency() + engine_df = sensitivity_engine_technology() + alpha_df = sensitivity_structural_coefficient() + + # Print summary tables + print("\n" + "=" * 70) + print("SENSITIVITY ANALYSIS RESULTS") + print("=" * 70) + + print("\n[1] Rocket Payload Capacity (Problem range: 100-150 tons)") + print(payload_df.to_string(index=False)) + + print("\n[2] Elevator Capacity (±20%)") + print(elevator_df.to_string(index=False)) + + print("\n[3] Launch Frequency") + print(frequency_df.to_string(index=False)) + + print("\n[4] Engine Technology") + print(engine_df.to_string(index=False)) + + print("\n[5] Structural Coefficient α") + print(alpha_df.to_string(index=False)) + + # Generate plots + print("\n" + "=" * 70) + print("Generating Visualization...") + print("=" * 70) + + plot_sensitivity_analysis(payload_df, elevator_df, frequency_df, engine_df, alpha_df) + plot_tradeoff_comparison() + + # Save data + payload_df.to_csv('/Volumes/Files/code/mm/20260130_b/p1/sensitivity_payload.csv', index=False) + elevator_df.to_csv('/Volumes/Files/code/mm/20260130_b/p1/sensitivity_elevator.csv', index=False) + frequency_df.to_csv('/Volumes/Files/code/mm/20260130_b/p1/sensitivity_frequency.csv', index=False) + engine_df.to_csv('/Volumes/Files/code/mm/20260130_b/p1/sensitivity_engine.csv', index=False) + alpha_df.to_csv('/Volumes/Files/code/mm/20260130_b/p1/sensitivity_alpha.csv', index=False) + print("\nData saved to CSV files.") + + # Summary + print("\n" + "=" * 70) + print("KEY FINDINGS") + print("=" * 70) + print(""" + 1. ROCKET PAYLOAD CAPACITY (100-150 tons): + - Higher capacity reduces minimum timeline significantly + - Limited impact on energy when elevator dominates + - Baseline 125 tons is a reasonable middle estimate + + 2. ELEVATOR CAPACITY (±20%): + - Most sensitive parameter for timeline + - ±20% capacity changes elevator-only timeline by ~37 years + - Critical for long-term planning + + 3. LAUNCH FREQUENCY: + - Doubling frequency halves minimum rocket-only timeline + - Essential for time-constrained scenarios + - Less impact when elevator provides majority of transport + + 4. ENGINE TECHNOLOGY: + - Primarily affects energy, not timeline + - LOX/Hydrogen saves ~30% energy vs LOX/Methane + - But LOX/Methane has practical advantages (storage, cost) + + 5. STRUCTURAL COEFFICIENT α: + - Lower α (better technology) improves fuel efficiency + - Moderate impact on total energy + - Progress from 0.10 to 0.08 saves ~8% energy + """) + + print("=" * 70) + print("Analysis Complete!") + print("=" * 70) + + return payload_df, elevator_df, frequency_df, engine_df, alpha_df + + +if __name__ == "__main__": + results = main() diff --git a/p1/sensitivity_elevator.csv b/p1/sensitivity_elevator.csv new file mode 100644 index 0000000..12339a9 --- /dev/null +++ b/p1/sensitivity_elevator.csv @@ -0,0 +1,10 @@ +capacity_factor,capacity_tons_per_year,min_timeline,elevator_only_timeline,critical_lambda,optimal_T_lambda504,optimal_E_lambda504 +0.8,429600.0,113.12625250501002,232.77467411545624,386.4321608040201,113.12625250501002,63657.161988613094 +0.8500000000000001,456450.00000000006,109.61923847695391,219.08204622631172,410.5527638190955,109.61923847695391,62326.697320517385 +0.9,483300.0,106.6132264529058,206.9108214359611,432.66331658291455,111.47219061238053,58467.61654576382 +0.95,510150.0,103.6072144288577,196.02077820248945,456.78391959798995,108.54170652863515,57060.67905104806 +1.0,537000.0,101.10220440881763,186.21973929236498,480.9045226130653,138.08320157903745,39190.76939967205 +1.05,563850.0,98.09619238476954,177.35213265939524,505.0251256281407,177.23436823395534,15779.547072161346 +1.1,590700.0,95.59118236472946,169.29067208396816,529.145728643216,168.520961521032,16127.11044324161 +1.15,617550.0,93.58717434869739,161.93020808031739,553.2663316582914,161.00844905892188,16229.602091434355 +1.2,644400.0,91.08216432865731,155.18311607697083,577.3869346733668,155.12230491133022,15755.147010790764 diff --git a/p1/sensitivity_engine.csv b/p1/sensitivity_engine.csv new file mode 100644 index 0000000..3bbbfcf --- /dev/null +++ b/p1/sensitivity_engine.csv @@ -0,0 +1,5 @@ +engine_type,isp_seconds,specific_energy_MJ_kg,fuel_ratio,min_timeline,optimal_T_lambda504,optimal_E_lambda504 +Solid,280,5.0,538.5764850131313,101.10220440881763,186.40043906909295,15720.0 +LOX/Kerosene,350,10.3,108.67594152576491,101.10220440881763,185.65220894049406,16013.642239311645 +LOX/Methane,363,11.9,88.36809547494757,101.10220440881763,138.51371083876296,38973.75515736591 +LOX/Hydrogen,450,15.5,31.788626814321816,101.10220440881763,101.10220440881763,31658.551849443746 diff --git a/p1/sensitivity_frequency.csv b/p1/sensitivity_frequency.csv new file mode 100644 index 0000000..a84a4dd --- /dev/null +++ b/p1/sensitivity_frequency.csv @@ -0,0 +1,8 @@ +launches_per_day,min_timeline,elevator_only_timeline,optimal_T_lambda504,optimal_E_lambda504,rocket_capacity_tons_per_year +0.5,131.16232464929857,186.21973929236498,153.8549460730506,31569.245158290636,228125.0 +0.75,114.12825651302605,186.21973929236498,141.43915972648816,37650.80910610053,342187.5 +1.0,101.10220440881763,186.21973929236498,138.51371083876296,38973.75515736591,456250.0 +1.25,90.58116232464928,186.21973929236498,130.63614666518967,42805.34480074314,570312.5 +1.5,82.06412825651302,186.21973929236498,123.415172052648,46322.046034129125,684375.0 +1.75,75.0501002004008,186.21973929236498,116.36992578121067,49763.71727628531,798437.5 +2.0,69.03807615230461,186.21973929236498,110.86847060956083,52436.356660871454,912500.0 diff --git a/p1/sensitivity_payload.csv b/p1/sensitivity_payload.csv new file mode 100644 index 0000000..54a5a18 --- /dev/null +++ b/p1/sensitivity_payload.csv @@ -0,0 +1,12 @@ +payload_tons,min_timeline,elevator_only_timeline,optimal_T_lambda504,optimal_E_lambda504,energy_at_139y +100.0,111.12224448897794,186.21973929236498,139.03737122486177,38829.35751806205,38829.35751806205 +105.0,109.11823647294588,186.21973929236498,137.43617889044418,39611.72625931598,38542.26035133922 +110.0,106.6132264529058,186.21973929236498,136.15522502291014,40233.22214267542,38781.43442019814 +115.0,104.60921843687373,186.21973929236498,134.5641030805329,41011.601312047926,38434.596386037454 +120.0,102.60521042084167,186.21973929236498,140.37975448384205,38056.88195030881,38430.28997049429 +125.0,101.10220440881763,186.21973929236498,138.51371083876296,38973.75515736591,38598.73345595525 +130.0,99.09819639278557,186.21973929236498,137.013222424749,39706.68272720883,38573.78198086428 +135.0,97.59519038076152,186.21973929236498,135.88785611423853,40251.02975221686,38349.15358699996 +140.0,95.59118236472946,186.21973929236498,134.38736770022456,40985.0024452691,38671.44068549057 +145.0,94.0881763527054,186.21973929236498,133.2620013897141,41530.08764325223,38417.95828151439 +150.0,92.58517034068136,186.21973929236498,132.13663507920364,42075.527964998335,38541.90167459569 diff --git a/p1/sensitivity_tradeoff.png b/p1/sensitivity_tradeoff.png new file mode 100644 index 0000000..60cb34b Binary files /dev/null and b/p1/sensitivity_tradeoff.png differ diff --git a/p1/specific_energy_comparison.py b/p1/specific_energy_comparison.py index 43e8823..b73e384 100644 --- a/p1/specific_energy_comparison.py +++ b/p1/specific_energy_comparison.py @@ -45,9 +45,9 @@ class PhysicalConstants: @dataclass class EngineParams: """发动机/推进系统参数""" - name: str = "液氧液氢" - isp: float = 450 # 比冲 (秒) - specific_energy: float = 15.5e6 # 燃料比能量 (J/kg) + name: str = "液氧甲烷" + isp: float = 363 # 比冲 (秒) - LOX/CH4 (Raptor-class) + specific_energy: float = 11.9e6 # 燃料比能量 (J/kg) @property def exhaust_velocity(self) -> float: @@ -505,17 +505,21 @@ def plot_latitude_effects( engine: EngineParams = EngineParams(), mission: MissionParams = MissionParams(), constants: PhysicalConstants = PhysicalConstants(), - save_path: str = '/Volumes/Files/code/mm/20260130_b/latitude_effects.png', + save_path: str = '/Volumes/Files/code/mm/20260130_b/p1/latitude_effects.png', lunar_mission: bool = True ): """ - 绘制纬度影响图表 + Plot fuel ratio vs launch latitude. - 参数: - lunar_mission: 如果True,使用月球任务场景(不需要轨道平面改变) + Args: + engine: Engine parameters + mission: Mission parameters + constants: Physical constants + save_path: Output file path + lunar_mission: If True, use lunar mission scenario (no orbital plane change penalty) """ - # 月球任务场景:设置高目标倾角,避免轨道平面改变惩罚 + # Lunar mission scenario: set high target inclination to avoid plane change penalty if lunar_mission: mission_plot = MissionParams( alpha=mission.alpha, @@ -523,124 +527,50 @@ def plot_latitude_effects( delta_v_ground_to_leo_base=mission.delta_v_ground_to_leo_base, delta_v_tli=mission.delta_v_tli, delta_v_loi=mission.delta_v_loi, - target_inclination=90.0, # 允许任意倾角 + target_inclination=90.0, # Allow any inclination elevator_length=mission.elevator_length ) - title_suffix = "\n(Lunar Mission - 无轨道平面改变)" + title_suffix = " (Lunar Mission)" else: mission_plot = mission - title_suffix = "\n(目标: 赤道轨道)" + title_suffix = " (Target: Equatorial Orbit)" - fig, axes = plt.subplots(2, 2, figsize=(16, 14)) + # Golden ratio aspect: width=10, height=10*0.618 + fig, ax = plt.subplots(figsize=(10, 10 * 0.618)) - # 连续纬度范围 + # Continuous latitude range latitudes = np.linspace(0, 65, 100) - # ========== 图1: 自转速度 vs 纬度 ========== - ax1 = axes[0, 0] - rotation_velocities = [earth_rotation_velocity(lat, constants) for lat in latitudes] - ax1.plot(latitudes, rotation_velocities, 'b-', linewidth=2) - - # 标记发射场 (使用绝对值纬度) - for name, site in LAUNCH_SITES.items(): - abs_lat = abs(site.latitude) - v = earth_rotation_velocity(abs_lat, constants) - ax1.plot(abs_lat, v, 'ro', markersize=8) - # 简化标签显示 - label = site.name.split('(')[0].strip() - ax1.annotate(label, (abs_lat, v), textcoords="offset points", - xytext=(3, 3), fontsize=8, rotation=15) - - ax1.set_xlabel('Latitude |φ| (°)', fontsize=12) - ax1.set_ylabel('Rotation Velocity (m/s)', fontsize=12) - ax1.set_title('Earth Surface Rotation Velocity vs Latitude\nv = ω×R×cos(φ)', fontsize=13) - ax1.grid(True, alpha=0.3) - ax1.set_xlim(0, 65) - - # ========== 图2: ΔV损失 vs 纬度 ========== - ax2 = axes[0, 1] - dv_losses = [delta_v_rotation_loss(lat, constants) for lat in latitudes] - ax2.plot(latitudes, dv_losses, 'r-', linewidth=2) - - for name, site in LAUNCH_SITES.items(): - abs_lat = abs(site.latitude) - dv = delta_v_rotation_loss(abs_lat, constants) - ax2.plot(abs_lat, dv, 'bo', markersize=8) - label = site.name.split('(')[0].strip() - ax2.annotate(label, (abs_lat, dv), textcoords="offset points", - xytext=(3, 3), fontsize=8, rotation=15) - - ax2.set_xlabel('Latitude |φ| (°)', fontsize=12) - ax2.set_ylabel('ΔV Loss (m/s)', fontsize=12) - ax2.set_title('Rotation Velocity Loss vs Latitude\n(Relative to Equator)', fontsize=13) - ax2.grid(True, alpha=0.3) - ax2.set_xlim(0, 65) - - # ========== 图3: 燃料比 vs 纬度 ========== - ax3 = axes[1, 0] - + # Calculate fuel ratio for each latitude fuel_ratios = [] for lat in latitudes: site = LaunchSite("temp", lat) result = ground_launch_specific_energy_with_latitude(engine, mission_plot, site, constants) fuel_ratios.append(result['fuel_ratio']) - ax3.plot(latitudes, fuel_ratios, 'g-', linewidth=2, label='Fuel Ratio vs Latitude') + # Plot continuous curve + ax.plot(latitudes, fuel_ratios, 'g-', linewidth=2, label='Fuel Ratio vs Latitude') + # Mark launch sites for name, site in LAUNCH_SITES.items(): abs_lat = abs(site.latitude) site_temp = LaunchSite(site.name, abs_lat) result = ground_launch_specific_energy_with_latitude(engine, mission_plot, site_temp, constants) - ax3.plot(abs_lat, result['fuel_ratio'], 'mo', markersize=8) + ax.plot(abs_lat, result['fuel_ratio'], 'mo', markersize=8) + # Simplified label label = site.name.split('(')[0].strip() - ax3.annotate(label, (abs_lat, result['fuel_ratio']), + ax.annotate(label, (abs_lat, result['fuel_ratio']), textcoords="offset points", xytext=(3, 3), fontsize=8, rotation=15) - ax3.set_xlabel('Latitude |φ| (°)', fontsize=12) - ax3.set_ylabel('Fuel / Payload Mass Ratio', fontsize=12) - ax3.set_title(f'Fuel Requirement vs Launch Latitude{title_suffix}', fontsize=13) - ax3.grid(True, alpha=0.3) - ax3.set_xlim(0, 65) - - # ========== 图4: 能量对比柱状图 ========== - ax4 = axes[1, 1] - - # 按纬度绝对值排序 - results = [] - for name, site in LAUNCH_SITES.items(): - abs_lat = abs(site.latitude) - site_temp = LaunchSite(site.name, abs_lat) - result = ground_launch_specific_energy_with_latitude(engine, mission_plot, site_temp, constants) - result['abs_latitude'] = abs_lat - results.append(result) - - results = sorted(results, key=lambda x: x['abs_latitude']) - - # 简化标签 - sites = [r['launch_site'].split('(')[0].strip() for r in results] - fuel_ratios_bar = [r['fuel_ratio'] for r in results] - abs_lats = [r['abs_latitude'] for r in results] - - # 颜色映射:纬度越高颜色越深 - colors = plt.cm.RdYlGn_r(np.array(abs_lats) / 65) - bars = ax4.bar(range(len(sites)), fuel_ratios_bar, color=colors) - - ax4.set_ylabel('Fuel / Payload Mass Ratio', fontsize=12) - ax4.set_title(f'Fuel Requirement by Launch Site{title_suffix}', fontsize=13) - ax4.set_xticks(range(len(sites))) - ax4.set_xticklabels(sites, rotation=45, ha='right', fontsize=9) - ax4.grid(True, alpha=0.3, axis='y') - - # 添加数值标签和纬度 - for i, (bar, ratio, lat) in enumerate(zip(bars, fuel_ratios_bar, abs_lats)): - ax4.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.3, - f'{ratio:.1f}', ha='center', fontsize=9, fontweight='bold') - ax4.text(bar.get_x() + bar.get_width()/2, 1, - f'{lat:.0f}°', ha='center', fontsize=8, color='white') + ax.set_xlabel('Latitude |φ| (°)', fontsize=12) + ax.set_ylabel('Fuel / Payload Mass Ratio', fontsize=12) + ax.set_title(f'Fuel Requirement vs Launch Latitude{title_suffix}', fontsize=13) + ax.grid(True, alpha=0.3) + ax.set_xlim(0, 65) plt.tight_layout() plt.savefig(save_path, dpi=150, bbox_inches='tight') - print(f"纬度影响图表已保存至: {save_path}") + print(f"Latitude effects plot saved to: {save_path}") return fig @@ -886,6 +816,7 @@ def plot_comparison( engines = [ EngineParams(name="固体火箭", isp=280, specific_energy=5e6), EngineParams(name="液氧煤油", isp=350, specific_energy=10.3e6), + EngineParams(name="液氧甲烷", isp=363, specific_energy=11.9e6), EngineParams(name="液氧液氢", isp=450, specific_energy=15.5e6), ] @@ -922,11 +853,11 @@ def plot_comparison( if __name__ == "__main__": # 可以在这里修改参数 - # 发动机参数 + # 发动机参数 - 液氧甲烷 (LOX/CH4, Raptor-class) engine = EngineParams( - name="液氧液氢", - isp=450, # 比冲 (秒) - specific_energy=15.5e6 # 燃料比能量 (J/kg) + name="液氧甲烷", + isp=363, # 比冲 (秒) + specific_energy=11.9e6 # 燃料比能量 (J/kg) ) # 任务参数