{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "from math import exp, pi, sin, cos, tan, atan, sqrt, floor, log10, nan, log   # math functions\n",
    "import numpy as np\n",
    "import scipy.linalg as la             # linear algebra functions\n",
    "from scipy.integrate import solve_ivp\n",
    "import matplotlib\n",
    "from matplotlib import pyplot as plt  # general plotting \n",
    "from matplotlib.colors import ListedColormap\n",
    "import time;\n",
    "from matplotlib import animation, rc\n",
    "from IPython.display import HTML\n",
    "\n",
    "# function to make a numpy N-by-1 column vector\n",
    "# c=eda_cvec(v1, v2, ...) from a list of several\n",
    "# array-like entities v1, v2, including a number\n",
    "# a list of numbers, a tuple of numbers, an N-by-0 np array\n",
    "# and a N-by-1 np array. The function\n",
    "# also insures that, if v is an np array, that\n",
    "# c is a copy, as contrasted to a view, of it\n",
    "# It promotes integers to floats, and integers\n",
    "# and floats to complex, by context.\n",
    "# This version concatenates many argments,\n",
    "# whereas c=eda_cvec1(v1) takes just one argiment.\n",
    "# I recommend always using eda_cvec(v1, v2, ...)\n",
    "def gda_cvec(*argv):\n",
    "    t = int;\n",
    "    Nt = 0;\n",
    "    for a in argv:\n",
    "        v = gda_cvec1(a);\n",
    "        N,M = np.shape(v);\n",
    "        Nt = Nt + N;\n",
    "        if( N==0 ):\n",
    "            continue; # skip vector of zero length\n",
    "        if (t==int) and isinstance(v[0,0],float):\n",
    "            t=float;\n",
    "        elif isinstance(v[0,0],complex):\n",
    "            t=complex;\n",
    "    w = np.zeros((Nt,1),dtype=t);\n",
    "    Nt = 0;\n",
    "    for a in argv:\n",
    "        v = gda_cvec1(a);\n",
    "        N,M = np.shape(v);\n",
    "        w[Nt:Nt+N,0:1] = v;  # patch 20230418 was #w[Nt:Nt+N,0] = v[0:N,0];\n",
    "        Nt = Nt + N;\n",
    "    return w;\n",
    "\n",
    "# function to make a numpy N-by-1 column vector\n",
    "# c=gda_cvec1(v) from entity v that is array-like,\n",
    "# including a number, a list of numbers, a tuple\n",
    "# of numbers, an N-by-0 np array and a N-by1 np array.\n",
    "# It promotes integers to floats, and integers\n",
    "# and floats to complex, by context. The function\n",
    "# also insures that, if v is an np array, that\n",
    "# c is a copy, as contrasted to a view, of it.\n",
    "# This version takes just one input argment.\n",
    "# whereas c=gda_cvec(v1,v2,...) concatenates\n",
    "# many argiments.\n",
    "def gda_cvec1(v):\n",
    "    if isinstance(v, int) or isinstance(v, np.int32):\n",
    "        w = np.zeros((1,1),dtype=int);\n",
    "        w[0,0] = v;\n",
    "        return w;\n",
    "    elif isinstance(v, float):\n",
    "        w = np.zeros((1,1),dtype=float);\n",
    "        w[0,0] = v;\n",
    "        return w;\n",
    "    elif isinstance(v, complex):\n",
    "        w = np.zeros((1,1),dtype=complex);\n",
    "        w[0,0] = v;\n",
    "        return w;\n",
    "    elif isinstance(v, np.ndarray):\n",
    "        s = np.shape(v);\n",
    "        if len(s) == 1:\n",
    "            return np.copy(np.reshape(v,(s[0],1)));\n",
    "        else:\n",
    "            [r,c]=s;\n",
    "            if( c==1 ):\n",
    "                return(np.copy(v));\n",
    "            elif(r==1):\n",
    "                return(np.copy(v.T));\n",
    "            else:\n",
    "                raise TypeError(\"gda_cvec: %d by %d ndarray not allowed\" % (r, c));\n",
    "    elif isinstance(v, list):\n",
    "        r = len(v);\n",
    "        t = int;\n",
    "        for vi in v:\n",
    "            if isinstance(vi,int) or isinstance(vi, np.int32): #patch v->vi 20230418\n",
    "                pass;\n",
    "            elif isinstance(vi,float):\n",
    "                t=float;\n",
    "            elif isinstance(vi,complex):\n",
    "                t=complex;\n",
    "                break;\n",
    "            else:\n",
    "                raise TypeError(\"gda_cvec: list contains unsupported type %s\" % type(vi));\n",
    "        w = np.zeros((r,1),dtype=t);\n",
    "        w[:,0] = np.array(v); # patch v -> np.array(v)\n",
    "        return w;\n",
    "    elif isinstance(v, tuple):\n",
    "        r = len(v);\n",
    "        t = int;\n",
    "        for vi in v:\n",
    "            if isinstance(vi,int) or isinstance(vi, np.int32): #patch v->vi 20230418\n",
    "                pass;\n",
    "            elif isinstance(vi,float):\n",
    "                t=float;\n",
    "            elif isinstance(vi,complex):\n",
    "                t=complex;\n",
    "                break;\n",
    "            else:\n",
    "                raise TypeError(\"gda_cvec: tuple contains unsupported type %s\" % type(vi));\n",
    "        w = np.zeros((r,1),dtype=t);\n",
    "        w[:,0] = np.array(list(v)); # patch v -> np.array(list(v));\n",
    "        return w;\n",
    "    else:\n",
    "        raise TypeError(\"gda_cvec: %s not supported\" % type(v));\n",
    "\n",
    "        \n",
    "# gda_draw function makes a \"pictorial matrix equation\"\n",
    "# arguments are vectors, matrices and strings\n",
    "# which are plotted in the order that the appear\n",
    "# except that strings starting with 'title ' are plotted\n",
    "# under the subseqeunt matrix or vector\n",
    "# always returns a status of 1\n",
    "def gda_draw(*argv):\n",
    "    DOCOLOR=True;\n",
    "    if( DOCOLOR ):\n",
    "        bwcmap = matplotlib.colormaps['jet'];\n",
    "    else:\n",
    "        bw = np.zeros((256,4));\n",
    "        v = 0.9*(256 - np.linspace( 0, 255, 256 ))/255;\n",
    "        bw[:,0] = v;\n",
    "        bw[:,1] = v;\n",
    "        bw[:,2] = v;\n",
    "        bw[:,3] = np.ones(256);\n",
    "        bwcmap = ListedColormap(bw);\n",
    "    # size of plot\n",
    "    W = 16;\n",
    "    H = 4;\n",
    "    fig1 = plt.figure(1);\n",
    "    # figsize width and height in inches\n",
    "    fig1.set_size_inches(W,H);\n",
    "    ax1 = plt.subplot(1,1,1);\n",
    "    plt.axis([0, W, -H/2, H/2]);\n",
    "    plt.axis('off');\n",
    "    LM = W/6;    # matrix width and heoght\n",
    "    LV = W/40;   # vector width\n",
    "    FS = 0.12;    # character width\n",
    "    TO = 0.4;    # title vertical offset\n",
    "    SP = 0.2;    # space between objects\n",
    "    LS = 0.2;    # leading space\n",
    "    p = LS; # starting x-position\n",
    "    istitle=0; # flags presence of a title\n",
    "    for a in argv:\n",
    "        if isinstance(a,np.ndarray):\n",
    "            sh = np.shape(a);\n",
    "            if len(sh) == 1:  # conversion to nx1 array\n",
    "                n = sh[0];\n",
    "                m = 1;\n",
    "                ap = a;\n",
    "                a = np.zeros((n,1));\n",
    "                a[:,0] = ap;\n",
    "            else:\n",
    "                n = sh[0];\n",
    "                m = sh[1];\n",
    "            if m==1:\n",
    "                pold=p;\n",
    "                left=p;\n",
    "                right=p+LV;\n",
    "                bottom=-LM/2;\n",
    "                top=LM/2;\n",
    "                plt.imshow( a, cmap=bwcmap, vmin=np.min(a), vmax=np.max(a), extent=(left,right,bottom,top) );\n",
    "                p = p+LV;\n",
    "                pm = (p+pold)/2;\n",
    "                if istitle:\n",
    "                    plt.text(pm,-(LM/2)-TO,titlestr,horizontalalignment='center');\n",
    "                    istitle=0;\n",
    "                p = p+SP;\n",
    "            else:\n",
    "                pold=p;\n",
    "                left=p;\n",
    "                right=p+LM;\n",
    "                bottom=-LM/2;\n",
    "                top=LM/2;\n",
    "                plt.imshow( a, cmap=bwcmap, vmin=np.min(a), vmax=np.max(a), extent=(left,right,bottom,top) );\n",
    "                p = p+LM;\n",
    "                pm = (p+pold)/2;\n",
    "                if istitle:\n",
    "                    plt.text(pm,-(LM/2)-TO,titlestr,horizontalalignment='center');\n",
    "                    istitle=0;\n",
    "                p = p+SP;\n",
    "        elif isinstance(a,str):\n",
    "            ns = len(a);\n",
    "            istitle=0;\n",
    "            if( ns>=6 ):\n",
    "                if 'title ' in a[0:6]:\n",
    "                    istitle=1;\n",
    "                    titlestr=a[6:];\n",
    "            if( istitle != 1):\n",
    "                plt.text(p,0,a);\n",
    "                p = p + ns*FS + SP;\n",
    "    plt.show();\n",
    "    return 1;\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 20968 characters]",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "[encoded data, 21784 characters]",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "[encoded data, 21736 characters]",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "[encoded data, 21672 characters]",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "[encoded data, 20932 characters]",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# x-axis\n",
    "Lx = 41;\n",
    "xmin = 0.0;\n",
    "xmax = 1.0;\n",
    "Dx = (xmax-xmin)/(Lx-1);\n",
    "x = gda_cvec(Dx*np.linspace(0,Lx-1,Lx));\n",
    "\n",
    "# z-axis\n",
    "Lz = 41;\n",
    "zmin=0.0;\n",
    "zmax=1.0;\n",
    "Dz = (zmax-zmin)/(Lz-1);\n",
    "z = gda_cvec(Dz*np.linspace(0,Lz-1,Lz));\n",
    "\n",
    "# static parameters of Gaussian\n",
    "sigmax = 0.1;\n",
    "sigmax2 = sigmax**2;\n",
    "sigmaz = 0.1;\n",
    "sigmaz2 = sigmaz**2;\n",
    "z0 = xmax/2.0;\n",
    "\n",
    "# variable parameter\n",
    "NS = 5;\n",
    "x0vec = gda_cvec( np.linspace( 0.0, xmax, NS ) );\n",
    "\n",
    "for i in range(NS):\n",
    "    fig = plt.figure();\n",
    "    ax = plt.subplot(1,1,1);\n",
    "    plt.axis([0,xmax,0,zmax]);\n",
    "    plt.xlabel('x (m)');\n",
    "    plt.ylabel('y (m)');\n",
    "    plt.title('x0: %.2f' % x0vec[i,0] );\n",
    "    IMG = np.zeros((Lx,Lz));\n",
    "    x0 = x0vec[i,0];\n",
    "    for ix in range(Lx):\n",
    "        for iz in range(Lz):\n",
    "            r2 = ((x[ix,0]-x0)**2)/sigmax2 + ((z[iz,0]-z0)**2)/sigmaz2;\n",
    "            IMG[ix,iz] = np.exp(-0.5*r2);      \n",
    "    # orientation check on 1\n",
    "    if(0):\n",
    "        for ix in range(Lx):\n",
    "            for iz in range(Lz):\n",
    "                IMG[ix,iz] = 0.0;\n",
    "        ix=5;\n",
    "        iz=5;\n",
    "        IMG[ix,iz]=0.3;\n",
    "        ix=Lx-5;\n",
    "        iz=5;\n",
    "        IMG[ix,iz]=0.6;\n",
    "        ix=5;\n",
    "        iz=Lz-5;\n",
    "        IMG[ix,iz]=0.9;\n",
    "\n",
    "    # limits of data values\n",
    "    dmin = 0.0;\n",
    "    dmax = 1.0;\n",
    "    left=0; right=xmax; # position of image\n",
    "    top=zmax; bottom=0;\n",
    "    mycmap=matplotlib.colormaps['jet']; # colormap\n",
    "    # plot initial zero\n",
    "    plt.imshow(np.flipud(IMG.T), cmap=mycmap, vmin=dmin, vmax=dmax, extent=(left,right,bottom,top) );\n",
    "    plt.xlabel('x (m)');\n",
    "    plt.ylabel('z (m)');\n",
    "    plt.colorbar(shrink=0.5);\n",
    "    plt.show();\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<video width=\"640\" height=\"480\" controls autoplay loop>\n",
       "  <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAIGZ0eXBNNFYgAAACAE00ViBpc29taXNvMmF2YzEAAAAIZnJlZQAAXnFtZGF0AAACoAYF//+c\n",
       "3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE2MSAtIEguMjY0L01QRUctNCBBVkMgY29kZWMg\n",
       "LSBDb3B5bGVmdCAyMDAzLTIwMjAgLSBodHRwOi8vd3d3LnZpZGVvbGFuLm9yZy94MjY0Lmh0bWwg\n",
       "LSBvcHRpb25zOiBjYWJhYz0xIHJlZj0zIGRlYmxvY2s9MTowOjAgYW5hbHlzZT0weDM6MHgxMTMg\n",
       "bWU9aGV4IHN1Ym1lPTcgcHN5PTEgcHN5X3JkPTEuMDA6MC4wMCBtaXhlZF9yZWY9MSBtZV9yYW5n\n",
       "ZT0xNiBjaHJvbWFfbWU9MSB0cmVsbGlzPTEgOHg4ZGN0PTEgY3FtPTAgZGVhZHpvbmU9MjEsMTEg\n",
       "ZmFzdF9wc2tpcD0xIGNocm9tYV9xcF9vZmZzZXQ9LTIgdGhyZWFkcz02IGxvb2thaGVhZF90aHJl\n",
       "YWRzPTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJh\n",
       "eV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MyBiX3B5cmFtaWQ9MiBiX2Fk\n",
       "YXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEgd2VpZ2h0Yj0xIG9wZW5fZ29wPTAgd2VpZ2h0cD0yIGtl\n",
       "eWludD0yNTAga2V5aW50X21pbj0yMCBzY2VuZWN1dD00MCBpbnRyYV9yZWZyZXNoPTAgcmNfbG9v\n",
       "a2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9MSBjcmY9MjMuMCBxY29tcD0wLjYwIHFwbWluPTAgcXBt\n",
       "YXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAGrlliIQAN//+9vD+BTY7\n",
       "mNCXEc3onTMfvxW4ujQ3vc4AAAMAAAMAAAMBuaWF/3Z384ggAAADAHbNTT+stB914gDkadgMfYqi\n",
       "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\n",
       "\">\n",
       "  Your browser does not support the video tag.\n",
       "</video>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "[encoded data, 20932 characters]",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "# x-axis\n",
    "Lx = 41;\n",
    "xmin = 0.0;\n",
    "xmax = 1.0;\n",
    "Dx = (xmax-xmin)/(Lx-1);\n",
    "x = gda_cvec(Dx*np.linspace(0,Lx-1,Lx));\n",
    "\n",
    "# z-axis\n",
    "Lz = 41;\n",
    "zmin=0.0;\n",
    "zmax=1.0;\n",
    "Dz = (zmax-zmin)/(Lz-1);\n",
    "z = gda_cvec(Dz*np.linspace(0,Lz-1,Lz));\n",
    "\n",
    "# number of frames in animation\n",
    "NITER = 20;\n",
    "\n",
    "# static parameters of Gaussian\n",
    "sigmax = 0.1;\n",
    "sigmax2 = sigmax**2;\n",
    "sigmaz = 0.1;\n",
    "sigmaz2 = sigmaz**2;\n",
    "z0 = xmax/2.0;\n",
    "\n",
    "# variable parameter\n",
    "NS = 20;\n",
    "x0vec = gda_cvec( np.linspace( 0.0, xmax, NS ) );\n",
    "\n",
    "fig = plt.figure();\n",
    "ax = plt.subplot(1,1,1);\n",
    "plt.axis([0,xmax,0,zmax]);\n",
    "plt.xlabel('x (m)');\n",
    "plt.ylabel('y (m)');\n",
    "i=0;\n",
    "plt.title('x0: %.2f' % x0vec[i,0] );\n",
    "\n",
    "# set up initial plot\n",
    "dmin = 0.0;\n",
    "dmax = 1.0;\n",
    "left=0; right=xmax;\n",
    "top=zmax; bottom=0;\n",
    "IMG = np.zeros((Lx,Lz));\n",
    "mycmap=matplotlib.colormaps['jet'];\n",
    "plt.imshow(np.flipud(IMG.T), cmap=mycmap, vmin=dmin, vmax=dmax, extent=(left,right,bottom,top) );\n",
    "im = ax.imshow(np.flipud(IMG.T), cmap=mycmap, vmin=dmin, vmax=dmax, extent=(left,right,bottom,top) );\n",
    "plt.xlabel('x (m)');\n",
    "plt.ylabel('z (m)');\n",
    "plt.colorbar(shrink=0.5);\n",
    "\n",
    "def init():\n",
    "    im.set_data([[]]);\n",
    "    return (im,)\n",
    "\n",
    "def animate(i):\n",
    "    # compute image for given value of variable parameter here\n",
    "    x0 = x0vec[i,0];\n",
    "    for ix in range(Lx):\n",
    "        for iz in range(Lz):\n",
    "            r2 = ((x[ix,0]-x0)**2)/sigmax2 + ((z[iz,0]-z0)**2)/sigmaz2;\n",
    "            IMG[ix,iz] = np.exp(-0.5*r2);\n",
    "    # orientation check on 1\n",
    "    if(0):\n",
    "        for ix in range(Lx):\n",
    "            for iz in range(Lz):\n",
    "                IMG[ix,iz] = 0.0;\n",
    "        ix=5;\n",
    "        iz=5;\n",
    "        IMG[ix,iz]=0.3;\n",
    "        ix=Lx-5;\n",
    "        iz=5;\n",
    "        IMG[ix,iz]=0.6;\n",
    "        ix=5;\n",
    "        iz=Lz-5;\n",
    "        IMG[ix,iz]=0.9;\n",
    "    im.set_data(np.flipud(IMG.T) );\n",
    "    plt.title('x0: %.2f' % x0vec[i,0] );\n",
    "    return (im,)\n",
    "\n",
    "anim = animation.FuncAnimation(fig, animate, init_func=init,\n",
    "                               frames=NITER, interval=50, \n",
    "                               blit=True)\n",
    "\n",
    "HTML(anim.to_html5_video())\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "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.11.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
