{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "568bde50",
   "metadata": {},
   "source": [
    "# Innlevering 3 - Likningsløsning"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d8de45fe",
   "metadata": {},
   "source": [
    "De fleste likninger som detter ut av praktiske anvendelser er\n",
    "umulige å løse for hånd. \n",
    "Under ser du et bilde av en torsjonsfjær.\n",
    "Dette er en slik fjær du finner i musefeller og i gamle dører\n",
    "og den leverer et moment\n",
    "som er proporsjonalt med utslagsvinkelen $\\theta$.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "11f59563",
   "metadata": {},
   "source": [
    "![alt text](L1030352.jpg \"Title\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b5160e6a",
   "metadata": {},
   "source": [
    "Vi fester en horisontal stang med lengde $l$ i en vegg med en torsjonsfjær med stivhet $k$\n",
    "og legger en vekt $m$ ytterst på stangen.\n",
    "Gravitasjonskraften fra vekten gir dreiemomentet $ml\\cos \\theta$,\n",
    "så hvis vi har lyst til å regne ut hvor langt ned vekten drar stangen,\n",
    "må vi finne punktet der momentet fra fjæren balanserer momentet fra vekten:\n",
    "\\begin{align*}\n",
    "\tk\\theta = ml\\cos \\theta\n",
    "\\end{align*}\n",
    "\n",
    "![alt text](torsjonsfjær.png \"Title\")\n",
    "\n",
    "Vi setter $ml/k=1$.\n",
    "Her er et plot av funksjonene $f(\\theta)=\\theta$ og $g(\\theta)=\\cos \\theta$.\n",
    "Disse krysser hverandre,\n",
    "så løsningen til likningen eksisterer,\n",
    "men den er ikke helt god å finne med penn og papir.\n",
    "Løsningen kalles dottietallet og er oppkalt etter en professor i fransk.\n",
    "Professor Dottie oppdaget at hvis hun skrev inn et tilfeldig tall på en kalkulator\n",
    "og trykket gjentatte ganger på cosinusknappen,\n",
    "endte hun alltid opp på omtrent $0.739085$.\n",
    "\n",
    "![alt text](dottie.png \"Title\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d07dc8b",
   "metadata": {},
   "source": [
    "1. Løs likningen $\\theta=\\cos \\theta$ med vanlig fikspunktiterasjon. \n",
    "Spiller $x_0$ noen rolle? Hvor mange interasjoner trengs for å nå maskinpresisjon?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3c2846cf",
   "metadata": {},
   "source": [
    "På skolen lærte du Newtons metode:\n",
    "\\begin{align*}\n",
    "    x_{n+1} = x_n - \\frac{f(x_n)}{f'(x_n)}\n",
    "\\end{align*}\n",
    "Denne leter etter nullpunkter til $f$. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "13e724fb",
   "metadata": {},
   "source": [
    "\n",
    "2. Løs likningen $\\theta = \\cos \\theta$ med Newtons metode. \n",
    "Spiller $x_0$ noen rolle? Hvor mange interasjoner trengs for å nå maskinpresisjon?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2a734c5b",
   "metadata": {},
   "source": [
    "Som du ser av oppgavene over, \n",
    "oppfører disse to metodene seg helt forskjellig. \n",
    "Dersom vi skal forstå hvorfor, \n",
    "trenger vi Taylors teorem, \n",
    "som sier at dersom $f$ er $n+1$ ganger kontinuerlig deriverbar på et åpent intervall som inneholder $x$ og $x$, \n",
    "finnes det en $s$ mellom $x$ og $a$ slik at \n",
    "\\begin{align*}\n",
    "f(x)&=\n",
    "f(a)+f'(a)(x-a)+\\frac{f''(a)}{2}(x-a)^2+\\cdots+ \\frac{f^{(n)}(a)}{n!}(x-a)^n + \\frac{1}{n!}\\int^x_a (x-s)^nf^{(n+1)}(s)\\; ds\n",
    "\\end{align*}\n",
    "Dersom $n=0$ kalles denne sekantsetningen. \n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "82cb9a0c",
   "metadata": {},
   "source": [
    "3. Bruk Taylors teorem $n=0$ til å vise at for fikspunktiterasjonen finnes det,\n",
    "dersom $g$ er deriverbar og alle brouwers teoremers mor og så finnes $s$ slik at\n",
    "\\begin{align*}\n",
    "    x_{n+1}-r=g'(s)(x_n-r)\n",
    "\\end{align*}\n",
    "der $r=g(r)$ og $x_{n+1} = g(x_n)$."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "22218343",
   "metadata": {},
   "source": [
    "Dersom man innser at Newtons metode også er en fikspunktiterasjon \n",
    "\\begin{align*}\n",
    "    x_{n+1} = x_n - \\frac{f(x_n)}{f'(x_n)} = g(x_n)\n",
    "\\end{align*}\n",
    "kan vi analysere den på liknende vis, \n",
    "men vi må sette $n=1$ i Taylors teorem. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "246855da",
   "metadata": {},
   "source": [
    "4. Vis at under noen betingelser på fandens oldemor finnes $s$ slik at \n",
    "\\begin{align*}\n",
    "x_{n+1}-r=  \\frac{f''(s)}{2f'(x_n)}(r-x_n)^2.\n",
    "\\end{align*}\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a67c1ab2",
   "metadata": {},
   "source": [
    "Jacobis metode \n",
    "\\begin{align*}\n",
    "    x_{n+1} = D^{-1}\\left(b - (L+U)x_n\\right)\n",
    "\\end{align*}\n",
    "for lineære systemer er forresten også en fikspunktiterasjon. \n",
    "At den konvergerer når $A$ er strengt diagonaldominant er lett å se dersom du kan Banachs fikspunktteorem og vet hva en gershgorinsirkel er. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fe5ae1cb",
   "metadata": {},
   "source": [
    "5. Vis dette og test Jacobis metode på likningssystemene \n",
    "\\begin{align*}\n",
    "    2x_1 + 3x_2 + 4x_3 =  4 \\\\\n",
    "    3x_1 + 4x_2 + 5x_3 =  5 \\\\\n",
    "    4x_1 + 5x_2 + 7x_3 =  3 \n",
    "\\end{align*}\n",
    "og \n",
    "\\begin{align*}\n",
    "    -\\frac{1}{\\sqrt{2}}x_1 + \\frac{1}{2}x_2 =  0 \\\\\n",
    "    \\frac{1}{\\sqrt{2}}x_1 + \\frac{\\sqrt{3}}{2}x_2 = 1 \n",
    "\\end{align*}\n",
    "Prøv å spå om det konvergerer før du kjører. \n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c79fcef5",
   "metadata": {},
   "source": [
    "Og her er litt kode for cobwebplot forresten. \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b8f9f63a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# pakkene vi trenger\n",
    "%matplotlib inline\n",
    "import math # vi trenger tilgang til sinus-funksjonen math.sin() \n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# fikser litt på pyplot\n",
    "newparams = {'figure.figsize': (8.0, 4.0), 'axes.grid': True,\n",
    "             'lines.markersize': 8, 'lines.linewidth': 2,\n",
    "             'font.size': 14}\n",
    "plt.rcParams.update(newparams)\n",
    "\n",
    "# høyresiden i den logistiske ligninga\n",
    "def f(x,r,K):\n",
    "    return x+r*x*(K-x)\n",
    "\n",
    "#parametre\n",
    "r=1/2 #vekstfaktor \n",
    "K=1 #bærekapasitet\n",
    "u0=1/4 #startverdi\n",
    "nmax=10 # vi itererer nmax ganger\n",
    "n = np.arange(0.0, nmax+1, 1) \n",
    "\n",
    "# itererer u_{n+1} = f(u_n,r,K) nmax ganger; vi starter på (0,u_0)\n",
    "u = np.zeros(nmax+1) # vi begynner med en vektor u som har nullere overalt\n",
    "u[0] = u0\n",
    "punkter = [(0,u0)]\n",
    "\n",
    "for i in range(1, nmax+1):\n",
    "    u[i] = f(u[i-1], r, K)\n",
    "    ui = u[i]\n",
    "    punkter.append((i,ui))\n",
    "\n",
    "plt.plot(n, u, 'bo') \n",
    "print(punkter) \n",
    "\n",
    "# cobweb-plottet\n",
    "\n",
    "x = np.arange(0, 1., 0.01) # lager mesh for grafer på en annen måte enn tidligere\n",
    "\n",
    "# vi plotter y = f(x,r,K) og y = x, hvor x representerer u_n\n",
    "plt.plot(x, f(x,r,K), 'b') # plotter y = f(x,r,K) i blått \n",
    "plt.plot(x, x, 'r')        # plotter y = x i rødt\n",
    "\n",
    "# visualiser coweb i grønt\n",
    "plt.plot([u[0],u[0]], [0,u[1]],'g') # første vertikale linje mellom punktene (u[0],0) og (u[0],u[1])\n",
    "for i in range(1, nmax):\n",
    "    plt.plot([u[i],u[i]],[u[i],u[i+1]],'g') # lager vertikal linje mellom punktene (u[i],u[i]) og (u[i],u[i+1])\n",
    "\n",
    "for i in range(0, nmax):\n",
    "    plt.plot([u[i],u[i+1]],[u[i+1],u[i+1]],'g') # lager horisontal linje mellom punktene (u[i],u[i+1]) og (u[i+1],u[i+1])\n",
    "\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
