Taller 3 corte 3 (Clase 28 octubre).ipynb - Colab
Taller 3 corte 3 (Clase 28 octubre).ipynb - Colab
ipynb - Colab
import numpy as np
from scipy.sparse import dia_matrix, coo_matrix, csr_matrix
def sparsesetup(n):
e = np.ones(n)
n2 = n // 2
a = dia_matrix( ([-e,3*e,-e],[-1,0,1]), shape=(n,n) ).tocsr()
c = coo_matrix( (e/2, (range(n),range(n-1,-1,-1))), shape=(n,n)).tocsr()
a = a + c
a[n2 ,n2-1] = -1
a[n2-1,n2 ] = -1
b = np.zeros(n)
b[0]=2.5; b[-1]=2.5; b[1:n-1]=1.5; b[n2-1:n2+1]=1.0
return a,b
import numpy as np
from sympy import banded, ones, Matrix, symbols
import sympy as sp
# Back substitution
for k in range(n-1, -1, -1):
b[k] = (b[k] - np.dot(a[k, k+1:n], b[k+1:n])) / a[k, k]
return b
# Método de Jacobi
def jacobi(A, b, tol=1e-3, max_iter=100):
n = len(b)
https://colab.research.google.com/drive/1fOVV5F-jnhfgIS0Qqke5GgJ70FQMLx0J#scrollTo=EAYKoX0GkSrQ&printMode=true 1/3
7/11/24, 17:55 Taller 3 corte 3 (Clase 28 octubre).ipynb - Colab
x = np.zeros(n)
for _ in range(max_iter):
x_ant = x.copy()
for i in range(n):
s = sum(A[i, j] * x_ant[j] for j in range(n) if j != i)
x[i] = (b[i] - s) / A[i, i]
if np.linalg.norm(x - x_ant) < tol:
return x
raise ValueError("No convergió en el número máximo de iteraciones")
# Método de Gauss-Seidel
def gauss_seidel(A, b, tol=1e-3, max_iter=100):
n = len(b)
x = np.zeros(n)
for _ in range(max_iter):
x_ant = x.copy()
for i in range(n):
s = sum(A[i, j] * x[j] for j in range(n) if j != i)
x[i] = (b[i] - s) / A[i, i]
if np.linalg.norm(x - x_ant) < tol:
return x
raise ValueError("No convergió en el número máximo de iteraciones")
keyboard_arrow_down Punto 1
a)
import numpy as np
import matplotlib.pyplot as plt
from sympy import banded
print(gaussElimin(a, b))
b)
def diagonal(A):
A = A.copy()
n = A.shape[0]
for i in range(n):
row_sum = np.sum(np.abs(A[i, :])) - np.abs(A[i, i])
if np.abs(A[i, i]) <= row_sum:
A[i, i] = row_sum + 1
return A
a = diagonal(A)
print(jacobi(a,b,6).T)
https://colab.research.google.com/drive/1fOVV5F-jnhfgIS0Qqke5GgJ70FQMLx0J#scrollTo=EAYKoX0GkSrQ&printMode=true 2/3
7/11/24, 17:55 Taller 3 corte 3 (Clase 28 octubre).ipynb - Colab
keyboard_arrow_down Punto 2.
def newtonRaphson2(f, x, tol=1.e-9):
def jacobian(f, x):
h = 1.e-4
n = len(x)
jac = np.zeros((n, n), dtype=float)
f0 = f(x)
f0 = np.array(f0)
for i in range(n):
temp = x[i]
x[i] = temp + h
f1 = f(x)
f1 = np.array(f1)
x[i] = temp
jac[:, i] = (f1 - f0) / h
return jac, f0
for i in range(300):
jac, f0 = jacobian(f, x)
if np.linalg.norm(f0) < tol:
return x
dx = gaussElimin(jac, -f0)
x = x + dx
print("Solución:")
x
Solución:
array([1.3587743 , 2.32410118, 5.81636998, 1.49476356])
https://colab.research.google.com/drive/1fOVV5F-jnhfgIS0Qqke5GgJ70FQMLx0J#scrollTo=EAYKoX0GkSrQ&printMode=true 3/3