import%20marimo%0A%0A__generated_with%20%3D%20%220.16.0%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo%2C%20plot_std_atmosphere)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20rf%22%22%22%0A%20%20%20%20%23%20X-15%20TAT%20(Total%20Air%20Temperature)%0A%0A%20%20%20%20I%20previously%20wrote%20about%20%5BMax%20Q%20-%20Maximum%20Dynamic%20Pressure%5D(https%3A%2F%2Fseanmcleod70.github.io%2FFlightDynamicsCalcs%2FMaxQ.html)%20comparing%20the%20Max%20Q%20experienced%20by%20a%20SpaceX%20rocket%20during%20launch%2C%20the%20Space%20Shuttle%20and%20a%20typical%20airliner.%20Followed%20up%20by%20looking%20at%20the%20Max%20Q%20experienced%20by%20the%20X-15%20during%20it's%0A%20%20%20%20speed%20mission%20flights%20and%20altitude%20mission%20flights%20in%20-%20%5BX-15%20MaxQ%5D().%0A%0A%20%20%20%20%5BRodney%20Rodriguez%20Robles%5D(https%3A%2F%2Fwww.linkedin.com%2Fin%2Frodneyrodriguezrobles%2F)%20created%20a%20%5BLinkedIn%20post%5D(https%3A%2F%2Fwww.linkedin.com%2Ffeed%2Fupdate%2Furn%3Ali%3Aactivity%3A7414421278973136896%2F)%20mentioning%20the%20X-15%20speed%20record%20flight.%0A%0A%20%20%20%20%3E%20On%20October%203%2C%201967%2C%20Pete%20Knight%20pushed%20the%20X-15A-2%20to%20Mach%206.7%2C%20a%20number%20that%20still%20feels%20unreal%20today%E2%80%BC%EF%B8%8F%0A%0A%20%20%20%20%3E%20It%20was%20not%20just%20a%20hashtag%23speed%20record%2C%20it%20was%20a%20deliberate%20step%20into%20a%20hashtag%23thermal%20regime%20where%20aerodynamics%2C%20structures%2C%20and%20materials%20stop%20being%20comfortable%20theory%20and%20start%20becoming%20survival%20problems.%0A%0A%20%20%20%20%3EThe%20aircraft%20paid%20the%20price%2C%20and%20the%20ablative%20coating%20did%20exactly%20what%20it%20was%20designed%20to%20do%20and%20burned%20away%20under%20extreme%20heating%2C%20but%20not%20without%20consequences.%20.....%0A%0A%20%20%20%20%5BHow%20'Speedy%20Pete'%20Piloted%20the%20Fastest%20Flight%20Ever%20Made%20by%20a%20Manned%20Aircraft%5D(https%3A%2F%2Fwww.historynet.com%2Fhow-speedy-pete-piloted-the-fastest-flight-ever-made-by-a-manned-aircraft%2F)%20is%20a%20fairly%20detailed%20description%20of%20the%20build%20up%20to%20the%20record%20flight%2C%20the%20flight%20itself%20and%20some%20of%20the%20history%20after%20the%20flight.%0A%0A%20%20%20%20%3E%20Per%20procedure%2C%20after%20coming%20to%20a%20halt%2C%20Knight%20recorded%20his%20final%20instrumentation%20readings%2C%20wondering%20why%20his%20ground%20team%20was%20looking%20toward%20the%20airplane%20and%20not%20helping%20him%20out.%20The%20answer%20became%20clear%20when%20he%20saw%20the%20blackened%20back%20end.%0A%0A%20%20%20%20%3E%20The%20damage%20stunned%20NASA%20engineers.%20The%20Flight%20Research%20Center%E2%80%99s%20Jack%20Kolf%20told%20me%20in%201977%2C%20%E2%80%9CIf%20there%20had%20been%20any%20question%20that%20the%20airplane%20was%20going%20to%20come%20back%20in%20that%20shape%2C%20we%20never%20would%20have%20flown%20it.%E2%80%9D%20FRC%20thermodynamicist%20Joe%20Watts%20saw%20the%20flight%E2%80%99s%20major%20lesson%20as%20teaching%20engineers%20to%20take%20%E2%80%9Cextreme%20care%20in%20the%20design%20of%20hypersonic%20vehicles%20where%20shock%20impingement%20and%20interference%20effects%20are%20present%20because%20of%20the%20extremely%20high%20temperatures%20encountered.%E2%80%9D%20NASA%E2%80%99s%20John%20Becker%E2%80%94father%20of%20the%20X-15%E2%80%94agreed%2C%20urging%20future%20designers%20to%20pay%20%E2%80%9Cmaximum%20attention%20to%20aerothermodynamic%20detail%20in%20design%20and%20pre-flight%20testing.%E2%80%9D%20%0A%0A%20%20%20%20Using%20the%20same%20flight%20profile%20data%20for%20the%20design%20altitude%20mission%20and%20the%20design%20speed%20mission%20I'll%20calculate%20the%20Total%0A%20%20%20%20Air%20Temperature%20(TAT)%20that%20the%20X-15%20would've%20experienced.%0A%0A%20%20%20%20TAT%20refers%20to%20the%20temperature%20of%20the%20air%20around%20the%20aircraft%20including%20the%20kinetic%20heating%20effect%20based%20on%20the%20aircraft's%0A%20%20%20%20velocity%20through%20the%20air.%20The%20Static%20Air%20Temperature%20(SAT)%20is%20the%20ambient%20air%20temperature.%0A%0A%20%20%20%20Given%20the%20SAT%2C%20%24%5Cgamma%24%20and%20the%20Mach%20number%20TAT%20can%20be%20calculated%20using%3A%0A%0A%20%20%20%20%24%24%5Cmathrm%7B%7BTAT%7D%7D%20%3D%20%5Cmathrm%7B%7BSAT%7D%7D%20%5Ctimes%20%5Cleft(%201%20%2B%20%5Cfrac%7B%7B%5Cgamma%20-%201%7D%7D%7B%7B2%7D%7D%20%5Ccdot%20M%5E2%20%5Cright)%24%24%0A%0A%20%20%20%20With%20%24%5Cgamma%24%20approximately%201.4%20for%20dry%20air%20we%20have%3A%0A%0A%20%20%20%20%24%24%5Cmathrm%7B%7BTAT%7D%7D%20%3D%20%5Cmathrm%7B%7BSAT%7D%7D%20%5Ctimes%20%5Cleft(%201%20%2B%200.2%20%5Ccdot%20M%5E2%20%5Cright)%24%24%0A%0A%20%20%20%20Using%20Kelvin%20for%20SAT%20and%20TAT.%0A%0A%20%20%20%20The%20following%20graph%20shows%20how%20the%20air%20temperature%20and%20the%20speed%20of%20sound%20vary%20in%20the%20standard%20atmosphere%20over%20the%20altitude%20range%20that%20the%20X-15%20operated%20in.%0A%0A%20%20%20%20%7Bplot_std_atmosphere()%7D%0A%0A%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20rf%22%22%22%0A%20%20%20%20%23%23%20X-15%20Report%0A%0A%20%20%20%20I%20came%20across%20a%20reference%20to%20an%20X-15%20report%20while%20watching%20Ben%20Dickinson%E2%80%99s%20YouTube%20video%20-%20%5BX-15%20Space%20Plane%20-%20A%20Review%20for%206DOF%20Model%20Development%20%7C%20Flight%20Simulation%20Tutorial%20-%20Section%202.1%5D(https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DiQrN6hgh8e0).%0A%0A%20%20%20%20The%20%5BDesign%20and%20Operation%20of%20the%20X-15%20Hypersonic%20Research%20Airplane%5D(https%3A%2F%2Fapps.dtic.mil%2Fsti%2Ftr%2Fpdf%2FAD0279830.pdf)%20report%20includes%20two%20graphs%20showing%20a%20plot%20of%20altitude%20vs%20time%20and%20Mach%20vs%20time%20for%20the%20two%20types%20of%20profiles%20flown.%20One%20profile%20targetting%20high%20altitude%20and%20one%20profile%20targetting%20high%20speed.%0A%0A%20%20%20%20%7Bmo.image(%22public%2FX-15-MaxQ%2Fx-15-report-graphs.png%22%2C%20width%3D600)%7D%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(SAT%2C%20TAT%2C%20mo%2C%20plot_altitude_mission%2C%20plot_speed_mission)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20rf%22%22%22%0A%20%20%20%20%23%23%20TAT%20Variation%0A%0A%20%20%20%20So%20after%20digitizing%20the%20altitude%20and%20Mach%20data%20from%20the%20two%20graphs%20in%20the%20X-15%20report%20we%20can%20plot%20how%20the%20TAT%20varied%20during%20the%20two%20flight%20profiles%2C%20and%20also%20check%20when%20the%20maximum%20TAT%20was%20achieved%20and%20what%20the%20maximum%20TAT%20was%20for%20each%20of%20the%20two%20profiles.%0A%0A%20%20%20%20%7Bplot_altitude_mission()%7D%0A%0A%20%20%20%20%7Bplot_speed_mission()%7D%0A%0A%20%20%20%20The%20following%20table%20lists%20the%20maximum%20TAT%20experienced%20during%20the%20X-15's%20design%20altitude%20and%20speed%20missions%2C%20plus%20the%20TAT%0A%20%20%20%20experienced%20by%20the%20X-15%20speed%20record%20at%20it's%20maximum%20Mach%20of%206.7.%20TAT%20values%20are%20also%20calculated%20for%20a%20number%20of%20other%0A%20%20%20%20aircraft%20types%20at%20their%20cruising%20altitudes%20for%20comparison.%0A%0A%20%20%20%20%7CAircraft%20Mission%7CAltitude%7CMach%7CSAT%7CTAT%7C%0A%20%20%20%20%7C-------%7C----%7C----%7C-----%7C----%7C%0A%20%20%20%20%7CX-15%20Altitude%20Profile%7C126%2C300ft%7C6.03%7C%7BSAT(126300)%7D%7C%7BTAT(126300%2C%206.03)%7D%7C%0A%20%20%20%20%7CX-15%20Speed%20Profile%7C114%2C465ft%7C6.45%7C%7BSAT(114465)%7D%7C%7BTAT(114465%2C%206.45)%7D%7C%0A%20%20%20%20%7CX-15%20Speed%20Record%7C102%2C100ft%7C6.7%7C%7BSAT(102100)%7D%7C%7BTAT(102100%2C%206.7)%7D%7C%0A%20%20%20%20%7CSR-71%7C80%2C000ft%7C3.5%7C%7BSAT(80000)%7D%7C%7BTAT(80000%2C%203.5)%7D%7C%0A%20%20%20%20%7CConcorde%7C60%2C000ft%7C2.04%7C%7BSAT(60000)%7D%7C%7BTAT(60000%2C%202.04)%7D%7C%0A%20%20%20%20%7CAirliner%7C37%2C000ft%7C0.85%7C%7BSAT(37000)%7D%7C%7BTAT(37000%2C%200.85)%7D%7C%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Code%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20from%20ISA%20import%20ISAtmosphere%0A%0A%20%20%20%20ISA%20%3D%20ISAtmosphere()%0A%20%20%20%20return%20ISA%2C%20mo%2C%20np%2C%20plt%0A%0A%0A%40app.cell%0Adef%20_(ISA%2C%20mo%2C%20plt)%3A%0A%20%20%20%20def%20plot_std_atmosphere()%3A%0A%20%20%20%20%20%20%20%20alts%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20sats%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20speed_of_sounds%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20for%20h%20in%20range(0%2C%20260001%2C%201000)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_%2C%20_%2C%20oat%2C%20speed_of_sound%20%3D%20ISA.state(h*0.3048)%20%23%20ft%20to%20m%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20alts.append(h)%0A%20%20%20%20%20%20%20%20%20%20%20%20sats.append(oat-273.15)%0A%20%20%20%20%20%20%20%20%20%20%20%20speed_of_sounds.append(speed_of_sound*1.944012)%20%23%20m%2Fs%20to%20knots%0A%0A%20%20%20%20%20%20%20%20fig%20%3D%20plt.figure(layout%3D'constrained'%2C%20figsize%3D(10%2C%205))%0A%20%20%20%20%20%20%20%20host%20%3D%20fig.add_subplot(111)%0A%0A%20%20%20%20%20%20%20%20par1%20%3D%20host.twinx()%0A%0A%20%20%20%20%20%20%20%20host.set_ylim(-80%2C%2020)%0A%20%20%20%20%20%20%20%20par1.set_ylim(400%2C%20700)%0A%0A%20%20%20%20%20%20%20%20host.set_xlabel('Altitude%20(ft)')%0A%20%20%20%20%20%20%20%20host.set_ylabel('SAT%20(C)')%0A%20%20%20%20%20%20%20%20par1.set_ylabel('Speed%20of%20Sound%20(kt)')%0A%0A%20%20%20%20%20%20%20%20p1%2C%20%3D%20host.plot(alts%2C%20sats%2C%20label%3D'SAT%20(C)')%0A%20%20%20%20%20%20%20%20p2%2C%20%3D%20par1.plot(alts%2C%20speed_of_sounds%2C%20color%3D'r'%2C%20label%3D'Speed%20of%20sound%20(kt)')%0A%0A%20%20%20%20%20%20%20%20lns%20%3D%20%5Bp1%2C%20p2%5D%0A%20%20%20%20%20%20%20%20host.legend(handles%3Dlns%2C%20loc%3D'upper%20center')%0A%0A%20%20%20%20%20%20%20%20host.yaxis.label.set_color(p1.get_color())%0A%20%20%20%20%20%20%20%20par1.yaxis.label.set_color(p2.get_color())%0A%0A%20%20%20%20%20%20%20%20plt.title('Standard%20Atmosphere')%0A%0A%20%20%20%20%20%20%20%20return%20mo.md(f%22%7Bmo.as_html(fig)%7D%22)%0A%20%20%20%20return%20(plot_std_atmosphere%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20def%20altitude_mission_altitude(t)%3A%0A%20%20%20%20%20%20%20%20return%2027.6113%20-%200.145776*t%20%2B%200.0657895*t**2%20-%200.00196133*t**3%20%2B%203.91021e-5*t**4%20-%204.40397e-7*t**5%20%2B%202.80813e-9*t**6%20-%201.01645e-11*t**7%20%2B%201.94942e-14*t**8%20-%201.53729e-17*t**9%0A%0A%20%20%20%20def%20speed_mission_altitude(t)%3A%0A%20%20%20%20%20%20%20%20return%2031.0556%20-%200.343199*t%20%2B%200.0910034*t**2%20-%200.00334765*t**3%20%2B%207.12152e-05*t**4%20-%208.67785e-07*t**5%20%2B%206.08275e-09*t**6%20-2.4314e-11*t**7%20%2B%205.15945e-14*t**8%20-%204.51568e-17*t**9%0A%0A%20%20%20%20def%20load_mission_mach(csv_filename)%3A%0A%20%20%20%20%20%20%20%20csv%20%3D%20open(csv_filename%2C%20'r')%0A%0A%20%20%20%20%20%20%20%20times%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20machs%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20for%20line%20in%20csv.readlines()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20vals%20%3D%20line.split('%2C')%0A%20%20%20%20%20%20%20%20%20%20%20%20t%20%3D%20float(vals%5B0%5D)%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20mach%20%3D%20float(vals%5B1%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20times.append(t)%0A%20%20%20%20%20%20%20%20%20%20%20%20machs.append(mach)%0A%0A%20%20%20%20%20%20%20%20return%20(times%2C%20machs)%0A%20%20%20%20return%20load_mission_mach%2C%20speed_mission_altitude%0A%0A%0A%40app.cell%0Adef%20_(plot_mission)%3A%0A%20%20%20%20def%20plot_altitude_mission()%3A%0A%20%20%20%20%20%20%20%20return%20plot_mission('Altitude%20Mission'%2C%20'upper%20left'%2C%20'x-15-altitude-mission-mach.csv')%0A%0A%20%20%20%20def%20plot_speed_mission()%3A%0A%20%20%20%20%20%20%20%20return%20plot_mission('Speed%20Mission'%2C%20'upper%20right'%2C%20'X-15-speed-mission-mach.csv')%0A%20%20%20%20return%20plot_altitude_mission%2C%20plot_speed_mission%0A%0A%0A%40app.cell%0Adef%20_(ISA%2C%20load_mission_mach%2C%20mo%2C%20np%2C%20plt%2C%20speed_mission_altitude)%3A%0A%20%20%20%20def%20plot_mission(title%2C%20legend_location%2C%20mission_mach_filename)%3A%0A%20%20%20%20%20%20%20%20fig%20%3D%20plt.figure(layout%3D'constrained'%2C%20figsize%3D(10%2C%205))%0A%20%20%20%20%20%20%20%20host%20%3D%20fig.add_subplot(111)%0A%0A%20%20%20%20%20%20%20%20par1%20%3D%20host.twinx()%0A%20%20%20%20%20%20%20%20par2%20%3D%20host.twinx()%0A%20%20%20%20%20%20%20%20par3%20%3D%20host.twinx()%0A%0A%20%20%20%20%20%20%20%20host.set_ylim(0%2C%20280)%0A%20%20%20%20%20%20%20%20par1.set_ylim(0%2C%207)%0A%20%20%20%20%20%20%20%20par2.set_ylim(-50%2C%202000)%0A%20%20%20%20%20%20%20%20par3.set_ylim(-80%2C%20100)%0A%0A%20%20%20%20%20%20%20%20host.set_xlabel('Time%20(s)')%0A%20%20%20%20%20%20%20%20host.set_ylabel('Altitude%20(1000%20ft)')%0A%20%20%20%20%20%20%20%20par1.set_ylabel('Mach')%0A%20%20%20%20%20%20%20%20par2.set_ylabel('TAT%20(C)')%0A%20%20%20%20%20%20%20%20par3.set_ylabel('SAT%20(C)')%0A%0A%20%20%20%20%20%20%20%20times%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20sats%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20tats%20%3D%20%5B%5D%20%20%0A%0A%20%20%20%20%20%20%20%20%23%20Altitude%0A%20%20%20%20%20%20%20%20alts%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20for%20t%20in%20range(0%2C%20261%2C%201)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20alt%20%3D%20speed_mission_altitude(t)%0A%20%20%20%20%20%20%20%20%20%20%20%20times.append(t)%0A%20%20%20%20%20%20%20%20%20%20%20%20alts.append(alt)%20%20%20%20%0A%0A%20%20%20%20%20%20%20%20%23%20Mach%0A%20%20%20%20%20%20%20%20mach_times%2C%20machs_raw%20%3D%20load_mission_mach(f'data%2FX-15-MaxQ%2F%7Bmission_mach_filename%7D')%20%20%20%20%0A%20%20%20%20%20%20%20%20machs%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20t%20in%20range(0%2C%20261%2C%201)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20mach%20%3D%20np.interp(t%2C%20mach_times%2C%20machs_raw)%0A%20%20%20%20%20%20%20%20%20%20%20%20machs.append(mach)%0A%0A%20%20%20%20%20%20%20%20%23%20Temps%20(SAT%20and%20TAT)%0A%20%20%20%20%20%20%20%20qs%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(0%2C%20len(times))%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20mach%20%3D%20machs%5Bi%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%20alts%5Bi%5D%20*%201000%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20_%2C%20_%2C%20sat%2C%20speed_of_sound%20%3D%20ISA.state(h*0.3048)%20%23%20ft%20to%20m%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20tat%20%3D%20sat*(1%20%2B%200.2*mach**2)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20sats.append(sat%20-%20273.15)%20%23%20Kelvin%20to%20Celsius%0A%20%20%20%20%20%20%20%20%20%20%20%20tats.append(tat%20-%20273.15)%20%23%20Kelvin%20to%20Celsius%0A%0A%20%20%20%20%20%20%20%20max_index%20%3D%20np.argmax(tats)%0A%20%20%20%20%20%20%20%20%23print(max_index%2C%20times%5Bmax_index%5D%2C%20tats%5Bmax_index%5D%2C%20alts%5Bmax_index%5D%2C%20machs%5Bmax_index%5D)%20%20%20%20%20%20%20%20%0A%0A%20%20%20%20%20%20%20%20p1%2C%20%3D%20host.plot(times%2C%20alts%2C%20label%3D'Altitude%20(1000%20ft)')%0A%20%20%20%20%20%20%20%20p2%2C%20%3D%20par1.plot(times%2C%20machs%2C%20color%3D'r'%2C%20label%3D'Mach')%0A%20%20%20%20%20%20%20%20p3%2C%20%3D%20par2.plot(times%2C%20tats%2C%20color%3D'g'%2C%20label%3D'TAT%20(C)'%20)%0A%20%20%20%20%20%20%20%20p4%2C%20%3D%20par3.plot(times%2C%20sats%2C%20color%3D'orange'%2C%20label%3D'SAT%20(C)'%20)%0A%0A%20%20%20%20%20%20%20%20lns%20%3D%20%5Bp1%2C%20p2%2C%20p3%2C%20p4%5D%0A%20%20%20%20%20%20%20%20host.legend(handles%3Dlns%2C%20loc%3Dlegend_location)%0A%0A%20%20%20%20%20%20%20%20par2.spines%5B'right'%5D.set_position(('outward'%2C%2095))%20%0A%20%20%20%20%20%20%20%20par3.spines%5B'right'%5D.set_position(('outward'%2C%2040))%20%0A%0A%20%20%20%20%20%20%20%20host.yaxis.label.set_color(p1.get_color())%0A%20%20%20%20%20%20%20%20par1.yaxis.label.set_color(p2.get_color())%0A%20%20%20%20%20%20%20%20par2.yaxis.label.set_color(p3.get_color())%0A%20%20%20%20%20%20%20%20par3.yaxis.label.set_color(p4.get_color())%0A%0A%20%20%20%20%20%20%20%20plt.title(title)%0A%0A%20%20%20%20%20%20%20%20return%20mo.md(f%22%7Bmo.as_html(fig)%7D%22)%20%20%20%20%0A%20%20%20%20return%20(plot_mission%2C)%0A%0A%0A%40app.cell%0Adef%20_(ISA)%3A%0A%20%20%20%20def%20dynamic_pressure(altitude%2C%20mach)%3A%0A%20%20%20%20%20%20%20%20_%2C%20rho%2C%20_%2C%20speed_of_sound%20%3D%20ISA.state(altitude*0.3048)%20%23%20ft%20to%20m%0A%20%20%20%20%20%20%20%20v%20%3D%20mach%20*%20speed_of_sound%0A%20%20%20%20%20%20%20%20q%20%3D%200.5%20*%20rho%20*%20v**2%0A%0A%20%20%20%20%20%20%20%20return%20f'%7Bq%2F1000%3A.1f%7D%20kPa'%20%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ISA)%3A%0A%20%20%20%20def%20TAT(altitude%2C%20mach)%3A%0A%20%20%20%20%20%20%20%20_%2C%20_%2C%20sat%2C%20_%20%3D%20ISA.state(altitude*0.3048)%20%23%20ft%20to%20m%0A%20%20%20%20%20%20%20%20tat%20%3D%20sat*(1%20%2B%200.2*mach**2)%0A%0A%20%20%20%20%20%20%20%20return%20f'%7B(tat-273.15)%3A.0f%7DC'%0A%20%20%20%20return%20(TAT%2C)%0A%0A%0A%40app.cell%0Adef%20_(ISA)%3A%0A%20%20%20%20def%20SAT(altitude)%3A%0A%20%20%20%20%20%20%20%20_%2C%20_%2C%20sat%2C%20_%20%3D%20ISA.state(altitude*0.3048)%20%23%20ft%20to%20m%0A%0A%20%20%20%20%20%20%20%20return%20f'%7B(sat-273.15)%3A.0f%7DC'%20%20%20%20%0A%20%20%20%20return%20(SAT%2C)%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
875c9f769c139f41a8c82a84ffa2636e31cc4a7ac85ad971fc1b66fbfa3db1f9