Se requiere determinar la distribución de cupos en base a los costos relativos al promedio por estudiante para docencia, infraestructura y servicios mostrados en la tabla.
Costo referencial /carrera
Mecatrónica
Computación
Civil
Matemáticas
Docencia
1.5
0.9
0.6
0.7
Infraestructura
0.8
1.4
0.4
0.5
Servicios
0.45
0.55
1.1
0.5
Con los datos del total de recursos relativos al promedio por estudiante disponibles son docencia 271, infraestructura 250 y servicios 230.
El planteamiento para la búsqueda de raíces es f(x) = 0, que para este caso será:
f(h)=h2(3r−h)−(1−ρaguaρesfera)4r3=0
usando los valores dados para el ejercicio, r=1 y ρesfera = 200 Kg/m3 y ρagua= 1000 kg/m3 se tiene que:
f(h)=h2(3−h)−(1−1000200)4f(h)=h2(3−h)−516
Se observa la gráfica de f(h) en el intervalo de h entre[0,2] interpretado como totalmente sumergida y totalmente flotando sobre el agua, confirmando que existe una raíz
Para el caso de aplicar el método del punto fijo se plantea que x=g(x),
h=g(h)h2(3−h)=516
con lo que se puede plantear dos ecuaciones al despejar h
a) Realice el planteamiento del sistema de ecuaciones que permita determinar la cantidad máxima de pacientes de cada grupo que podrían ser atendidos usando todos los productos disponibles. Una vez planteadas las ecuaciones, se le indica que la capacidad de atención para emergencia sea fija en K = 10 pacientes (variable libre).
Producto\ Paciente
Maternidad
Pos – operatorio
Covid_19
emergencia
Suministro diario
Producto A
0.2
0.1
1.7
0.25
135
Producto B
0.5
2
0.05
0.4
320
Producto C
1.5
0.2
0.75
1.4
410
Sistema de ecuaciones usando la columna de emergencias como variable libre y valor constante para la variable igual a K=10
d) Realice las observaciones necesarias sobre los errores entre iteraciones y la convergencia.
El error entre iteraciones disminuye, el método converge a:
respuesta X:
[[228.22]
[ 99.81]
[ 44.92]]
e) Si se decide no atender a los pacientes del grupo emergencias, ¿Qué aumento individual de cada una de otros grupos de pacientes podría soportarse con la cantidad diaria de alimento disponible? (use el algoritmo.py).
Se interpreta como K=0 y usando el algoritmo se obtiene:
respuesta X:
[[237.23]
[ 99.54]
[ 45.64]]
el aumento de pacientes entre grupos es
diferencia = [9.01, -0.27, 0.72]
en términos de pacientes, como número entero, solo se gana 9 pacientes para el primer grupo. Se descarta la parte decimal si los pacientes no se cuentan en miles, por lo que las otras variaciones se interpretan como cero.
a) Realice el planteamiento del problema usando inicialmente las trayectorias en el eje x, donde para el intervalo de operación del misil antidrone, se observa más de un impacto.
x1(t) = x2(t)
f(t) = cos(t) – sin(0.75 t) =0
y1(t) = y2(t)
sin(2 t) =kt
k=tsin(2t)
b) Usando el método de Newton-Raphson encuentre el valor de t en el cual se pretende realizar el impacto al drone. Realice al menos 3 iteraciones de forma analítica, use tolerancia de 10-4,
b. De ser necesario, realice operaciones con la matriz aumentada para mejorar la convergencia con un método iterativo.
⎣⎡40400200110155603102531075044510⎦⎤
aplicando pivoteo parcial por filas
⎣⎡40020040155601102531031044510750⎦⎤
c. En el contexto del problema, proponga un vector inicial y tolerancia.
el vector inicial no se usa con ceros, un suelo sin nutrientes no es útil para un cultivo, el vector de unos puede considerarse una opción. Otra opción es consultar con los agricultores para disponer de valores iniciales.
[1,1,1]
la toreleancia podría ser de 0.001 si consideramos que los nutrientes estan dados en kilogramos, la tolerancia sería en gramos.
d. Realice 3 iteraciones con el método de Gauss-Seidel y estime el error (papel y lápiz)
e. Describa y justifique su observación sobre la convergencia del método y estime una descripción de los resultados.
El resultado muestra que el consumo de la planta b (café) es negativo, puede interpretarse como un error de datos por revisar o se iterpreta como si la planta aporta nutrientes al suelo.
Instrucciones en Python
# Método de Gauss-Seidel# solución de sistemas de ecuaciones# por métodos iterativosimport numpy as np
# INGRESO
A = np.array([[40,110,310],
[400,15,25],
[200,560,310]],dtype=float)
B = np.array([[750],[445],[10]],dtype=float)
X0 = np.array([1.,1.,1.],dtype=float)
tolera = 0.001
iteramax = 50
# PROCEDIMIENTO# Matriz aumentada
AB = np.concatenate((A,B),axis=1)
AB0 = np.copy(AB)
# Pivoteo parcial por filas
tamano = np.shape(AB)
n = tamano[0]
m = tamano[1]
# Para cada fila en ABfor i inrange(0,n-1,1):
# columna desde diagonal i en adelante
columna = abs(AB[i:,i])
dondemax = np.argmax(columna)
# dondemax no está en diagonalif (dondemax !=0):
# intercambia filas
temporal = np.copy(AB[i,:])
AB[i,:] = AB[dondemax+i,:]
AB[dondemax+i,:] = temporal
# Gauss-Seidel
tamano = np.shape(A)
n = tamano[0]
m = tamano[1]
A = np.copy(AB[:n,:m])
B = np.copy(AB[:,m])
# valores iniciales
X = np.copy(X0)
diferencia = np.ones(n, dtype=float)
errado = 2*tolera
itera = 0
whilenot(errado<=tolera or itera>iteramax):
# por filafor i inrange(0,n,1):
# por columna
suma = 0
for j inrange(0,m,1):
# excepto diagonal de Aif (i!=j):
suma = suma-A[i,j]*X[j]
nuevo = (B[i]+suma)/A[i,i]
diferencia[i] = np.abs(nuevo-X[i])
X[i] = nuevo
print(diferencia,X)
errado = np.max(diferencia)
itera = itera + 1
# Respuesta X en columna
X = np.transpose([X])
# revisa si NO convergeif (itera>iteramax):
X=0
# revisa respuesta
verifica = np.dot(A,X)
# SALIDAprint('respuesta X: ')
print(X)
print('verificar A.X=B: ')
print(verifica)
Para analizar la obstrucción se usan las expresiones del polinomio encontrado en el tema anterior y la función descrita en el enunciado. Se debe encontrar las distrancias en las que ambas expresiones son iguales, o también:
p(d)−f(d)=0
a. Establezca un intervalo de análisis para cada raíz.
Según la gráfica presentada en el Tema 1 se tendrán que encontrar dos raíces:
[0,700] y [700,1300]
La expresión a usar en el ejercicio se obtiene como:
Dado que es un ejercicio que se utiliza muchas veces en el análisis de radioenlaces, se utilizaría un algoritmo para aplicarlo en diferentes situaciones.
b. Realice al menos 3 iteraciones con el método de la Bisección para encontrar la primera raíz (izquierda)
# Algoritmo de Bisección# [a,b] se escogen de la gráfica de la función# error = toleraimport numpy as np
import matplotlib.pyplot as plt
# INGRESO
p = lambda d: 85.0 + 0.05941*d - 0.0001015*d**2 +3.842e-8*d**3
f = lambda d: 100 - np.sqrt(1*(0.3278)*d*(3700-d)/3700)
fx = lambda d: p(d)- f(d)
a_todo = 0
b_todo = 1300
a = 0
b = 700
tolera = 0.001
muestras = 41
# PROCEDIMIENTO# PROCEDIMIENTO
tabla = []
tramo = b-a
fa = fx(a)
fb = fx(b)
i = 1
while (tramo>tolera):
c = (a+b)/2
fc = fx(c)
tabla.append([i,a,c,b,fa,fc,fb,tramo])
i = i + 1
cambia = np.sign(fa)*np.sign(fc)
if (cambia<0):
b = c
fb = fc
else:
a=c
fa = fc
tramo = b-a
c = (a+b)/2
fc = fx(c)
tabla.append([i,a,c,b,fa,fc,fb,tramo])
tabla = np.array(tabla)
raiz = c
# SALIDA
np.set_printoptions(precision = 4)
print('[ i, a, c, b, f(a), f(c), f(b), tramo]')
# print(tabla)# Tabla con formato
n=len(tabla)
for i inrange(0,n,1):
unafila = tabla[i]
formato = '{:.0f}'+' '+(len(unafila)-1)*'{:.3f} '
unafila = formato.format(*unafila)
print(unafila)
print('raiz: ',raiz)
print(' raiz en: ', c)
print('error en tramo: ', tramo)
# GRAFICA
xi = np.linspace(a_todo,b_todo,muestras)
yi = fx(xi)
pi = p(xi)
ri = f(xi)
plt.plot(xi,yi,label='g(d)=p(d)-f(d)')
plt.plot(xi,pi,label='p(d)')
plt.plot(xi,ri,label='f(d)_Fresnel')
plt.axhline(0, color='grey')
plt.xlabel('d')
plt.legend()
plt.title('obstruccion Fresnel')
plt.show()
c. Desarrolle al menos 3 iteraciones con el método del Punto fijo para encontrar el segundo punto (derecha)
La siguiente raíz se encuentra con algoritmo presentado o también con el algoritmo del siguiente literal usando la misma expresion g(d).
a = 700 b= 1300
raiz en: 867.1000480651855
error en tramo: 0.00057220458984375
a. Plantee y desarrolle un polinomio P3(d1) de grado 3, que describa el perfil del terreno en el intervalo [0,1300] de distancias a la primera antena d1.
Para plantear el ejercicio, se observan los punto en el intervalo [0,1300], asi como los tamaños de paso.
Como el polinomio es de grado 3,se requiere 3 tramos o 4 muestras, el intervalo presenta 5. Para incluir el punto de inicio, fin y máximo, las muestras seleccionadas son las que se muestran en la tabla siguiente:
Δd1
distancia d1
Perfil de Terreno
DifDiv1
DifDiv2
DifDiv3
350
0
85
DifDiv11 = 0.02857
DifDiv12 = -6.122E-05
DifDiv13 = -1.123E-05
350
350
95
DifDiv21 = -0.01428
DifDiv22 = -1.127E-05
600
700
90
DifDiv31 =
-0.025
1300
75
Los tamaños de paso, Δd1, son diferentes, por lo que se pueden usar el método de diferencias divididas de Newton o el Método de Lagrange.
Usando diferencias divididas de Newton, se completa la tabla con las expresiones:
encontrando que el error es de 1.26m de altitud del terreno a los 1000m de distancia desde la referencia a la izquierda.
c. Desarrolle y justifique una propuesta para disminuir los errores encontrados en el literal anterior, sobre el mismo intervalo, es decir obtiene un nuevo polinomio (use algoritmo).
En caso de requerir una mayor precisión, se puede aumentar el grado del polinomio al incluir el punto d=1000 no usado en el paso anterior.
d. Escriba sus conclusiones y recomendaciones sobre los resultados obtenidos entre los dos polinomios.
Dado que el error se considera mínimo en el intervalo, y el coeficiente del polinomio para x4 es del orden de 10-11 se recomendaría usar el polinomio de grado 3.
Instrucciones en Python
# Polinomio interpolación# Diferencias Divididas de Newton# Tarea: Verificar tamaño de vectores,# verificar puntos equidistantes en ximport numpy as np
import sympy as sym
import matplotlib.pyplot as plt
# INGRESO , Datos de prueba
xi = np.array([0.0,350,700,1000,1300])
fi = np.array([85.0,95,90,80,75])
# PROCEDIMIENTO# Tabla de Diferencias Divididas Avanzadas
titulo = ['i ','xi ','fi ']
n = len(xi)
ki = np.arange(0,n,1)
tabla = np.concatenate(([ki],[xi],[fi]),axis=0)
tabla = np.transpose(tabla)
# diferencias divididas vacia
dfinita = np.zeros(shape=(n,n),dtype=float)
tabla = np.concatenate((tabla,dfinita), axis=1)
# Calcula tabla, inicia en columna 3
[n,m] = np.shape(tabla)
diagonal = n-1
j = 3
while (j < m):
# Añade título para cada columna
titulo.append('F['+str(j-2)+']')
# cada fila de columna
i = 0
paso = j-2 # inicia en 1while (i < diagonal):
denominador = (xi[i+paso]-xi[i])
numerador = tabla[i+1,j-1]-tabla[i,j-1]
tabla[i,j] = numerador/denominador
i = i+1
diagonal = diagonal - 1
j = j+1
# POLINOMIO con diferencias Divididas# caso: puntos equidistantes en eje x
dDividida = tabla[0,3:]
n = len(dfinita)
# expresión del polinomio con Sympy
x = sym.Symbol('x')
polinomio = fi[0]
for j inrange(1,n,1):
factor = dDividida[j-1]
termino = 1
for k inrange(0,j,1):
termino = termino*(x-xi[k])
polinomio = polinomio + termino*factor
# simplifica multiplicando entre (x-xi)
polisimple = polinomio.expand()
# polinomio para evaluacion numérica
px = sym.lambdify(x,polisimple)
# Puntos para la gráfica
muestras = 101
a = np.min(xi)
b = np.max(xi)
pxi = np.linspace(a,b,muestras)
pfi = px(pxi)
# SALIDA
np.set_printoptions(precision = 4)
print('Tabla Diferencia Dividida')
print([titulo])
print(tabla)
print('dDividida: ')
print(dDividida)
print('polinomio: ')
print(polinomio)
print('polinomio simplificado: ' )
print(polisimple)
# Gráfica
plt.plot(xi,fi,'o', label = 'Puntos')
##for i in range(0,n,1):## plt.axvline(xi[i],ls='--', color='yellow')
plt.plot(pxi,pfi, label = 'Polinomio')
plt.legend()
plt.xlabel('xi')
plt.ylabel('fi')
plt.title('Diferencias Divididas - Newton')
plt.show()
Se plantea el sistema de ecuaciones de acuerdo a la cantidad de medicamentos que se administra a cada tipo de paciente, siendo las variables X=[a,b,c,d] de acuerdo a la tabla:
Mostrando que el número de incógnitas no es igual al número de ecuaciones, por lo que sería necesario de disponer de otra ecuación, o usar una variable libre.
literal b
Siguiendo las indicaciones sobre la variable libre que sea para el grupo de pacientes niños, te tiene que
Antes de desarrollar el ejercicio para el algoritmo se requiere convertir el sistema de ecuaciones a su forma matricial. Por lo que se plantea la matriz aumentada:
Se realiza el pivoteo parcial por filas, que al aplicar en la primera columa, se intercambia la primera y segunda fila, de tal forma que el mayor valor quede en la primera casilla de la diagonal.
Observación, el error disminuye en cada iteración, por lo que el sistema converge.
solución con el algoritmo, solo se toma la parte entera de la respuesta, pues los pacientes son números enteros.
respuesta X: [797.83, 774.16, 489.20]
con lo que el primer resultado es:
X = [797, 774, 489]
literal d
Si la cantidad de pacientes presentados en una seman es la que se indica en el enunciado [350,1400,1500,1040], se determina que el sistema hospitalario estatal no podrá atender a todos los pacientes al compara con la capacidad encontrada en el literal c.
Hay un exceso de 2129 pacientes encontrados por grupo:
que al compararse con la capacidad anterior en números enteros se encuentra una diferencia de un incremento de 21 pacientes neto ante la condición de usar todos los medicamentos disponibles.