{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "n=3 #dimenze, tj. počet rovnic a neznámých\n", "A=np.array([[1,2,2],[1,1,1],[1,-1,1]]) #matice soustavy\n", "b=np.array([1,1,5]) #vektor pravých stran" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Jacobiho iterace:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1. -1. 3.]\n", "[-3. -3. 3.]\n", "[1. 1. 5.]\n", "[-11. -5. 5.]\n", "4\n" ] } ], "source": [ "x=np.array([2,0,0])\n", "for k in range(4):\n", " y=x\n", " x=np.array([(b[i]-sum([A[i][j]*y[j] for j in range(i)])-sum([A[i][j]*y[j] for j in range(i+1,n)]))/A[i][i] for i in range(n)])\n", " print(x)\n", "# if np.linalg.norm(y-x,np.infty)<0.01: #ukončovací podmínka: rozdíl po sobě jdoucích iterací\n", "# break\n", "# if np.linalg.norm(np.matmul(A,x)-b,np.infty)<0.01: #ukončovací podmínka: reziduum\n", "# break\n", "print(k+1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Gauss–Seidel:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1.0, 0.0, 4.0]\n", "[-7.0, 4.0, 16.0]\n", "[-39.0, 24.0, 68.0]\n", "[-183.0, 116.0, 304.0]\n", "4\n" ] } ], "source": [ "x=[2,0,0]\n", "for k in range(4):\n", " for i in range(n):\n", " x[i]=(b[i]-sum([A[i][j]*x[j] for j in range(i)])-sum([A[i][j]*x[j] for j in range(i+1,n)]))/A[i][i]\n", " print(x)\n", "# if np.linalg.norm(y-x,np.infty)<0.01: #ukončovací podmínka: rozdíl po sobě jdoucích iterací\n", "# break\n", "# if np.linalg.norm(np.matmul(A,x)-b,np.infty)<0.01: #ukončovací podmínka: reziduum\n", "# break\n", "print(k+1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Zkusíme zanalyzovat iterační matice" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "B=\n", " [[ 0. -2. -2.]\n", " [-1. 0. -1.]\n", " [-1. 1. 0.]]\n", "c=\n", " [1. 1. 5.]\n" ] } ], "source": [ "B=np.array([[-A[i][j]/A[i][i] for j in range(n)] for i in range(n)])\n", "for i in range(n):\n", " B[i][i]=0\n", "#omega=1\n", "#B=omega*B+(1-omega)*np.identity(n)\n", "print(\"B=\\n\",B)\n", "c=np.array(b/np.diag(A))\n", "print(\"c=\\n\",c)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "x=[2,0,0]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1. -1. 3.]\n" ] } ], "source": [ "x=np.matmul(B,x)+c\n", "print(x)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Spektrální poloměr: 1.732050807568877\n", "Řádková norma: 4.0\n", "Sloupcová norma: 3.0\n" ] } ], "source": [ "print(\"Spektrální poloměr:\",max(np.abs(np.linalg.eigvals(B))))\n", "print(\"Řádková norma: \",np.linalg.norm(B,np.infty))\n", "print(\"Sloupcová norma: \",np.linalg.norm(B,1))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "B=\n", " [[-0. -2. -2.]\n", " [-0. 2. 1.]\n", " [-0. 4. 3.]]\n", "c=\n", " [1. 0. 4.]\n" ] } ], "source": [ "B=np.linalg.inv(np.tril(A))\n", "c=np.matmul(B,b)\n", "B=-np.matmul(B,np.triu(A,1))\n", "#omega=1\n", "#B=omega*B+(1-omega)*np.identity(n)\n", "print(\"B=\\n\",B)\n", "print(\"c=\\n\",c)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "x=[2,0,0]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1. 0. 4.]\n" ] } ], "source": [ "x=np.matmul(B,x)+c\n", "print(x)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Spektrální poloměr: 4.561552812808831\n", "Řádková norma: 7.0\n", "Sloupcová norma: 8.0\n" ] } ], "source": [ "print(\"Spektrální poloměr:\",max(np.abs(np.linalg.eigvals(B))))\n", "print(\"Řádková norma: \",np.linalg.norm(B,np.infty))\n", "print(\"Sloupcová norma: \",np.linalg.norm(B,1))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.10" } }, "nbformat": 4, "nbformat_minor": 5 }