230 lines
7.5 KiB
Plaintext
230 lines
7.5 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"id": "d9b87334-514c-41fa-aab5-ecef29c4c94d",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sympy import *"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "6b45c0a5-2069-4b11-b208-e2fa3dcc1820",
|
||
"metadata": {},
|
||
"source": [
|
||
"**Dane Sabo**\n",
|
||
"\n",
|
||
"*September 18th, 2024*"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "0f1d7205-998f-4cbc-b3b3-df3afda5804c",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Instructions\n",
|
||
"\n",
|
||
"Please do a written solution for problems 1 and 2. We will review them on Monday, Sept 16 in class prior to the assignment being due.\n",
|
||
"\n",
|
||
"Please upload a Jupyter Notebook for problems 3 and 4.\n",
|
||
"\n",
|
||
"Problems 1 and 2 are worth 10 points each, problems 3 and 4 are worth 15 points each.\n",
|
||
"\n",
|
||
"# Written Problems\n",
|
||
"## Problem 1\n",
|
||
"Please find the general solution of \n",
|
||
"$$\n",
|
||
"\\bf{\\dot{X}} = \n",
|
||
"\\begin{bmatrix} \n",
|
||
"-1 & 5 & 2\\\\ \n",
|
||
"4 & -1 & -2\\\\\n",
|
||
"0 & 0 & 6\n",
|
||
"\\end{bmatrix}\n",
|
||
"\\bf{X}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"id": "fc73f387-de90-4c25-b24c-ec91ea774ce8",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"⎡d ⎤ \n",
|
||
"⎢──(x₁(t))⎥ \n",
|
||
"⎢dt ⎥ \n",
|
||
"⎢ ⎥ ⎡-x₁(t) + 5⋅x₂(t) + 2⋅x₃(t)⎤\n",
|
||
"⎢d ⎥ ⎢ ⎥\n",
|
||
"⎢──(x₂(t))⎥ = ⎢4⋅x₁(t) - x₂(t) - 2⋅x₃(t) ⎥\n",
|
||
"⎢dt ⎥ ⎢ ⎥\n",
|
||
"⎢ ⎥ ⎣ 6⋅x₃(t) ⎦\n",
|
||
"⎢d ⎥ \n",
|
||
"⎢──(x₃(t))⎥ \n",
|
||
"⎣dt ⎦ \n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"t, s = symbols('t, s')\n",
|
||
"x = Matrix([Function('x1')(t), Function('x2')(t), Function('x3')(t)])\n",
|
||
"x_dot = x.diff(t) \n",
|
||
"A = Matrix([[-1, 5, 2],[4, -1, -2], [0, 0, 6]])\n",
|
||
"\n",
|
||
"eq = Eq(x_dot,A*x)\n",
|
||
"print(pretty(eq))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "9203ea18-e9e6-424b-bb2e-c12ef880f40b",
|
||
"metadata": {},
|
||
"source": [
|
||
"First we have to find the fundamental matrix $\\bf{\\Psi}(t) = e^{\\bf{A}t}$:\n",
|
||
"$$e^{\\bf{A}t} = \\mathcal{L}^{-1} \\{ (sI-\\bf{A})^{-1} \\} $$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"id": "bcfcdd55-34a5-4fb5-a91c-f1b540cef71f",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"ename": "TypeError",
|
||
"evalue": "inverse_laplace_transform() missing 2 required positional arguments: 's' and 't'",
|
||
"output_type": "error",
|
||
"traceback": [
|
||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
|
||
"Cell \u001b[0;32mIn[10], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m psi_t \u001b[38;5;241m=\u001b[39m \u001b[43minverse_laplace_transform\u001b[49m\u001b[43m(\u001b[49m\u001b[43mMatPow\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43meye\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m3\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mA\u001b[49m\u001b[43m,\u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n",
|
||
"\u001b[0;31mTypeError\u001b[0m: inverse_laplace_transform() missing 2 required positional arguments: 's' and 't'"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"psi_t = inverse_laplace_transform(MatPow(s*eye(3) - A,-1))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "14643f79-07ea-4d87-b81e-39244b1a3fa7",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Problem 2\n",
|
||
"Please find the general solution of \n",
|
||
"$$\n",
|
||
"\\bf{\\dot{X}} = \n",
|
||
"\\begin{bmatrix} \n",
|
||
"-6 & 5 \\\\ \n",
|
||
"-5 & 4 \\\\\n",
|
||
"\\end{bmatrix}\n",
|
||
"\\bf{X}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "390b5ac8-c156-4606-8d69-1b86b80fcefd",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "4c0f6f7a-d495-4f06-8d7c-a81f0f9ac2fc",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Python Problems\n",
|
||
"## Problem 3\n",
|
||
"The Archimedes Spiral can be plotted by taking all the positive whole numbers (e.g.j = 0, 1, 2, 3, 4, 5, ...) and putting them into the format $n = (j,j)$ , and plotting them in polar coordinates where the first term, $n_1$, is the radius, and the second term, $n_2$, is the angle in radians.\n",
|
||
"### Part A\n",
|
||
"You need to plot the first 1000 terms in a scatter plot. In addition, we would like to only look at the top right quadrant! What you're going for is shown in Figure 1."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "5e4b28fb-f18f-44ae-887e-9088446f2e5d",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "fde7a33e-6eb1-47b0-8867-85792164a17c",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Part B\n",
|
||
"You need to plot the first 25 terms, looking at th eentire polar plot (all quadrants, and then, put a *smooth* line through it. What you're going for is shown in Figure 2.)\n",
|
||
"Hint: [This will be a useful reference](https://matplotlib.org/stable/gallery/pie_and_polar_charts/index.html)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "d03285bf-09a6-4b79-b6e2-aaf35c56f96f",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "607410b5-74aa-44fd-ad88-4ed702dad2bc",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Problem 4\n",
|
||
"Consider the following system:\n",
|
||
"$$\n",
|
||
"\\bf{\\dot{X}} = \n",
|
||
"\\begin{bmatrix} \n",
|
||
"1 & 2 & 1\\\\ \n",
|
||
"3 & 1+x & 1\\\\\n",
|
||
"1 & 0 & 0\n",
|
||
"\\end{bmatrix}\n",
|
||
"\\bf{X}\n",
|
||
"$$\n",
|
||
"This linear differential equation system’s behavior is governed by its eigenvalues. In particular, the eigenvalues relate to stability and we may wish to see where they cross the 0 line (in terms of their real value). The constant x varies over the interval [−5, 5]. Using a Jupyter Notebook (local, or on Google Colab), Python, NumPy, and Matplotlib’s PyPlot, you should evaluate the eigenvalues for 50 evenly spaced values of x between −5 and 5, and produce a plot that visualizes the variation in the three eigenvalues as x varies. An example plot is shown in Figure 3 (for a different matrix!)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "368c0e47-f034-47e0-845c-f894ef601afc",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3 (ipykernel)",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.12.3"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 5
|
||
}
|