Skip to content

Instantly share code, notes, and snippets.

@Leowbattle
Last active September 15, 2023 22:40
Show Gist options
  • Save Leowbattle/4185d69ac3d18d85b926796a29f99483 to your computer and use it in GitHub Desktop.
Save Leowbattle/4185d69ac3d18d85b926796a29f99483 to your computer and use it in GitHub Desktop.
Boundary Value Problem
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 3,
"id": "54536315-2b39-4ecb-9b74-b2ccad36a271",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# https://en.wikipedia.org/wiki/Shooting_method\n",
"# An implementation of solving a boundary value problem using shooting methods\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "5030f235-4e51-4b07-a499-422800474c92",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# We are solving y''(x) = 3/2 y(x)^2, y(0) = 4, y(1) = 1\n",
"\n",
"# number of steps to use while integrating the initial value problem\n",
"n = 100\n",
"h = 1. / n\n",
"\n",
"# boundary conditions\n",
"y0 = 4\n",
"y1 = 1\n",
"\n",
"# solve initial value problem using the semi-implicit Euler method, given initial value and derivative\n",
"def ivp(s):\n",
" ys = [y0]\n",
" \n",
" y = y0\n",
" v = s\n",
" \n",
" for i in range(n):\n",
" a = 1.5 * y * y\n",
" v += a * h\n",
" y += v * h\n",
" ys.append(y)\n",
" \n",
" return ys\n",
"\n",
"# Difference between the y value at the end of an IVP with initial derivative s and the desired end value\n",
"# Roots of this function correspond to solutions of the BVP\n",
"def F(s):\n",
" y = y0\n",
" v = s\n",
" \n",
" for i in range(n):\n",
" a = 1.5 * y * y\n",
" v += a * h\n",
" y += v * h\n",
" \n",
" return y - y1"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "f2e7630b-d8a3-4efa-9e2a-6814986f0dfd",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.lines.Line2D at 0x227803f7810>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Initial derivative on the x axis\n",
"# Distance from desired boundary condition on the y axis\n",
"\n",
"X = np.linspace(-100, 0, 1000)\n",
"Y = []\n",
"for i in range(1000):\n",
" Y.append(F(X[i]))\n",
"\n",
"fig, ax = plt.subplots()\n",
"\n",
"ax.plot(X, Y)\n",
"ax.axhline(y=0, color='k')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "217b9be5-d1a9-4b46-b43f-d8778a0177f0",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# Find a root of a function using the bisection method\n",
"def solve_bisection(f, x0, x1):\n",
" while (x1 - x0) > 0.01:\n",
" m = (x0 + x1) / 2\n",
" ym = f(m)\n",
" \n",
" if np.sign(f(x0)) == np.sign(f(m)):\n",
" x0 = m\n",
" else:\n",
" x1 = m\n",
" return x0"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "5bff0819-cd70-43f7-b98e-3d6cd89c8e49",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x22780d70410>]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# In this simple example we know the intervals where the 2 roots are found\n",
"# For the given boundary conditions there are 2 solutions for this ODE\n",
"\n",
"s0 = solve_bisection(F, -40, -30)\n",
"s1 = solve_bisection(F, -20, 0)\n",
"\n",
"X = np.linspace(0, 1, n + 1)\n",
"\n",
"plt.plot(X, ivp(s0))\n",
"plt.plot(X, ivp(s1))"
]
}
],
"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.11.4"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment