-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFinal_2021_07_05.py
118 lines (96 loc) · 2.54 KB
/
Final_2021_07_05.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# PARTE GENERAL
# Ejercicio A
import numpy as np
def intenumcomp(fun,a,b,N,regla):
if b <= a:
return 0
N = int(np.ceil(N))
dist = (b-a)/N
ret = 0
if regla == "trapecio":
x = np.linspace(a,b,N+1)
for xi in x:
ret += fun(xi)
ret = dist * (ret*2 - fun(a) - fun(b))/2
elif regla == "pm":
x = np.linspace(a+dist/2,b-dist/2,N)
for xi in x:
ret += fun(xi)
ret *= dist
elif regla == "simpson":
x = np.linspace(a,b,2*N+1)
mul = 1
for xi in x:
ret += mul*fun(xi)
if mul == 1:
mul = 2
else:
mul = 1
ret = dist * (ret*2 - fun(a) - fun(b))/6
else:
print("Regla inválida")
return ret
L,a,c,h = 20,5,6,3
integral = lambda y : np.sqrt(1-(y/c)**2)
f = lambda h : 2*L*a*intenumcomp(integral,-c,h,11,"pm")
print(f"EJERCICIO A --> Si el nivel de líquido en el tanque es {h}, entonces hay, aproximadamente, {f(h)} m**3 de volumen de combustible\n")
# Ejercicio B
igual = 700/(2*L*a)
ini,fin = -c,3
ans = ini
while ini < fin:
mid = (ini+fin)/2
calc = intenumcomp(integral,-c,mid,11,"pm")
if calc > igual:
fin = mid
else:
ini = mid
if(abs(calc-igual)<1e-9):
ans = mid
break
print(f"EJERCICIO B --> Si tengo 700 m**3, el nivel de líquido en el tanque es de {ans}\n")
# PARTE LIBRE
from scipy.linalg import *
def jacobi(A,b,err,mit):
k = 0
x = [np.zeros(len(b))]*2
M = np.diag(np.diag(A))
Minv = inv(M)
Minv_x_N = Minv @ (-(A-M))
while k < mit:
x[0] = x[1]
x[1] = Minv_x_N @ x[0] + Minv @ b
k+=1
if norm(x[1]-x[0], ord=np.inf) <= err:
break
return [x[1],k]
def gseidel(A,b,err,mit):
k = 0
x = [np.zeros(len(b))]*2
M = np.tril(A)
Minv = inv(M)
Minv_x_N = Minv @ (-(np.triu(A)-np.diag(np.diag(A))))
while k < mit:
x[0] = x[1]
x[1] = Minv_x_N @ x[0] + Minv @ b
k+=1
if norm(x[1]-x[0], ord=np.inf) <= err:
break
return [x[1],k]
def gs_vs_jac(tol):
A = np.array([
[4, -1, 0, -1, 0, 0],
[-1, 4, -1, 0, -1, 0],
[0, -1, 4, 0, 0, -1],
[-1, 0, 0, 4, -1, 0],
[0, -1, 0, -1, 4, -1],
[0, 0, -1, 0, -1, 4]
],dtype="float")
b = np.array([1,2,3,4,5,6],dtype="float")
x1 = gseidel(A,b,tol,10**6)
x2 = jacobi(A,b,tol,10**6)
print(f"EJERCICIO LIBRE --> TOL = {tol}")
print(f"Gauss-Seidel: {x1[0]} con {x1[1]} iteraciones")
print(f"Jacobi: {x2[0]} con {x2[1]} iteraciones")
return None
gs_vs_jac(1e-100)