tbamud/power_curve.ipynb

81 lines
86 KiB
Text
Raw Normal View History

2025-04-16 12:24:37 -07:00
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"authorship_tag": "ABX9TyOj1yqYrLX9mLbUuHL9DP3T",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/github/tbamud/tbamud/blob/master/power_curve.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 569
},
"id": "X9G-1-Tm9yk1",
"outputId": "31c04ccd-06e7-4319-aa70-2141971ea984"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 800x600 with 1 Axes>"
],
"image/png": "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
},
"metadata": {}
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"# Simulated power curve data\n",
"airspeed = np.linspace(20, 200, 100) # Airspeed in knots\n",
"power_required = 10000 / airspeed + 0.01 * airspeed**2 # Simplified model: induced + parasitic drag\n",
"\n",
"# Create the plot\n",
"plt.figure(figsize=(8, 6))\n",
"plt.plot(airspeed, power_required, label=\"Power Required\", color=\"blue\")\n",
"plt.axvline(x=80, color=\"green\", linestyle=\"--\", label=\"Minimum Power Point\")\n",
"plt.axvspan(20, 80, alpha=0.2, color=\"red\", label=\"Back Side (High Drag)\")\n",
"plt.axvspan(80, 200, alpha=0.2, color=\"green\", label=\"Ahead of Power Curve\")\n",
"\n",
"# Annotations\n",
"plt.text(50, 400, \"High Induced Drag\\n(Risk of Stall)\", fontsize=10, color=\"red\")\n",
"plt.text(120, 200, \"Efficient Operation\\n(Excess Power)\", fontsize=10, color=\"green\")\n",
"\n",
"# Plot settings\n",
"plt.title(\"Power Curve: Staying Ahead\", fontsize=14)\n",
"plt.xlabel(\"Airspeed (knots)\", fontsize=12)\n",
"plt.ylabel(\"Power Required (arbitrary units)\", fontsize=12)\n",
"plt.grid(True)\n",
"plt.legend()\n",
"plt.show()"
]
}
]
}