From 5566a27d0055dd8086d65c10c3ab84eb6167b91e Mon Sep 17 00:00:00 2001 From: Matt W Date: Mon, 21 Dec 2020 18:19:43 -0500 Subject: [PATCH] Finalize julia tutorial 4 --- .../J3_ODEIVPsystems.ipynb | 177 ++++- .../J4_ODEBVPsystems.ipynb | 631 ++++-------------- .../pipe1.png | Bin 0 -> 43820 bytes .../pipe2.png | Bin 0 -> 19878 bytes .../M3_ODEIVPsystems.mlx | Bin 17145 -> 17153 bytes .../M4_ODEBVPsystems.mlx | Bin 76175 -> 76172 bytes 6 files changed, 297 insertions(+), 511 deletions(-) create mode 100644 tutorial/julia/Tutorial 4 - ODEs, Boundary Value Problems/pipe1.png create mode 100644 tutorial/julia/Tutorial 4 - ODEs, Boundary Value Problems/pipe2.png diff --git a/tutorial/julia/Tutorial 3 - ODEs, Initial Value Problems/J3_ODEIVPsystems.ipynb b/tutorial/julia/Tutorial 3 - ODEs, Initial Value Problems/J3_ODEIVPsystems.ipynb index 6d7ddd7..d7c73f2 100644 --- a/tutorial/julia/Tutorial 3 - ODEs, Initial Value Problems/J3_ODEIVPsystems.ipynb +++ b/tutorial/julia/Tutorial 3 - ODEs, Initial Value Problems/J3_ODEIVPsystems.ipynb @@ -46,7 +46,7 @@ "metadata": {}, "outputs": [], "source": [ - "import Pkg; Pkd.add(\"Plots.jl\"); using Plots" + "import Pkg; Pkg.add(\"Plots\"); using Plots" ] }, { @@ -293,38 +293,64 @@ "\n", "with the initial condition $\\mathbf y (0)=\\mathbf y_0$. Here, we see that $\\mathbf f:\\mathbb R^n\\to\\mathbb R^n$ and $\\mathbf y\\in\\mathbb R^n$, thus we have a system of equations that must be solved simultaneously. \n", " \n", - " Explicit Methods\n", + "## Explicit Methods\n", + " \n", "The methods that we have described for single equations can be readily adapted for systems of equations, and the accuracy properties of the methods are unchanged. In particular, the adaptation for explicit methods is really straightforward. All that changes is that you have to step through a system of equations instead of a single equation.\n", - "Explicit Euler\n", + " \n", + "### Explicit Euler\n", "The explicit Euler method in this case has the form\n", "\n", - "Predictor-corrector\n", + "\\\\[\\mathbf y_{i+1} := \\mathbf y_i + h \\mathbf h (\\mathbf y_i)\\\\]\n", + " \n", + "### Predictor-corrector\n", "The predictor–corrector method is given by\n", "\n", - "RK4\n", + "\\\\[\\mathbf y_{i+1}^P:=\\mathbf y_i+h \\mathbf f(\\mathbf y_i)\\\\\n", + "\\mathbf y_{i+1}^C:=\\mathbf y_i+h \\mathbf f(\\mathbf y_{i+1}^P)\\\\\n", + "\\mathbf y_{i+1}:=\\frac{\\mathbf y_{i+1}^P+\\mathbf y_{i+1}^C}{2} \\\\]\n", + " \n", + "### RK4\n", "The RK4 scheme becomes\n", "\n", + "\\\\[ \\mathbf k_1:=\\mathbf f_1(\\mathbf y_i)\\\\\n", + "\\mathbf k_2:=\\mathbf f_2(\\mathbf y_i+\\frac{h}{2}\\mathbf k_1)\\\\\n", + "\\mathbf k_3:=\\mathbf f_3(\\mathbf y_i+\\frac{h}{2}\\mathbf k_2)\\\\\n", + "\\mathbf k_4:=\\mathbf f_4(\\mathbf y_i+h \\mathbf k_3)\\\\\n", + "\\mathbf y_{i+1}:=y_i+\\frac{h}{6}(\\mathbf k_1+2\\mathbf k_2+2\\mathbf k_3+\\mathbf k_4) \\\\]\n", " \n", - "Implicit Euler\n", + "### Implicit Euler\n", "The concepts for solving systems of ODEs are similar for implicit methods, but a bit more complicated. The form of the implicit Euler method becomes \n", - ",\n", + "\n", + "\\\\[\\mathbf y_{i+1} := \\mathbf y_i + h \\mathbf f (\\mathbf y_{i+1})\\\\],\n", + " \n", "which is a system of nonlinear algebraic equations requiring Newton–Raphson for solving (at each step). We therefore form the residual vector\n", - ".\n", - "In the algorithm, we have an outer loop that is updating the values of . At each step , we have an inner loop (with counter ) that involves first solving\n", "\n", - "and then updating the value for ,\n", + "\\\\[\\mathbf R(y_{i+1})=\\mathbf y_{i+1} - \\mathbf y_i - h \\mathbf f (\\mathbf y _{i+1})=\\mathbf 0\\\\].\n", "\n", + "In the algorithm, we have an outer loop that is updating the values of $\\mathbf y_i$. At each step $i$, we have an inner loop (with counter $k$) that involves first solving\n", "\n", - "Example 2: Use RK4 and implicit Euler to solve the system of equations\n", + "\\\\[\\mathbf J ( \\mathbf y_{i+1}^{(k)}) \\mathbf \\delta ^ {(k+1)}=- \\mathbf R ( \\mathbf y_{i+1}^{(k)}) \\\\]\n", + " \n", + "and then updating the value for $\\mathbf y_{i+1}$,\n", + "\n", + "\\\\[\\mathbf y_{i+1}^{(k+1)} := \\mathbf y_{i+1}^{(k)} + \\mathbf \\delta ^ {(k+1)}\\\\]\n", + " \n", + "**Example 2:** Use RK4 and implicit Euler to solve the system of equations\n", + "\n", + "\\\\[\\frac{dy_1}{dt}=y_1y_2^2 \\\\\n", + "\\frac{dy_2}{dt}=(y_1-y_2)^2\\\\]\n", + " \n", + "The initial conditions are $y_1(0)=1$ and $y_2(0)=2$. Plot the profiles of $y_1(x)$ and $y_2(x)$ through time horizon $x \\in [0,0.5]$ using both methods.\n", "\n", - "The initial conditions are and . Plot the profiles of and through time horizon using both methods.\n", - "Solution: \n", - "We first consider to use RK4 for integration: we define the variable in the vector form , the right hand side function is then given by and defined as getf_E2 which is written in the last section." + "**Solution:** \n", + "We first consider to use RK4 for integration: we define the variable in the vector form $\\mathbf y = (y_1,y_2)$, the right hand side function is then given by $\\mathbf f(\\mathbf y)$ and defined as getf_E2 which is written in the last section." ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "clear\n", "t0 = 0.0; % initial condition\n", @@ -346,6 +372,127 @@ "hold off" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then, we consider to use implict Euler for integration, the residual can be easily obtained as\n", + "\n", + "\\\\[ \\mathbf{R}=\\left\\lbrack \\begin{array}{c}\n", + "y_{1,i+1} -y_{1,i} -{hy}_{1,i+1} y_{2,i+1}^2 \\\\\n", + "y_{2,i+1} -y_{2,i} -{h\\left(y_{1,i+1} -y_{2,i+1} \\right)}^2 \n", + "\\end{array}\\right\\rbrack = \\mathbf{0} \\\\]\n", + "\n", + "The Jacobian is\n", + "\n", + "\\\\[ \\mathbf{J}=\\left\\lbrack \\begin{array}{cc}\n", + "1-{hy}_{2,i+1}^2 & -2{hy}_{1,i+1} y_{2,i+1} \\\\\n", + "-2h\\left(y_{1,i+1} -y_{2,i+1} \\right) & 1+2h\\left(y_{1,i+1} -y_{2,i+1} \\right)\n", + "\\end{array}\\right\\rbrack \\\\]\n", + "\n", + "The residual getR and the Jaconian function getJ are written in the last section" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "clear \n", + "t0 = 0.0; % initial condition\n", + "y0 = [1.0;2.0]; % initial condition\n", + "h = 1e-3; % step size\n", + "n_out = 50; % number of output points\n", + "i_out = 10; % frequency\n", + "[x_IE,y_IE] = ivp_implicit_euler_sys(t0,y0,h,n_out,i_out); % implicit Euler\n", + "% getR(y) and getJ(y) is required\n", + "\n", + "plot(x_IE(1:49),y_IE(1:49,1),'bs')\n", + "hold on\n", + "plot(x_IE(1:49),y_IE(1:49,2),'b-+')\n", + "axis([0.0 0.5 0.0 5.0])\n", + "xlabel('t')\n", + "ylabel('y')\n", + "legend('y_1','y_2','Location','northwest')\n", + "hold off" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice that the solution is changing very rapidly, and this system diverges around . As a result, it is good that we put in a check for the convergence of Newton–Raphson into our program; otherwise, the solution gets stuck in an infinite loop near the point of divergence.\n", + " \n", + "
\n", + "\n", + "# Case Study: Series Reactions in a Continuously Stirred Tank Reactor \n", + "\n", + "\n", + "\n", + "As indicated by the above flowchart, species A has a series reaction in a continuous stirred tank reactor (CSTR):\n", + "\n", + "\\\\[\\\\]\n", + "\n", + "$F$ is the volumetric flow rate of the feed stream with pure $A$ ($F=100$ L/h); $v$ is the volume of the reactor ($v=100$ L). The reaction rates for each species are given by:\n", + "\n", + "\\\\[\\frac{dC_A}{dt}=\\frac{F}{v}(C_{A,in}-C_A)-k_1C_A \\\\\n", + "\\frac{dC_B}{dt}=-\\frac{F}{v} C_B + k_1 C_A - k_2 C_B \\\\\n", + "\\frac{dC_C}{dt} = -\\frac{F}{v}C_C + k_2C_B\\\\]\n", + "\n", + "Real processes often have fluctuating feed conditions, which means the feed stream may have a sinusoidal relationship $C_{A,in}=C_{A,0}(A\\cos(\\omega t) + 1)$, the system equations becomes\n", + "\n", + "\\\\[\\frac{dC_A}{dt}=\\frac{F}{v}(C_{A,0}(\\alpha \\cos(\\omega t)+1)-C_A)-k_1C_A \\\\\n", + "\\frac{dC_B}{dt}=-\\frac{F}{v} C_B + k_1 C_A - k_2 C_B \\\\\n", + "\\frac{dC_C}{dt} = -\\frac{F}{v}C_C + k_2C_B\\\\]\n", + "\n", + "The rate constants are $k_1=3\\rm h^{-1}$ and $k_2=1 \\rm h^{-1}$, the amplitude for fluctuations in feed is $A=0.1$, and the angular frequency is given by $\\omega=2\\pi \\frac{\\rm rad}{\\rm s}$. In addition, the initial conditions are given by $C_A(t=0)=C_{A,0}=1 \\frac{\\rm mol}{\\rm L}$, $C_B(t=0)=0 \\frac{\\rm mol}{\\rm L}$ and $C_C(t=0)=0 \\frac{\\rm mol}{\\rm L}$. We want to plot the profile of these species through time $[0.0,5.0]$.\n", + "\n", + "### Solution:\n", + "Immediately, we can see that the system is non-autonomous because of the dependence on $t$ in the first equation. Our first step is to convert it into an autonomous system. Our variable vector is initially $\\mathbf y = (C_A,C_B,C_C)$, by introducing $y_4=t$, the variable vector becomes $\\mathbf y = (C_A,C_B,C_C,t)$. Thus the right hand side function can be rewritten as:\n", + "\n", + "\\\\[\\mathbf{f}\\left(\\mathbf{y}\\right)=\\left\\lbrack \\begin{array}{c}\n", + "\\frac{F}{v}\\left(C_{A,0} \\left(\\alpha \\mathrm{cos}\\left(\\omega y_4 \\right)+1\\right)-y_1 \\right)-k_1 y_1 \\\\\n", + "-\\frac{F}{v}y_2 +k_1 y_1 -k_2 y_2 \\\\\n", + "-\\frac{F}{v}y_3 +k_2 y_2 \\\\\n", + "1\n", + "\\end{array}\\right\\rbrack \\\\]\n", + "\n", + "and the initial condition is given by $\\mathbf y_0=(1,0,0,0)$. For solving this problem, we consider to use RK4 algorithm." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "clear\n", + "F = 100; % Feed flow rate (L/h)\n", + "v = 100; % Reactor volume (L)\n", + "CA0 = 1; % Concentration of A in the feed (mol/L)\n", + "t0 = 0.0; % initial condition\n", + "y0 = [1.0;0.0;0.0;0.0]; % initial condition\n", + "h = 1e-3; % step size\n", + "n_out = 50; % number of output points\n", + "i_out = 100; % frequency\n", + "[tout,yout] = ivp_RK4_CS(t0,y0,h,n_out,i_out,F,v,CA0); % RK4\n", + "% getf_CS(y) is required\n", + "\n", + "% Plot\n", + "plot(tout,yout(:,1),'b-')\n", + "hold on\n", + "plot(tout,yout(:,2),'r-')\n", + "plot(tout,yout(:,3),'k-')\n", + "axis([0.0 5.0 0.0 1.0])\n", + "xlabel('t')\n", + "ylabel('y')\n", + "legend('C_A','C_B','C_C','Location','northeast')\n", + "hold off" + ] + }, { "cell_type": "markdown", "metadata": {}, diff --git a/tutorial/julia/Tutorial 4 - ODEs, Boundary Value Problems/J4_ODEBVPsystems.ipynb b/tutorial/julia/Tutorial 4 - ODEs, Boundary Value Problems/J4_ODEBVPsystems.ipynb index 4f8a150..f1d85a7 100644 --- a/tutorial/julia/Tutorial 4 - ODEs, Boundary Value Problems/J4_ODEBVPsystems.ipynb +++ b/tutorial/julia/Tutorial 4 - ODEs, Boundary Value Problems/J4_ODEBVPsystems.ipynb @@ -4,30 +4,32 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Linear Algebraic Systems \n", + "# Ordinary Differential Equations, Boundary Value Problems \n", "\n", "
\n", "\n", "# Learning Objectives \n", "\n", - "### *Setting up a linear system*\n", - "- Be able to distinguish a linear system from a nonlinear system.\n", - "- Learn to write a linear system in a matrix-vector format.\n", - "- Input a linear system into a program\n", - "- Write applicable engineering models in a linear format.\n", + "### ODE boundary value problems (BVPs)\n", + "- Be able to distinguish bewteen ODE IVPs and BVPs\n", + "- Be able to formulate three common types of boundary conditions: Dirichlet, Neumann, Robin\n", "\n", - "### *Characterizing linear systems*\n", - "- Determine the bandwidth(s) of the linear system.*\n", - "- Determine if a linear system has a unique solution.\n", - "- Will solving a linear system provide a meaningful result (is it well-posed).\n", + "### Finite difference method (FDM)\n", + "- Be able to derive forward, backward, and centered finite difference approximations for the first derivatives\n", + "- Be able to derive centered finite difference approximations for the second derivatives\n", + "- Be able to state the truncation errors for different finite difference approximations\n", "\n", - "### *Solving a linear system*\n", - "- Solve a linear system by Gauss-Elimination\n", - "- Solve a linear system by LU factorizations.\n", - "- State when numerical errors occur may occur in Gauss-Elimination and how to resolve them.\\*\n", - "- Be able to state some conditions for the convergence of Jacobi and Gauss-Siedel methods.\\*\n", + "### Solving ODE BVPs\n", + "- Demonstrate the ability to discretize ODE BVPs into a set of algebraic equations\n", + "- Be able to deal with Dirichlet boundary conditions\n", + "- Be able to deal with Neumann and Robin boundary conditions by making fictious nodes\n", + "- Solve algebraic equations using appropriate numerical methods (Gauss-Siedel for linear systems or Newton-Raphson for nonlinear systems)\n", "\n", - "\\*Not covered in tutorial.\n", + "### Solving coupled BVPs*\n", + "- Be able to solve coupled BVPs by interlacing the unknown dependent variables\n", + "- Be able to identify the bandwidth of the Jacobin matrix of the reformulated equations\n", + "\n", + "* Not covered in tutorial\n", "\n", "
" ] @@ -36,449 +38,164 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Relevance \n", - "\n", - "It would be only a slight overstatement to say that linear algebra underlies all modern numerical algorithms to one degree or another. Even software which specifically addresses nonlinear or complicated forms will often make use of linear algebra in a myriad of subroutines. In essence, many complicated problems can be reduced to repeated formulating and solving linear systems. \n", - "\n", - "
" + "
\n", + "INTERACTIVE! Before starting this example, import the Plots.jl library by running the cell below.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import Pkg; Pkg.add(\"Plots\"); using Plots" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Chlorination of Benzene \n", - "\n", - "Monochlorobenzene is a high boiling point solvent used in many industrial applications ranging from the manufacture of [dyes](https://patentimages.storage.googleapis.com/76/55/12/31756682f755c5/US6013811.pdf), [plastic and rubber processing](https://patentimages.storage.googleapis.com/66/c8/e1/69918f557fbd35/US8563079.pdf), [paints](https://patentimages.storage.googleapis.com/28/17/a7/a40e46f75806cf/US9062206.pdf), and [waxes](https://patents.google.com/patent/US3999960A/en). Approximately, [$1 billion](https://www.prnewswire.com/news-releases/global-chlorobenzene-industry-300939916.html) worth of this solvent are used per year. It is [produced by combining chlorine with benzene](https://onlinelibrary.wiley.com/doi/abs/10.1002/14356007.o06_o03) in the presence of a Lewis acid catalyst such as Ferric Chloride FeCl3 or Anhydrous Aluminum Chloride AlCl3. When benzene and chlorine are mixed two key reactions occur: (1) the chlorination of benzene and (2) the secondary undesirable chlorination of the resulting monochlorobenzene. Product purity is ensured by performing a series of separation steps after the initial reaction and reagant usage is reduced by including a recycle loop. \n", - "\n", - "
\n", - "Objective: A large customer order has been placed for monochlorobenzene that needs to be fulfilled on a tight timeline. The small chemical company you work for has occasionally produced this solvent in the past and has an existing 6m3 continuously stirred tank reactor (CSTR) that will need to be repurposed to produce 25kmol/h monochlorobenzene. Moreover, there isn't sufficient development time available to attempt to improve the processing conditions for the reactor or separators. As a result, you'll need to use the documented process conditions for the reactor and separators which means supplying to the first separator an effluent consisting of 90% benzene, 7% monochlorobenzene, and 3% dichlorobenzene by mole. We need to determine the recycle flow rates and reaction rates required needed to achieve the desired rate at which monochlorobenzene need to be produced. \n", - "
\n", + "In the last tutorial, we introduced the general ODE form,\n", "\n", - "Denote benzene as (A), monochlorobenzene as (B), and dichlorobenzene as (C). The mole fraction of species A in stream S1 is denote by y1,A and the molar flowrate F [kmol/h] for stream S1 is denoted F1.\n", + "\\\\[F\\left(x,y,\\frac{dy}{dx},\\frac{d^2y}{dx^2},\\ldots,\\frac{d^ny}{dx^n}\\right)=0,\\\\]\n", "\n", - "- The feed stream is composed entirely of A and Cl2.\n", - "- An excess amount of Cl2 is provided and HCl removal can be assumed to be trivial. So it's reasonable exclude it from our design considerations. Moreover, this means the reactions which take place in the reactor vessel can be simplified to AB (at rate r1 [kmol/h]) and BC (at rate r2 [kmol/h]).\n", + "which when combined with initial conditions, formed the ODE-IVP problem, that we then proceeded to solve.\n", "\n", - "\n", + "In this unit, we consider ODE problems in which $n$ auxiliary conditions are specified at different values of the independent variable $x$ rather than just the specification of the initial condition. Such conditions are termed boundary conditions and the resulting problems are called boundary value problems (BVPs). In most of the problems of interest in chemical engineering the ODE will be of the form,\n", "\n", - "# Variables and Mass Balances \n", + "\\\\[\\frac{d^2y}{dx^2}=f\\left(x,y,\\frac{dy}{dx}\\right),\\\\]\n", "\n", - "For streams containing only a pure substance, we need only keep track of the total flow rate. Enumerating each quantity in the model is given by $F_1$, $F_2$, $F_3$, $F_4$, $F_5$, $F_6$, $F_7$, $y_{3,A}$, $y_{3,B}$, $y_{3,C}$, $y_{4,B}$, $y_{4,C}$, $r_1$, $r_2$, and $\\nu$. Five of these are specified (e.g. these are **parameters** with fixed values). This leaves ten degrees of freedom associated with a variable. We'll now need to write out the equations which govern the system (physical laws, equipment specifications, and performance specifications). We'll start with writing the mass balances over each unit operation. \n", + "where $x$ belongs to an interval $[x_l,x_r]$. The positions $x=x_l$ and $x=x_r$ define the boundaries of the spatial domain of interest. The three common types of boundary conditions are as follows:\n", + "- **Dirichlet** (boundary condition of the first kind): For this type, we specify the value of $y$ on the boundary, e.g. $y(x_l)=\\alpha$.\n", + "- **Neumann** (boundary condition of the second kind): For this type, we specify the derivative of $y$ on the boundary, e.g. $\\left. \\frac{dy}{dx} \\right |_{x_l} = \\alpha$.\n", + "- **Robin** (boundary condition of the third kind): This type involves a combination of $y$ and the derivative of $y$ on the boundary, e.g. $\\alpha_1 \\frac{dy}{dx} + \\alpha_2 y(x_r) = \\alpha_3$.\n", "\n", - "Mixer (Overall Mass Balance): \n", + "## Finite Difference Method\n", + "The finite difference method is a common approach for solving ODE-BVPs. The first step to apply the finite difference method, is to discretize the spatial domain. This begins by defining $n$ (often equidistant) nodes $x_1,\\ldots,x_n$. The discretization step is then given by\n", "\n", - "\\begin{align}\n", - " F_1 + F_7 - F_2 &= 0\n", - "\\end{align}\n", + "\\\\[\\Delta x = \\frac{x_r-x_l}{n-1}.\\\\]\n", "\n", - "Reactor (Individual Component Mass Balances):\n", + "First-order derivatives and second-order derivatives appearing in $F$ will be replaced with finite difference approximations. Common finite difference approximations for the first-order derivatives are list below.\n", + "- Forward difference approximation: $\\left.\\frac{dy}{dx}\\right |_{x_i}=\\frac{y_{i+1}-y_i}{\\Delta x}$ \n", + "- Backward difference approximation: $\\left.\\frac{dy}{dx}\\right |_{x_i}=\\frac{y_{i}-y_{i-1}}{\\Delta x}$ \n", + "- Centered finite difference approximation: $\\left.\\frac{dy}{dx}\\right |_{x_i}=\\frac{y_{i+1}-y_{i-1}}{2\\Delta x}$\n", + "The centered finite difference approximation is the most common finite difference approximation used for second-order derivatives and is defined as\n", "\n", - "\\begin{align}\n", - " F_2 - r_1\\nu - y_{3,A}F_3 &= 0 \\\\\n", - " (r_1 - r_2)\\nu + y_{3,B}F_3 &= 0 \\\\\n", - " r_2\\nu - y_{3,C}F_3 &= 0\n", - "\\end{align}\n", + "\\\\[\\left.\\frac{d^2y}{dx^2}\\right |_{x_i}=\\frac{y_{i+1} +2y_i -y_{i-1}}{\\Delta x^2}.\\\\]\n", "\n", - "Separator #1 (Individual Component Mass Balances):\n", + "## Solving ODE-BVPs\n", + "After the spatial discretization and the derivation of the finite difference approximations, we can proceed with the transformation of the ODE-BVP into a set of algebraic equations. At each interior node, we use the centered finite difference approximations to convert the ODE $\\frac{d^2y}{dx^2}=f(x,y,\\frac{dy}{dx})$ into the discretized form\n", "\n", - "\\begin{align}\n", - " F_3 - F_4 - F_7 &= 0 \\\\\n", - " y_{3,B}F_3 - y_{4,B}F_4 &= 0 \\\\\n", - " y_{3,C}F_3 - y_{4,C}F_4 &= 0\n", - "\\end{align}\n", + "\\\\[\\frac{y_{i+1} - 2y_i +y_{i-1}}{\\Delta x^2}=f(x_i,y_i,\\frac{y_{i+1} - y_{i-1}}{2 \\Delta x}).\\\\]\n", "\n", - "Separator #2 (Individual Component Mass Balances):\n", + "The result is a set of algebraic equations in $n-2$ unknowns. The remaining two equations will come from the boundary conditions. The resulting set of (in general, nonlinear) algebraic equations will have to be solved simultaneously to obtain the values of the unknowns. An outline for general approach to solving BVPs is:\n", + "1. Discretize the domain into n nodes.\n", + "2. For the interior nodes, discretize the ODE using finite difference approximations of the derivatives.\n", + "3. For the boundary nodes, if there is a Dirichlet boundary, set the boundary node to the specified value. Otherwise, make a fictitious node and discretize both the boundary condition and the ODE.\n", + "4. If the problem is linear, solve using any method the resulting system $\\mathbf A \\mathbf x = \\mathbf b$. If the problem is nonlinear, form the Jacobian and solve by Newton–Raphson.\n", + "5. Check for mesh refinement.\n", "\n", - "\\begin{align}\n", - " F_4 - F_5 - F_6 &= 0 \\\\\n", - " y_{4,B}F_4 - F_5 &= 0\n", - "\\end{align}\n", + "When solving ODE-BVPs, it is very important to apply the appropriate procedure for dealing with each different of type of **boundary condition**.\n", + "When a **Dirichlet** boundary condition is present, the value of the boundary node is a specified, e.g. if we have $y(x_l)=\\alpha$, then we set $y_1=\\alpha$.\n", + "When a **Neumann** and **Robin** boundary conditions with a derivative term is present, extra consideration is merited. When using the centered finite difference method for approximations, a fictious node should be introduced in order to to keep the same level of accuracy at the boundary. \n", + "Consider a Neumann boundary condition at the left boundary $\\left. \\frac{dy}{dx} \\right |_{x_l} = \\alpha$, we need to introduce a fictious node $x_0$ on the left of $x_l$, with a corresponding value of $y(x=x_0)=y_0$. Subsequently, we implement the centered finite difference approximation of the boundary condition:\n", "\n", - "In order to write these equations in a matrix-vector form: we'll first need to associate each variable (excluding **parameters**) in the model with a component in a vector of variables, $\\mathbf{x}$. \n", + "\\\\[\\frac{y_2-y_1}{2\\Delta x} = \\alpha,\\\\]\n", "\n", - "\\begin{align}\n", - " \\mathbf{x} = (F_1, F_2, F_3, F_4, F_6, F_7, y_{4,B}, y_{4,C}, r_1, r_2)\n", - "\\end{align}\n", + "which we can solve for the value of the fictitious node,\n", "\n", - "So, $x_2 = F_2$, $x_3 = F_3$ and so on until we have $x_{10} = r_2$. \n", + "\\\\[y_0 = y_2 - 2 \\alpha \\Delta x.\\\\]\n", "\n", - "
\n", - "Now, take a minute to inspect the model and categorize the system of equations. \n", - "
\n", + "We now substitute this result into the differential equation at $x_1$.\n", "\n", - "The 2nd and 3rd equations for Separator #1 as well as the 2nd equation in Separator #2 contain the expressions $y_{4,B}F_4$ and $y_{4,C}F_4$. These terms consist of two variables being multiplied by one another (a bilinear term) which is one of simplest commonly encountered nonlinear term. All other expressions consist of addition, subtraction, and the multiplication of a parameter by a variable. So this system of equations is nonlinear but would be linear if we ommitted the expressions: $y_{4,B}F_4$ and $y_{4,C}F_4$.\n", + "## Case Study: Laminar Flow\n", + "Suppose we have laminar flow of water, at 20 °C, through a horizontal cylindrical tube.\n", "\n", - "
\n", - "It's often useful to reformulate a model (algebraicly rearrange and potentially introduce new variables) to arrive at a more easily solvable form. \n", - "
\n", "\n", - "We'll start by introducing two new variables: the molar flowrates $F_{4,B}$ and $F_{4,C}$ defined as by\n", + "\n", "\n", - "\\begin{align}\n", - " F_{4,B} = y_{4,B}F_4 \\\\\n", - " F_{4,C} = y_{4,C}F_4\n", - "\\end{align}\n", "\n", - "We can then write an additional equation for the molar flowrates of S4:\n", + "Assume that we only consider the kinematics in the z-direction, and the flow is fully developed and at steady state. Then we can have the equation:\n", "\n", - "Molar flowrate expressions for S4:\n", + "\\\\[0=-\\frac{\\partial P}{\\partial z} + \\mu \\left [ \\frac{1}{r} \\frac{\\partial}{\\partial r} \\left(r \\frac{\\partial u_z}{\\partial r} \\right) \\right ]. \\\\]\n", "\n", - "\\begin{align}\n", - " F_{4,B} + F_{4,C} &= F_4\n", - "\\end{align}\n", + "We can rearrange and simplify the above equation as\n", "\n", - "Next, we'll introduce the variables: $F_{3,A}$, $F_{3,B}$, and $F_{3,C}$ defined as:\n", + "\\\\[\\frac{1}{r} \\frac{\\partial u_z}{\\partial r} + \\frac{\\partial^2 u_z}{\\partial r^2} = \\frac{1}{\\mu} \\frac{\\partial P}{\\partial z}.\\\\]\n", "\n", - "\\begin{align}\n", - " F_{3,A} = y_{3,A}F_3 \\\\\n", - " F_{3,B} = y_{3,B}F_3 \\\\\n", - " F_{3,C} = y_{3,C}F_3\n", - "\\end{align}\n", + "The viscosity of water at $20 ^\\circ \\text C$ is $\\mu = 8.9\\times 10^{-4} \\; \\text{Pa} \\cdot \\text s$, and the pressure drop through the pipe is $\\frac{\\partial P}{\\partial z} = -1000 \\; \\text{Pa}/\\text{m}$. We plug in this information and the equation simplifed to\n", "\n", - "We can then write an additional equation for the molar flowrates of S3:\n", + "\\\\[\\frac{1}{r} \\frac{\\partial u_z}{\\partial r} + \\frac{\\partial^2 u_z}{\\partial r^2} = \\frac{-1000}{8.9\\times 10^{-4}}.\\\\]\n", "\n", - "Molar flowrate expressions for S3:\n", + "At the inner surface of the pipe, a no-slip boundary condition holds, which is a Dirichlet condition:\n", "\n", - "\\begin{align}\n", - "F_{3,A} + F_{3,B} + F_{3,C} = F_3\n", - "\\end{align}\n", + "\\\\[u_z|_{r=R} = 0.\\\\]\n", "\n", - "We can then rearrange the mass balances for the Reactor, Separator #1, and Separator #2.\n", + "At the center of the pipe, a no-flux boundary condition holds due to symmetry, which is a Neumann condition:\n", "\n", - "Reactor (Individual Component Mass Balances):\n", + "\\\\[\\left. \\frac{du_z}{dr} \\right |_{r=0} = 0.\\\\]\n", "\n", - "\\begin{align}\n", - " F_2 - r_1\\nu - F_{3,A} &= 0 \\\\\n", - " (r_1 - r_2)\\nu + F_{3,B} &= 0 \\\\\n", - " r_2\\nu - F_{3,C} &= 0\n", - "\\end{align}\n", + "We may now solve for the $z$-direction velocity $u_z$ profile.\n", "\n", - "Reformulated Separator #1 Mass Balances:\n", "\n", - "\\begin{align}\n", - " F_3 - F_4 - F_7 &= 0 \\\\\n", - " F_{3,B} - F_{4,B} &= 0 \\\\\n", - " F_{3,C} - F_{4,C} &= 0\n", - "\\end{align}\n", + "## Solution:\n", + "We first discretize the spatial domain into $n$ nodes, $r_1,\\ldots,r_n$, with step size $\\Delta r =R/(n-1)$.\n", "\n", - "Reformulated Separator #2 Mass Balances:\n", "\n", - "\\begin{align}\n", - " F_4 - F_5 - F_6 &= 0 \\\\\n", - " F_{4,B} - F_5 &= 0\n", - "\\end{align}\n", - "\n", - "\\begin{align}\n", - " \\mathbf{x'} = (F_1, F_2, F_{3,A}, F_{3,B}, F_{3,C}, F_3, F_{4,B}, F_{4,C}, F_4, F_6, F_7, r_1, r_2)\n", - "\\end{align}\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "INTERACTIVE! Now we enter the above linear equation, Mx' = b in matrix-vector form.\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-0.07" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Define the Mx' = b linear system\n", + "\n", "\n", "\n", - "# Define storage for linear system\n", - "M = zeros(13,13) # Makes an 2d array of size 13-by-13. This array has 13 rows and 13 columns.\n", - "b = zeros(13) # Makes a column vector of size 10. A vector with 13 rows and 1 column.\n", + "Then, we use centered finite difference approximations for the derivative terms at each interior node:\n", "\n", - "# Input parameters\n", - "y3A = 0.90 # effluent benzene concentration of reactor\n", - "y3B = 0.07 # effluent monochlorobenzene concentration of reactor\n", - "y3C = 0.03 # effluent dichlorobenzene concentration of reactor\n", - "V = 6 # reactor volume\n", - "F_5 = 25.0 # flow rate of monochlorobenzene required\n", + "\\\\[\\left. \\frac{d u_z}{dr} \\right|_{r_i} \\approx \\frac{u_{z,i+1} - u_{z,i-1}}{\\Delta r},\\\\]\n", "\n", - "### MASS BALANCE (MIXER) ###\n", + "\\\\[\\left. \\frac{d^2 u_z}{dr^2} \\right|_{r_i} \\approx \\frac{u_{z,i+1} - 2 u_{z,i} + u_{z,i-1}}{\\Delta r^2}.\\\\]\n", "\n", - "# fills in the first row\n", - "M[1,1] = 1.0 # Set the matrix M's entry in the first row and first column to 1\n", - "M[1,2] = -1.0 # Set the matrix M's entry in the first row and second column to -1\n", - "M[1,11] = 1.0 # Set the matrix M's entry in the first row and eighth column to 1\n", + "Thus, the equations for interior nodes become\n", "\n", - "# b[1] and all other entries of M in row #1, so no need to change these values\n", + "\\\\[\\frac{1}{r_i} \\frac{u_{z,i+1} - u_{z,i-1}}{\\Delta r}+\\frac{u_{z,i+1} - 2 u_{z,i} + u_{z,i-1}}{\\Delta r^2}=\\frac{-1000}{8.9\\times 10^{-4}}.\\\\]\n", "\n", - "M[2,2] = 1.0 # reactor - equation #1 \n", - "M[2,3] = -1.0\n", - "M[2,12] = -V\n", + "For the boundary nodes, at $r=R$ where the Dirchlet boundary condition is applied, we have\n", "\n", - "M[3,4] = 1.0 # reactor - equation #2 \n", - "M[3,12] = -V\n", - "M[3,13] = V\n", + "\\\\[u_{z,n}=0.\\\\]\n", "\n", - "M[4,5] = -1.0 # reactor - equation #3 \n", - "M[4,13] = V\n", + "At $r=0$ where the Neumann boundary condition is applied, a fictious node $u_{z,0}$ is introduced, thus we have\n", "\n", - "M[10,8] = 1.0 # stream 4 balance \n", - "M[10,9] = -1.0\n", - "M[10,7] = 1.0\n", + "\\\\[\\frac{u_{z,2}-{u_{z,0}}}{\\Delta r}=0.\\\\]\n", "\n", - "M[11,3] = 1.0 # stream 3 balance #1 \n", - "M[11,4] = 1.0\n", - "M[11,5] = 1.0\n", - "M[11,6] = -1.0\n", + "Solving for the fictious node, we get $u_{z,0} = u_{z,2}$. The equation for the first node has to be modified because the radius is equal to zero at that node. We apply L’Hôpital’s rule:\n", "\n", - "M[12,3] = 1.0 # stream 3 balance #2\n", - "M[12,6] = -y3A\n", + "\\\\[\\lim_{r \\to 0} \\frac{1}{r} \\frac{d u_z}{dr} = \\lim_{r \\to 0} \\frac{\\frac{d}{dr}\\left(\\frac{du_z}{dr}\\right)}{\\frac{d}{dr}(r)} = \\lim_{r\\to 0}\\frac{d^2 u_z}{dr^2}.\\\\]\n", "\n", - "M[13,4] = 1.0 # stream 4 balance #3\n", - "M[13,6] = -y3B\n", + "So the equation at $r=0$ becomes $2\\frac{d^2 u_z}{dr^2} = \\frac{-1000}{8.9\\times 10^{-4}}$.\n", + "We apply centered finite differencing and plug the fictious node into the first equation to obtain\n", "\n", - "### SEPARATOR #1 & 2 - MASS BALANCES ###\n", + "\\\\[2\\cdot\\frac{2u_{z,2}-2u_{z,1}}{\\Delta r^2}=\\frac{-1000}{8.9\\times 10^{-4}}. \\\\]\n", "\n", - "# FILL IN THE REST BELOW HERE IN ROWS 5 to 9 of M!!!!!!!!" + "Now, we have a system of linear equations $\\mathbf A \\mathbf u_z =\\mathbf b$ and we can solve for the velocity profile." ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 6, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "\"This Matrix (M) is \"" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "13×13 Array{Float64,2}:\n", - " 1.0 -1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0\n", - " 0.0 1.0 -1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -6.0 0.0\n", - " 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -6.0 6.0\n", - " 0.0 0.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0\n", - " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 -1.0 0.0 -1.0 0.0 0.0\n", - " 0.0 0.0 0.0 1.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 -1.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 -1.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 1.0 1.0 1.0 -1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 1.0 0.0 0.0 -0.9 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 1.0 0.0 -0.07 0.0 0.0 0.0 0.0 0.0 0.0 0.0" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "\"The r.h.s vector (b) is \"" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "13-element Array{Float64,1}:\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 25.0\n", - " 25.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "13-element Array{Float64,1}:\n", - " 83.33333333333337 \n", - " 833.3333333333339 \n", - " 750.0000000000006 \n", - " 58.33333333333337 \n", - " 25.0 \n", - " 833.3333333333339 \n", - " 58.33333333333337 \n", - " 25.0 \n", - " 83.33333333333337 \n", - " 58.33333333333337 \n", - " 750.0000000000006 \n", - " 13.888888888888896\n", - " 4.166666666666667" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Run this to display the input matrix and vector\n", - "display(\"This Matrix (M) is \") \n", - "display(M)\n", - "display(\"The r.h.s vector (b) is \") \n", - "display(b)\n", - "x = M\\b\n", - "display(x)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Existence and Uniqueness of the Solution \n", - "\n", - "Now that the linear system has been formulated, let's check to see whether the system has a solution. For a square matrix M, M system is invertible\n", - "\n", - "
\n", - " INTERACTIVE! Make use of the function det to check see if matrix M is invertible. Does the linear equation Mx = b have a unique solution? \n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-1.0799999999999992" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "using LinearAlgebra: det\n", - "\n", - "# FILL IN THE REST BELOW HERE\n", - "det(M)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Well-posed problems and the Condition Number \n", - "\n", - "While a linear system, `Mx = b`, may have a unique solution, we also seek to understand whether using a particular algorithm to solve `Mx = b` will yeild an accurate solution. We often don't know `M` or `b` exactly. As a consequence, solutions which vary greatly when `M` or `b` are slightly perturbed may be suspect. This is generally assessed by evaluating the **condition number** of a linear system and is defined as: $\\text{cond}(M) \\equiv ||M|| \\times ||M^{-1}||$. A derivation of this is given in section 2.3.4 of Dorfman and Daoutidis, Numerical Methods with Chemical Engineering Applications which arrives at the following inequality:\n", - "\n", - "$||\\Delta x || \\leq \\text{cond}(M)\\bigg(\\frac{|| \\Delta b || || x ||}{|| b ||}\\bigg)$\n", - "\n", - "For a fixed condition number, $\\text{cond}(M)$, solution $x$, and $b$ if we slightly perturb $b$ by $\\Delta b$ then $x$ may change by at most an amount proportional to the condition number. Another way of interpreting this is by applying the following rule of thumb: the condition number $\\kappa$ means that the method looses $\\log_{10}{\\kappa}$ of accuracy relative to rounding error.\n", - "\n", - "If an application leads to an ill-posed problem (values of **M** and **b** may be known to very high precision), there are a multitude of ways this may be dealt with. This most common and often most robust approach is to apply a [**preconditioner**](http://www.mathcs.emory.edu/~benzi/Web_papers/survey.pdf). That is we find an appropriate matrix **Y** and multiply both sides of the original linear system to create an equivalent new linear system, `(YM)x = (Yb)`, which has a lower condition number. We can then solve the equivalent modified system. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "INTERACTIVE! Make use of the function cond to compute the condition number using the $L^2$-norm. Is the matrix A well-conditioned? \n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1494.7023893088221" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "done\n" + ] } ], "source": [ - "using LinearAlgebra: cond\n", - "\n", - "# FILL IN THE REST BELOW HERE" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Solving the linear equation with Gauss Elimination " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's write a quick script to solve Mx = b. We'll do this in three steps. Defining a function to perform forward elimination, a function to back substitution, and lastly a main function to perform each of the prior functions in sequence." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "function forward_elimination!(M,b,n)\n", - " \n", - " for k = 1:(n - 1)\n", - " for i = (k + 1):n\n", - " m = M[i,k]/M[k,k]\n", - " for j = (k + 1):n\n", - " M[i,j] = M[i,j] - m*M[k,j]\n", - " end\n", - " b[i] = b[i] - m*b[k]\n", - " end\n", - " end\n", - " \n", - " return nothing\n", - "end" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "Comment: Note that while M, b are used in prior cells these variables don't interfere in the definition of forward_elimination!. The variables listed in the argument of forward_elimination!, that is (M,x,b,n), are evaluated in local scope when forward_elimination! is called.\n", - "
" + "# process specifications and constants\n", + "mu = 8.9e-4 # Pa*s\n", + "dPdz = -1000 # Pa/m\n", + "delta_r = 0.001 # m\n", + "r = range(0.0, 0.05, step = delta_r) # m\n", + "println(\"done\")" ] }, { @@ -486,7 +203,8 @@ "metadata": {}, "source": [ "
\n", - "INTERACTIVE! The overall gauss elimination function is defined below. You just need to finish coding the back_substitution! function.\n", + "INTERACTIVE! Now, we enter the discretized system of linear algebraic equations in matrix-vector form.\n", + "You should write the equation for the first node (center of the pipe) by yourself..\n", "
" ] }, @@ -496,109 +214,32 @@ "metadata": {}, "outputs": [], "source": [ - "function back_substitution!(M,x,b,n)\n", - " \n", - " # FILL IN THE REST BELOW HERE\n", - " \n", - " return nothing\n", - "end" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "ename": "UndefVarError", - "evalue": "UndefVarError: M not defined", - "output_type": "error", - "traceback": [ - "UndefVarError: M not defined", - "", - "Stacktrace:", - " [1] top-level scope at In[2]:10" - ] - } - ], - "source": [ - "function Gauss_Elimination!(M, b)\n", - " n = length(b)\n", - " x = zeros(n)\n", - " \n", - " forward_elimination!(M,b,n)\n", - " back_substitution!(M,x,b,n) \n", - " \n", - " return x\n", + "# creating a matrix and vector for the equations\n", + "n = length(r)\n", + "A = zeros(n,n)\n", + "b = zeros(n)\n", + "\n", + "### FILL IN THE ENTRIES OF A[1,i] and b[1] for i = 1,...,n by yourself here ###\n", + "# interior nodes\n", + "for i = 2:n-1\n", + " A[i,i-1] = -1/(r[i]*2*delta_r) + 1/delta_r^2\n", + " A[i,i] = -2/delta_r^2\n", + " A[i,i+1] = 1/(r[i]*2*delta_r) + 1/delta_r^2\n", + " b[i] = dPdz/mu\n", "end\n", "\n", - "# Runs a Gauss elimination routine using Mx = b has inputs\n", - "x = Gauss_Elimination!(M, b)\n", - "\n", - "display(\"The solution via Gauss elimination is \"); \n", - "display(x)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Solving with an LU factorization \n", - "\n", - "
\n", - "INTERACTIVE! Run the following snippet of code to solve the linear system using LU factorization to solve the linear system.\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\"The solution via LU factorization is \"" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "13-element Array{Float64,1}:\n", - " 83.33333333333337 \n", - " 833.3333333333339 \n", - " 750.0000000000006 \n", - " 58.33333333333337 \n", - " 24.999999999999996\n", - " 833.3333333333339 \n", - " 58.33333333333337 \n", - " 25.0 \n", - " 83.33333333333337 \n", - " 58.33333333333337 \n", - " 750.0000000000006 \n", - " 13.888888888888896\n", - " 4.166666666666666" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "using LinearAlgebra: lu\n", - "\n", - "lu_fact = lu(M) # performs an LU factorization of M. Note that pivot = Val(false)\n", - " # means that the LU factorization is performed without pivoting\n", - " # (otherwise a permutation matrix describing the pivots is computed as well)\n", + "# last node\n", + "A[n,n] = 1\n", + "b[n] = 0\n", "\n", - "y = lu_fact.L\\b # solve Ly = b for y\n", - "x = lu_fact.U\\y # solve Ux = y for x\n", + "# solving the matrix for the velocity profile\n", + "u = A\\b\n", "\n", - "display(\"The solution via LU factorization is \"); \n", - "display(x)" + "# plot of velocity profile\n", + "plt = plot(u,r,label=\"\")\n", + "plot!(plt,u,-r,label=\"\", title= \"Velocity Profile\")\n", + "xlabel!(\"Velocity (m/s)\")\n", + "ylabel!(\"Radius (m)\")" ] }, { @@ -609,10 +250,8 @@ "\n", "# Questions for reflection \n", "\n", - "- What varieties of problems may result in a banded matrix?\n", - "- What does it mean that an iterative method converged? \n", - "- When is an absolute or relative convergence criteria preferable?\n", - "- When is solving by one method versus another preferable (e.g. Banded Gauss-Elimination versus Gauss-Siedel)?" + "- How can you tell if the spatial discretization chosen for this example was small enough?\n", + "- In general, a number of higher-order spatial discretizations may be used when discretizing a problem (see [slide 9 here](https://www.mathematik.uni-dortmund.de/~kuzmin/cfdintro/lecture4.pdf))." ] } ], diff --git a/tutorial/julia/Tutorial 4 - ODEs, Boundary Value Problems/pipe1.png b/tutorial/julia/Tutorial 4 - ODEs, Boundary Value Problems/pipe1.png new file mode 100644 index 0000000000000000000000000000000000000000..540908d8453533f755043cf3b79134554977670c GIT binary patch literal 43820 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≈ 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 ND9ETv*GK|F{})-i4}t&y literal 0 HcmV?d00001 diff --git a/tutorial/julia/Tutorial 4 - ODEs, Boundary Value Problems/pipe2.png b/tutorial/julia/Tutorial 4 - ODEs, Boundary Value Problems/pipe2.png new file mode 100644 index 0000000000000000000000000000000000000000..757a85a148a14807e1eb062d6facf1865fb96497 GIT binary patch literal 19878 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 delta 8486 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 bP_H;K$W{mylq}8w$q4EZ7l30H`B(p68rVJg diff --git a/tutorial/matlab/Tutorial 4 - ODEs, Boundary Value Problems/M4_ODEBVPsystems.mlx b/tutorial/matlab/Tutorial 4 - ODEs, Boundary Value Problems/M4_ODEBVPsystems.mlx index 91013f5ff79da6983a16b998c1bbca359058ff2b..35b6afc3e6f410a3094c429758b31f7161cb0871 100644 GIT binary patch delta 1622 zcmY+EYdF(=7{~Y9$>z|;%9^QUW}8DK$2^gPhsUGyadEVUj{kiV%{pNdL*EgdZ$?HanByhxNYED)I{D<0H z_qqM^k%f&q43;f!Mog0kQX?vAz^i_&MKL)wka?gl1#^Su4Zo#$pImapF?d&eMEpWnR! zj~v9vHM0FzsB2 zJYU~{5MS>voElNz9liQoX<0R_sBT19Rj{UmS?$MQ51&yAGPyYZWpVc`ZEme7!R{DKRGs&+H)IG$S+8d00ha{1gl;M{*Lnr`+=INByt}w^QNGDg|+`y1aF% z=)9I-Xd>OtFZrpgx#DDHql4qww{;soK7YbMu=ITzD-eoOuT!m~K~92MkIWkDmwDV{ z7*sjWSwdv%b3LU^(>{no-y-s3AH(EF(x#}K;}X+HD-w*J)Zt_(Ej5$blw+fIP_TPsoj@vxcX6!92m*rk27=s#V%|Vp7GGp_BF7mdQnWpYodW_p} z$=0w3e4Fgg1e`n-p})Zt#ZE;dCwuOI;{mj*bw(yBHLAart4H=1I`|`;(03U*M^q?d zh)ofwohY>zAw;9##T`kpiUZ&CSF7z93bw~;!3)hEbGM+X=ho&J2oFG-%{gtj-Rkfka#lIUPuhk6El$h_)^$!1S+l7 z;h=Kq1+j^-lZRVq(SCACwRypQsY`h#!Q5+?EUu$7Ug)*<6;dXmDiPojmSY%BYP!SA zoX|$20TlB_zovXDvu=;^4MWPh;#O^K@e*6s66*k)^1~WyIxPw# zAJ@3Z*ZCc`*X)WDSKWy;8XdrSal+baFiX0w-|=x8sUbN9>#l8W(*=SpCjxA7;98@2guF$f3Nl_6WSWr|@B`mw?6C zeK2u-n`K+pS4=(d6yL;V10WDHRftGnC=SJaL4d%lErd;=L0mxy2b#(wy;DTL!e2OV zPXux?3jHC*2F{R4EUH}ZsEfJZ z#uk>jjQQVM`LXX^vi|iVm0UsG;GX60_k|z(jI#S6^~-y|m?GM@r{<%Qn!YX6=GbbqSXE zh7r&b+@WHTzSB;V01bu@e4Km}yVaumYor0HZdJy<;=fuj#vbs=HP0_fG>=X{(dxO# z&R<8X9OPj2^6wp@7qfd4nK0 z4KV*7%#c3~m@n)yXn+i~pldXsv%qchya*bhffWm^N}ppHM5hDFe;#|&!4ialE`XT2 zKpSeO13Z*W0eF?U55d5EfgOgb=)ePhSPv4-T|-rRKn*%IuS=o=yz0E-k1m?}M^H%x PI4G6@@aQA@^P7JG$27}^ delta 1612 zcmV-S2DAB$(*%#x1hBjU1A(lRlfMG{4S}qbQFcdv(mN3V0F$%F10?}}?Qi%-&E~q| z>y$kn**oq`KmFnPw`7z;e`=tQ9Q35|&5y@%bHgRQ;ITfYicS=brgm*23GGNYIP%kh zJ-5j0ZWTH)LSb!0OX9 z6LA%5J1a%ett+oNxHktdX2^Ya0K!;XNrL}XB0K{IVMyq?Z2B*dV zfa0o~zIx6;C&gN&$fYA5aJ_K4*HcXMGnTEKZ~-?caE(R{MuQ0(Dat*<{+@gga&J#Q zXh3FMPnQa|O#jw?_0A?3ZD!0u85Cr+AR&E^EH~!hamXYlLi+U*Z4?St#z7=OXVA)Q zq&PAr%nSO-10+~~69i7nA88WD?bn?7EHLsPZ~=}Mi5Ia(uLiEX1b;z__A6L?47vgb z2`P%>Hnn3nrwlxqL;aJ_r|RG`#R9>KVxbbD{WuJiV$|=Fj;#X5AkD=%6K32I&Z+K}(!XPD};2oulYLOX3=1|g4JXkLdm@vT< z$SoQW#9!+M@MWEx;NaSg7|67TZ`7oSW)lXUtFB~^NaNCUEiF)>%*16mpaaF2zx_Z zoG3n->gJ%kikIw-x%b@!@-C(5Yzk(P%%%`vL7)Qs4-_;e2fZnvZqB~63@IIjfwFCg z#?pAQ1sADCPS7}&iS9v1`mK;n7tl6-CBP==wX;+2;vyc}g$%0#0%SYm( zwaBiF^n@mJaLiWhJXPSpN6h16u!989zI1|3kRPYYi;H#TTnpgmm4FBDbjmPZp@RIJ zpvswMfV)T_19XL1JLGi&gkC`!=nv%IGT#Y3E35D0B*5Iml5Oxwa6*FolcmX&4gp3C zWvtVGWo7r_+?Y=W_kasAHD>%8CMFx)&tJFdocb3jp5Ehe2yTR6kV#q(k1I5XqRAI9(r$0t0}cn(79P zQkNC0N-Or+7_^b~j;*5OOIs30)TmfrVxm40uhA@-DknRQKBbtw2?9BbH_emu2)zL- zv$6@40Rf@2M++AO0VA_t5A_29T9Z{1Q~^J;suO1c76|Iz@&{I*{tr+~0|XQR000O8 zfvl9XCl&Dl1A(lRvl|z&qyvGhl(WyfX=Vj+?LH0@mpvi@G=EY7D@hliu0TQ}2*l2E zrm02jShgYU-{Xcht!Ni4NB7LpJj&(P^ynLW(1Wco%PB@+)zE6&Rrs}8Ww#iGC~YhI z!9s<15HMQSrE)?I9-jT+z()-MC6Nt6xe9M$bb^qeHeh7P6Jb-h9=wq;mA)fRs!!Pg z;gl|jfhb!UC4boqGdCOYLD{NV>ArkF30g&<2Lm<+!g5AVtkH4j;A+P)JfkCc6RyHj zGLze&XKEbBd@Lp|&CkgD)8osuYNqY}R0?oi9@Ij4kP%vx1mbtFWAawqKQt>`bINJP zc*brTS_pb482c#6pZ=53q~EOdzl@wUl#5~^C_ghE1qXFWE}mHb0Jn7`0fz$vfvl95 z|0V%R4S}qbQFcdv(mN3V0F#$hCjm4Afvl95j3)sb0UVd8CjlS>fvl95%O?RF0T7qx zCjlP=fvl952`B*@0mPRjC;=lIaqT`169E7K5CQ-I8vp|U_B>^dyb}0c6 K26-j{0000kBfiD}