{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Alkalmazott Analízis I., 2016/2017. tavasz\n", "
\n", "
\n", "\n", "
\n", "
\n", "\n", "### Általános információk:\n", "+ Gyakorlat vezetője: Fekete Imre\n", "+ Tanszék: Alkalmazott Analízis és Számításmatematikai Tanszék\n", "+ Déli Tömb 3.702\n", "+ Honlap: http://www.cs.elte.hu/~feipaat/\n", "+ Fogadóórák: H 12:50-13:50 és Sz 14:45-15:45\n", "+ Piazza: Kurzushoz kapcsolódó minden anyag és csoportos levelezés https://piazza.com/elte.hu/spring2017/mm1c1aa4e \n", "\n", "### Számonkérés:\n", "\n", "+ 2 db zárthelyi; mindkettő legalább elégséges\n", "+ Beadható feladatokkal lehet bónuszpontokat szerezni\n", "
\n", "\n", "### 3 kívánság:\n", "
\n", "\n", "
\n", "
\n", "
\n", "
\n", "
\n", "
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
\n", "##
1. Feladatsor
\n", "\n", "\n", "### Kerekítési hiba, numerikus instabilitás\n", "1.feladat. Oldjuk meg az eredeti és a hibával terhelt rendszert.\n", "
\n", "\n", "(a)\n", "$\\left( \\begin{array}{cc}\n", "1 & 1 \\\\\n", "1 & 1.01\n", "\\end{array} \\right)$\n", "$\\left( \\begin{array}{c}\n", "x_{1}\\\\\n", "x_{2}\n", "\\end{array} \\right)$=$\\left( \\begin{array}{c}\n", "2 \\\\\n", "2.01\n", "\\end{array} \\right)$\n", "\n", "(b)\n", "$\\left( \\begin{array}{cc}\n", "1 & 1 \\\\\n", "1 & 1.01\n", "\\end{array} \\right)$\n", "$\\left( \\begin{array}{c}\n", "y_{1}\\\\\n", "y_{2}\n", "\\end{array} \\right)$=$\\left( \\begin{array}{c}\n", "2 \\\\\n", "2.02\n", "\\end{array} \\right)$\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\u001b[0;31mMatrix dimensions must agree.\n", "\u001b[0m" ] } ], "source": [ "A_1=[1 1; 1 1.01]\n", "b_1=[2 2.01] % A % a kommentelés MATLAB-ban. Nem kapunk jó eredmény, mert b_1 nem oszlopvektor.\n", "%Transzponáljunk!\n", "x_1=A_1\\b_1\n" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A_1 =\n", "\n", " 1.000000000000000 1.000000000000000\n", " 1.000000000000000 1.010000000000000\n", "\n", "\n", "b_1 =\n", "\n", " 2.000000000000000\n", " 2.010000000000000\n", "\n", "\n", "x_1 =\n", "\n", " 1.000000000000022\n", " 0.999999999999978\n" ] } ], "source": [ "A_1=[1 1; 1 1.01], b_1=[2 2.01]'\n", "x_1=A_1\\b_1 % A megoldás: x_1=A_1^{-1}*b_1\n", "% Ez lenne a megfelelő MATLAB parancs: x_1=inv(A_1)*b_1 Ha lehet kerüljük, mert lassú!" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x_2 =\n", "\n", " 0\n", " 2\n", "\n", "\n", "ans =\n", "\n", " 402.0075\n" ] } ], "source": [ "b_2=[2 2.02]'; x_2=A_1\\b_2 % A hibával terhelt megoldás\n", "cond(A_1) % A A_1 mátrix euklidészi, azaz 2-es kondíciószáma" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "2.feladat. Tekintsük az alábbi integrált:\n", "$$\\displaystyle I_n=\\int_0^1\\frac{x^n}{10+x}dx,$$ ahol $n\\in\\mathbb{N}$.\n", "
\n", "
\n", "(a) Mutassuk meg, hogy $I_n\\geq 0$, $I_{n+1}\\leq I_n$ és $I_n\\to 0$, ha $n\\to\\infty$.
\n", "(b) Adjunk rekurziót $I_n$-re. Számoljuk ki a rekurzió elsõ pár tagját. Magyarázzuk meg, miért viselkedik a rekurzió nagy $n$-ekre rosszul és javítsuk az algoritmust." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "I_1 =\n", "\n", " 0.095310179804325\n", " 0.046898201956751\n", " 0.031017980432493\n", " 0.023153529008398\n", " 0.018464709916015\n", " 0.015352900839845\n", " 0.013137658268212\n", " 0.011480560175024\n", " 0.010194398249764\n", " 0.009167128613475\n", " 0.008328713865254\n", " 0.007621952256554\n", " 0.007113810767796\n", " 0.005784969245117\n", " 0.013578878977397\n", " -0.069122123107305\n" ] } ], "source": [ "format long\n", "n=15;\n", "I_1=zeros(n+1,1);\n", "I_1(1)=log(1.1); % I_1(1) a feladatbeli I_0\n", "for i=1:n\n", "I_1(i+1)=1/i-10*I_1(i);\n", "end \n", "I_1" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ans =\n", "\n", " 0.005712557103543\n", " 0.005374428964568\n", " 0.005079239766082\n", " 0.004763157894737\n", " 0.005000000000000\n" ] } ], "source": [ "% Numerikusan stabil algoritmus\n", "n=20;\n", "I_2=zeros(n,1);\n", "I_2(n)=0;\n", "for i=1:n-1\n", " I_2(n-i)=1/10*(1/(n+1-i)-I_2(n+1-i));\n", "end \n", "I_2(15:end-1) % Ha csak az utolsó elemek az érdekesek" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "3.feladat. (Beadható házi feladat)
\n", "Tekintsük az alábbi integrált:\n", "$$\\displaystyle I_n=\\int_0^1 x^ne^{-x}dx,$$ ahol $n\\in\\mathbb{N}$.\n", "
\n", "
\n", "(a) Mutassuk meg, hogy $I_n\\geq 0$ és $I_n\\to 0$, ha $n\\to\\infty$.
\n", "(b) Adjunk rekurziót $I_n$-re. Számoljuk ki $I_{10},\\ I_{20},\\ I_{30}$ értékeit." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Gépi matematika\n", "\n", "##### Gépi számok halmaza\n", "\n", "$$M\\equiv M(a,t,k^-,k^+):=\\{\\pm a^k\\sum_{i=1}^t x_ia^{-i} : k^-\\leq k\\leq k^+, 0\\leq x_i\\leq a-1, i=1,\\ldots,t\\}\\subset\\mathbb{R}$$\n", "ahol\n", "+ $a\\in\\mathbb{N}^+$ a *számrendszer alapja*\n", "+ $t\\in\\mathbb{N}$ a *mantissza hossza*\n", "+ $k\\in\\mathbb{Z}$ az *exponens* vagy *karakterisztika*\n", "+ Megállapodás: $x_1\\neq 0$ (normalizált lebegőpontos szám)\n", "
\n", "\n", "Nevezetes gépi értékek:\n", "+ $x'$ az $x$ *rákövetkezője*\n", "+ $\\epsilon_0$ a 0 rákövetkezője\n", "+ $0.5\\cdot\\epsilon_1=0.5\\cdot a^{1-t}$ a *gépi epszilon*\n", "+ $M_{\\infty}$ a *legnagyobb gépi szám*\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Valós számok konverziója gép számmá\n", "\n", "Legyen $x\\in\\mathbb{R}$ olyan, hogy $|x|\\leq M_{\\infty}.$ Definiáljuk az fl$:\\mathbb{R}\\to M$ függvényt az alábbi módon: \n", "\n", "+ $fl(x):=0,\\ \\mathrm{ha}\\ |x|<\\epsilon_0$\n", "+ $fl(x):=x\\text{-hez legközelebb eső gépi szám},\\ \\mathrm{ha}\\ \\epsilon_0\\leq |x|\\leq M_{\\infty}$\n", " \n", "Ha $|x|>M_{\\infty}$, akkor fl$(x)$\n", "+ nem értelmezett vagy\n", "+ NaN (Not a Number)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ans =\n", "\n", " 2.220446049250313e-16\n" ] } ], "source": [ "\n", "eps" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
\n", "4.feladat. Írjuk fel $M(2,2,-2,1)$ összes elemét! Számítsuk ki $M_{\\infty},\\ \\epsilon_0,\\ \\epsilon_{0}^{'},\\ \\epsilon_{1}$ értékét.
\n", "\n", "5.feladat. Ábrázoljuk az $M(2,2,-2,1)$ paraméterekkel rendelkezõ gépen a következõ számokat: $$\\frac{1}{2},\\ \\frac{3}{16},\\ \\frac{1}{10},\\ \\frac{6}{10},\\ \\frac{1}{\\pi}.$$
\n", "\n", "6.feladat. Tekintsük az $M(2,4,-3,3)$ paraméterekkel rendelkezõ számítógépet. Keressünk olyan $x,\\ y,\\ z$ nemnulla számokat $M$-ben, hogy \n", "+ $x+y=x$,\n", "+ $(x+y)+z\\neq x+(y+z).$
\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "s =\n", "\n", " 0.999999000000048\n" ] } ], "source": [ "% Algoritmus 1\n", "format long\n", "n=999999;\n", "s=0; \n", "for i=1:n \n", "s=s+1/(i*(i+1)); \n", "end \n", "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "7.feladat. Tekintsük az $a_1+a_2+\\ldots+a_n$ alakú összegek kiszámításásra az alább két algoritmust.\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Algoritmus 1Algoritmus 2
s=0;
\n", " for i=1:n
\n", " s=s+a(i);
\n", " end\n", "
s=0;
\n", " for i=n:-1:1
\n", " s=s+a(i);
\n", " end\n", "
\n", "Számoljuk ki az $S_n=\\displaystyle\\sum_{i=1}^n \\frac{1}{i\\cdot(i+1)}$ értékét mindkét algoritmussal $n=999999$ esetén. Melyik lesz pontosabb?" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "s =\n", "\n", " 0.999999000000000\n" ] } ], "source": [ "% Algoritmus 2\n", "n=999999;\n", "s=0; \n", "for i=n:-1:1 \n", "s=s+1/(i*(i+1)); \n", "end\n", "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Hibakorlátok\n", "\n", "Legyen $a\\in\\mathbb{R}$ a pontos érték. Gépi közelítése $a'$. Ekkor
\n", "+ $\\Delta a=|a-a'|$ abszolút hiba\n", "+ $\\delta a=\\frac{|a-a'|}{|a|}$ relatív hiba \n", "\n", "8.feladat. Közelítsük $\\pi$-t a $\\pi'=3.14$ értékkel. Mekkora a közelítés abszolút és relatív hibakorlátja?
\n", "\n", "9.feladat. Legyen egy henger sugara $r=1\\pm 0.01$ és magassága $h=2\\pm 0.02$. A $\\pi$ értékét $3.14$-nek véve számítsuk ki közelítõleg a térfogatát! Mekkora lesz az eredmény abszolút hibája?
\n", "\n", "10.feladat. Mekkora relatív hibával közelíti az $1-x$ kifejezés az $1/(1+x)$ kifejezést a $[-0.1,\\ 0.1]$ intervallumon?
\n", "\n", "11.feladat. Számoljuk ki számológéppel az $a=\\sqrt{9876}$, illetve a $b=\\sqrt{9875}$ számok hat tizedesjegyre kerekített $a',\\ b'$ értékét. Az $x=a-b$ különbséget mekkora abszolút és relatív hibával közelíti az
\n", "(a) $x'=a'-b'$,
\n", "(b) $x''=1/(a'+b')$. \n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Matlab", "language": "matlab", "name": "matlab" }, "language_info": { "codemirror_mode": "octave", "file_extension": ".m", "help_links": [ { "text": "MetaKernel Magics", "url": "https://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" } ], "mimetype": "text/x-octave", "name": "matlab", "version": "0.11.0" } }, "nbformat": 4, "nbformat_minor": 0 }