Skip to content

Instantly share code, notes, and snippets.

@barucAlmaguer
Created August 16, 2017 20:12
Show Gist options
  • Select an option

  • Save barucAlmaguer/5ee01b1aaaafd5b97e4f8cd10924433d to your computer and use it in GitHub Desktop.

Select an option

Save barucAlmaguer/5ee01b1aaaafd5b97e4f8cd10924433d to your computer and use it in GitHub Desktop.
Analisis numerico - Metodo Gauss Siegel
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Método Gauss-Seidel"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Es el método iterativo más utilizado.\n",
"\n",
"Supongase que se ha dado un conjunto de __n__ ecuaciones:\n",
"$$Ax = C$$\n",
"\n",
"Si los elementos de la diagonal son diferentes de 0, \n",
"la primera ecuación se puede resolver para x1, \n",
"la segunda para x2, \n",
"...\n",
"lo que lleva a:\n",
"\n",
"$$x_{1} = \\frac{c_{1} - a_{12}x_{2} - a_{13}x_{3} - ... - a_{1n}x_{n}}{a_{11}}$$\n",
"$$x_{2} = \\frac{c_{2} - a_{21}x_{1} - a_{23}x_{3} - ... - a_{2n}x_{n}}{a_{22}}$$\n",
"$$x_{3} = \\frac{c_{3} - a_{31}x_{1} - a_{32}x_{2} - ... - a_{3n}x_{n}}{a_{33}}$$\n",
".\n",
".\n",
".\n",
"$$x_{n} = \\frac{c_{n} - a_{n1}x_{1} - a_{n2}x_{2} - ... - a_{n,n1}x_{n-1}}{a_{nn}}$$\n",
"\n",
"Se empieza a solucionar tomando las __x__ un valor inicial de 0, esto se sustituye en la Ecuación 1, la cuál se usa para calcular un nuevo valor de \n",
"$$x1 = c1/a11$$,\n",
"Luego se sustituye el valor de __x1__ con __x3__ ... hasta __xn__ aún en 0\n",
"En la ecuación 2 con la cuál se calcula el valor de x2\n",
"\n",
"Esto se repite hasta llegar a la ecuación 4, la cuál calcula un nuevo valor de __xn__. En seguida se regresa a la primera ecuación y se repite todo el proceso hasta que la solución converja bastante cerca de los valores reales.\n",
"La convergencia se verifica utilizando:\n",
"$$\n",
"E_{a} = \\mid \\frac{x_{i}^{j-1} - x_{i}^j}{x_{i}^j} \\mid * 100\\% < E_{s}\n",
"$$\n",
"(Para toda i en donde j y j-1 denotan la iteración actual y la anterior\n",
"\n",
"Este método converge si el coeficiente del valor de la diagonal en valor absoluto es mayor que la suma de los coeficientes restantes de la ecuación (Diagonalmente dominante)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ejemplo:\n",
"\n",
"$$3x_{1} - 0.1x_{2} - 0.2x_{3} = 7.85$$\n",
" \n",
"$$0.1x_{1} + 7x_{2} - 0.3x_{3} = -19.3$$\n",
"\n",
"$$0.3x_{1} - 0.2x_{2} + 10x_{3} = 71.4$$\n",
"\n",
"---\n",
"\n",
"$$x_{1} = \\frac{7.85 + 0.1x_{2} + 0.2x_{3}}{3}$$\n",
"\n",
"$$x_{2} = \\frac{-19.3 - 0.1x_{1} + 0.3x_{3}}{7}$$\n",
"\n",
"$$x_{3} = \\frac{71.4 - 0.3x_{1} + 0.2x_{2}}{10}$$\n",
"\n",
"Consideramos: \n",
"\n",
"$$x_{1}=x_{2}=x_{3}=0$$"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def Error_aproximado(var, act, ant):\n",
" ea = abs((act-ant)/act * 100)\n",
" return \"Ea({}) = {}%\".format(var, ea)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[2.6166666666666667, -2.7945238095238096, 7.005609523809525]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X1 = 0\n",
"X2 = 0\n",
"X3 = 0\n",
"R1 = [3.0, -0.1, -0.2, 7.85]\n",
"R2 = [0.1, 7.0, -0.3, -19.3]\n",
"R3 = [0.3, -0.2, 10, 71.4]\n",
"X1 = (R1[3] - R1[1]*X2 - R1[2]*X3)/R1[0]\n",
"X2 = (R2[3] - R2[0]*X1 - R2[2]*X3)/R2[1]\n",
"X3 = (R3[3] - R3[0]*X1 - R3[1]*X2)/R3[2]\n",
"[X1, X2, X3]"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2.990556507936508, -2.499624684807256, 7.00029081106576]\n",
"Ea(X1) = 12.502349989963122%\n",
"Ea(X2) = 11.797736136506948%\n",
"Ea(X3) = 0.07597845414304334%\n"
]
}
],
"source": [
"\n",
"X1ant, X2ant, X3ant = X1, X2, X3\n",
"X1 = (R1[3] - R1[1]*X2 - R1[2]*X3)/R1[0]\n",
"X2 = (R2[3] - R2[0]*X1 - R2[2]*X3)/R2[1]\n",
"X3 = (R3[3] - R3[0]*X1 - R3[1]*X2)/R3[2]\n",
"print([X1, X2, X3])\n",
"print(Error_aproximado(\"X1\", X1, X1ant))\n",
"print(Error_aproximado(\"X2\", X2, X2ant))\n",
"print(Error_aproximado(\"X3\", X3, X3ant))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[3.0000318979108087, -2.499987992353051, 6.999999283215615]\n",
"Ea(X1) = 0.31584297423301044%\n",
"Ea(X2) = 0.014532371631624038%\n",
"Ea(X3) = 0.004164683999950723%\n"
]
}
],
"source": [
"X1ant, X2ant, X3ant = X1, X2, X3\n",
"X1 = (R1[3] - R1[1]*X2 - R1[2]*X3)/R1[0]\n",
"X2 = (R2[3] - R2[0]*X1 - R2[2]*X3)/R2[1]\n",
"X3 = (R3[3] - R3[0]*X1 - R3[1]*X2)/R3[2]\n",
"print([X1, X2, X3])\n",
"print(Error_aproximado(\"X1\", X1, X1ant))\n",
"print(Error_aproximado(\"X2\", X2, X2ant))\n",
"print(Error_aproximado(\"X3\", X3, X3ant))"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[3.000000352469273, -2.5000000357546064, 6.99999998871083]\n",
"Ea(X1) = 0.0010515145943187922%\n",
"Ea(X2) = 0.0004817360553336348%\n",
"Ea(X3) = 1.0078503089631263e-05%\n"
]
}
],
"source": [
"X1ant, X2ant, X3ant = X1, X2, X3\n",
"X1 = (R1[3] - R1[1]*X2 - R1[2]*X3)/R1[0]\n",
"X2 = (R2[3] - R2[0]*X1 - R2[2]*X3)/R2[1]\n",
"X3 = (R3[3] - R3[0]*X1 - R3[1]*X2)/R3[2]\n",
"print([X1, X2, X3])\n",
"print(Error_aproximado(\"X1\", X1, X1ant))\n",
"print(Error_aproximado(\"X2\", X2, X2ant))\n",
"print(Error_aproximado(\"X3\", X3, X3ant))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2.9999999980555683, -2.500000000456044, 7.000000000049214]\n",
"Ea(X1) = 1.181379016120089e-05%\n",
"Ea(X2) = 1.4119424915559705e-06%\n",
"Ea(X3) = 1.6197690807562597e-07%\n"
]
}
],
"source": [
"X1ant, X2ant, X3ant = X1, X2, X3\n",
"X1 = (7.85+0.1*X2+0.2*X3)/3\n",
"X2 = (-19.3 - 0.1*X1 + 0.3*X3)/7.0\n",
"X3 = (71.4 - 0.3*X1+0.2*X2)/10.0\n",
"print([X1, X2, X3])\n",
"print(Error_aproximado(\"X1\", X1, X1ant))\n",
"print(Error_aproximado(\"X2\", X2, X2ant))\n",
"print(Error_aproximado(\"X3\", X3, X3ant))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tarea: \n",
"\n",
" 4x1+ x2+2x3=16\n",
"\n",
" x1+3x2+ x3=10\n",
" \n",
" x1+2x2+5x3=12\n",
" \n",
"Error < 2% en todas las ecuaciones"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Nota: Si no es diagonalmente dominante, pivotear antes para que lo sea."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[4.0, 2.0, 0.8]"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X1 = 0\n",
"X2 = 0\n",
"X3 = 0\n",
"R1 = [4, 1, 2, 16]\n",
"R2 = [1, 3, 1, 10]\n",
"R3 = [1, 2, 5, 12]\n",
"X1 = (R1[3] - R1[1]*X2 - R1[2]*X3)/R1[0]\n",
"X2 = (R2[3] - R2[0]*X1 - R2[2]*X3)/R2[1]\n",
"X3 = (R3[3] - R3[0]*X1 - R3[1]*X2)/R3[2]\n",
"[X1, X2, X3]"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[3.1, 2.0333333333333337, 0.9666666666666666]\n",
"Ea(X1) = 29.032258064516125%\n",
"Ea(X2) = 1.6393442622950976%\n",
"Ea(X3) = 17.241379310344815%\n"
]
}
],
"source": [
"X1ant, X2ant, X3ant = X1, X2, X3\n",
"X1 = (R1[3] - R1[1]*X2 - R1[2]*X3)/R1[0]\n",
"X2 = (R2[3] - R2[0]*X1 - R2[2]*X3)/R2[1]\n",
"X3 = (R3[3] - R3[0]*X1 - R3[1]*X2)/R3[2]\n",
"print([X1, X2, X3])\n",
"print(Error_aproximado(\"X1\", X1, X1ant))\n",
"print(Error_aproximado(\"X2\", X2, X2ant))\n",
"print(Error_aproximado(\"X3\", X3, X3ant))"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[3.0083333333333333, 2.0083333333333333, 0.9950000000000001]\n",
"Ea(X1) = 3.047091412742386%\n",
"Ea(X2) = 1.2448132780083165%\n",
"Ea(X3) = 2.8475711892797526%\n"
]
}
],
"source": [
"X1ant, X2ant, X3ant = X1, X2, X3\n",
"X1 = (R1[3] - R1[1]*X2 - R1[2]*X3)/R1[0]\n",
"X2 = (R2[3] - R2[0]*X1 - R2[2]*X3)/R2[1]\n",
"X3 = (R3[3] - R3[0]*X1 - R3[1]*X2)/R3[2]\n",
"print([X1, X2, X3])\n",
"print(Error_aproximado(\"X1\", X1, X1ant))\n",
"print(Error_aproximado(\"X2\", X2, X2ant))\n",
"print(Error_aproximado(\"X3\", X3, X3ant))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[3.0004166666666667, 2.001527777777778, 0.9993055555555556]\n",
"Ea(X1) = 0.26385224274406016%\n",
"Ea(X2) = 0.3400180417736317%\n",
"Ea(X3) = 0.4308547602501633%\n"
]
}
],
"source": [
"X1ant, X2ant, X3ant = X1, X2, X3\n",
"X1 = (R1[3] - R1[1]*X2 - R1[2]*X3)/R1[0]\n",
"X2 = (R2[3] - R2[0]*X1 - R2[2]*X3)/R2[1]\n",
"X3 = (R3[3] - R3[0]*X1 - R3[1]*X2)/R3[2]\n",
"print([X1, X2, X3])\n",
"print(Error_aproximado(\"X1\", X1, X1ant))\n",
"print(Error_aproximado(\"X2\", X2, X2ant))\n",
"print(Error_aproximado(\"X3\", X3, X3ant))"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2.9999652777777777, 2.0002430555555555, 0.9999097222222224]\n",
"Ea(X1) = 0.015046470445265837%\n",
"Ea(X2) = 0.06422830558787818%\n",
"Ea(X3) = 0.060422121441537344%\n"
]
}
],
"source": [
"X1ant, X2ant, X3ant = X1, X2, X3\n",
"X1 = (R1[3] - R1[1]*X2 - R1[2]*X3)/R1[0]\n",
"X2 = (R2[3] - R2[0]*X1 - R2[2]*X3)/R2[1]\n",
"X3 = (R3[3] - R3[0]*X1 - R3[1]*X2)/R3[2]\n",
"print([X1, X2, X3])\n",
"print(Error_aproximado(\"X1\", X1, X1ant))\n",
"print(Error_aproximado(\"X2\", X2, X2ant))\n",
"print(Error_aproximado(\"X3\", X3, X3ant))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"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.6.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment