s1Eva2008TII_T3_MN Ganancia en inversión

Ejercicio: 1Eva_IIT2008_T3_MN Ganancia en inversión

Se dispone de los datos (x, f(x)), en donde x es un valor de inversión y f(x) es un valor de ganancia, ambos en miles de dólares.

xi = [3.2 , 3.8 , 4.2 , 4.5 ]
fi = [5.12, 6.42, 7.25, 6.85]

Los datos se usan junto al modelo propuesto:

f(x) = a_1 x^3 + a_2 x^2 + a_3 x + a_4

generando las expresiones del sistema de ecuaciones:

a_1 (3.2)^3 + a_2 (3.2)^2 + a_3 (3.2) + a_4 = 5.12 a_1 (3.8)^3 + a_2 (3.8)^2 + a_3 (3.8) + a_4 = 6.42 a_1 (4.2)^3 + a_2 (4.2)^2 + a_3 (4.2) + a_4 = 7.25 a_1 (4.5)^3 + a_2 (4.5)^2 + a_3 (4.5) + a_4 = 6.85

Se convierte a la forma Ax=B
\begin{bmatrix} (3.2)^3 && (3.2)^2 && (3.2) && 1 \\ (3.8)^3 && (3.8)^2 && (3.8) && 1 \\ (4.2)^3 && (4.2)^2 && (4.2) && 1 \\ (4.5)^3 && (4.5)^2 && (4.5) && 1 \end{bmatrix} . \begin{bmatrix} a_1 \\ a_2 \\ a_3 \\ a_4 \end{bmatrix} = \begin{bmatrix} 5.12 \\ 6.42 \\ 7.25 \\6.85 \end{bmatrix}

Se crea la matriz aumentada

\begin{bmatrix} (3.2)^3 && (3.2)^2 && (3.2) && 1 && 5.12\\ (3.8)^3 && (3.8)^2 && (3.8) && 1 && 6.42 \\ (4.2)^3 && (4.2)^2 && (4.2) && 1 && 7.25 \\ (4.5)^3 && (4.5)^2 && (4.5) && 1 && 6.85 \end{bmatrix}

Se pivotea por filas:

\begin{bmatrix} (4.5)^3 && (4.5)^2 && (4.5) && 1 && 6.85 \\ (4.2)^3 && (4.2)^2 && (4.2) && 1 && 7.25 \\ (3.8)^3 && (3.8)^2 && (3.8) && 1 && 6.42 \\ (3.2)^3 && (3.2)^2 && (3.2) && 1 && 5.12 \end{bmatrix}

Como se pide un método directo, se inicia con el algoritmo de eliminación hacia adelante con factor para cada fila a partir de la diagonal.

\begin{bmatrix} (4.5)^3 && (4.5)^2 && (4.5) \\ (4.2)^3 - (4.5)^3\frac{(4.2)^3}{(4.5)^3} && (4.2)^2 - (4.5)^2\frac{(4.2)^3}{(4.5)^3} && (4.2) - (4.5)\frac{(4.2)^3}{(4.5)^3} \\ (3.8)^3 - (4.5)^3\frac{(3.8)^3}{(4.5)^3} && (3.8)^2 - (4.5)^2\frac{(3.8)^3}{(4.5)^3} && (3.8) -(4.5)\frac{(3.8)^3}{(4.5)^3} \\ (3.2)^3 - (4.5)^3\frac{(3.2)^3}{(4.5)^3} && (3.2)^2 -(4.5)^2\frac{(3.2)^3}{(4.5)^3} && (3.2) - (4.5)\frac{(3.2)^3}{(4.5)^3} \end{bmatrix}

continua a la derecha de la matriz:

\begin{bmatrix} 1 && 6.85 \\ 1 - 1\frac{(4.2)^3}{(4.5)^3} && 7.25 - 6.85\frac{(4.2)^3}{(4.5)^3} \\ 1 -1\frac{(3.8)^3}{(4.5)^3} && 6.42 - 6.85\frac{(3.8)^3}{(4.5)^3}\\1 -1\frac{(3.2)^3}{(4.5)^3} && 5.12-6.85\frac{(3.2)^3}{(4.5)^3} \end{bmatrix}
Pivoteo parcial por filas AB: ----
[[91.125 20.25   4.5    1.     6.85 ]
 [74.088 17.64   4.2    1.     7.25 ]
 [54.872 14.44   3.8    1.     6.42 ]
 [32.768 10.24   3.2    1.     5.12 ]]
Eliminación hacia adelante: ------
i: 0 k: 1 factor: 0.8130370370370371
i: 0 k: 2 factor: 0.6021618655692729
i: 0 k: 3 factor: 0.35959396433470514
[[91.125  20.25    4.5     1.      6.85  ]
 [ 0.      1.176   0.5413  0.187   1.6807]
 [ 0.      2.2462  1.0903  0.3978  2.2952]
 [ 0.      2.9582  1.5818  0.6404  2.6568]]
i: 1 k: 2 factor: 1.9100529100529142
i: 1 k: 3 factor: 2.5154950869236625
[[ 9.1125e+01  2.0250e+01  4.5000e+00  1.0000e+00  6.8500e+00]
 [ 0.0000e+00  1.1760e+00  5.4133e-01  1.8696e-01  1.6807e+00]
 [ 0.0000e+00  0.0000e+00  5.6296e-02  4.0729e-02 -9.1503e-01]
 [ 0.0000e+00  0.0000e+00  2.2011e-01  1.7010e-01 -1.5710e+00]]
i: 2 k: 3 factor: 3.9097744360903106
[[ 9.1125e+01  2.0250e+01  4.5000e+00  1.0000e+00  6.8500e+00]
 [ 0.0000e+00  1.1760e+00  5.4133e-01  1.8696e-01  1.6807e+00]
 [ 0.0000e+00  0.0000e+00  5.6296e-02  4.0729e-02 -9.1503e-01]
 [ 0.0000e+00  0.0000e+00  0.0000e+00  1.0860e-02  2.0065e+00]]
Eliminación hacia atras: ------
i: 3  pivote: 0.010860484544693044
 k: 2 factor: 3.7501994302000807
 k: 1 factor: 17.214974358977564
 k: 0 factor: 92.07692307694026
[[ 9.1125e+01  2.0250e+01  4.5000e+00  0.0000e+00 -1.7791e+02]
 [ 0.0000e+00  1.1760e+00  5.4133e-01  0.0000e+00 -3.2862e+01]
 [ 0.0000e+00  0.0000e+00  5.6296e-02  0.0000e+00 -8.4400e+00]
 [ 0.0000e+00  0.0000e+00  0.0000e+00  1.0860e-02  2.0065e+00]]
i: 2  pivote: 0.05629629629629451
 k: 1 factor: 9.615789473684513
 k: 0 factor: 79.93421052631832
[[ 9.1125e+01  2.0250e+01  0.0000e+00  0.0000e+00  4.9674e+02]
 [ 0.0000e+00  1.1760e+00  0.0000e+00  0.0000e+00  4.8295e+01]
 [ 0.0000e+00  0.0000e+00  5.6296e-02  0.0000e+00 -8.4400e+00]
 [ 0.0000e+00  0.0000e+00  0.0000e+00  1.0000e+00  1.8476e+02]]
i: 1  pivote: 1.1759999999999984
 k: 0 factor: 17.219387755102066
[[  91.125     0.        0.        0.     -334.876 ]
 [   0.        1.176     0.        0.       48.2952]
 [   0.        0.        1.        0.     -149.9209]
 [   0.        0.        0.        1.      184.7569]]
i: 0  pivote: 91.125
[[  91.125     0.        0.        0.     -334.876 ]
 [   0.        1.        0.        0.       41.0673]
 [   0.        0.        1.        0.     -149.9209]
 [   0.        0.        0.        1.      184.7569]]
AB:
[[   1.        0.        0.        0.       -3.6749]
 [   0.        1.        0.        0.       41.0673]
 [   0.        0.        1.        0.     -149.9209]
 [   0.        0.        0.        1.      184.7569]]
Método de Gauss-Jordan
solución X: 
[  -3.6749   41.0673 -149.9209  184.7569]

con lo que el polinomio buscado es:

f(x) = -3.67490842 x^3 + 41.06730769 x^2 + -149.92086081 x + 184.75692308

que genera la siguiente gráfica:

para encontrar la cantidad necesaria a invertir y obtener 6.0 de ganancia en f(x):

6.0 = -3.67490842 x^3 + 41.06730769 x^2 + -149.92086081 x + 184.75692308

que para usar en el algoritmo se realiza se reordena como g(x) = 0

-3.67490842 x^3 + 41.06730769 x^2 +

-149.92086081 x + 184.75692308 - 6.0 = 0
y se aplica la búsqueda de raices en el rango [a, b] que de la gráfica se estima en [3.2, 3.8]

La ejecución del algoritmo de búsqueda queda como tarea.


Algoritmo en python para obtener la gráfica y respuesta a la matriz:

# Método de Gauss-Jordan
# Sistemas de Ecuaciones A.X=B
import numpy as np

# INGRESO
xi = [3.2 , 3.8 , 4.2 , 4.5 ]
fi = [5.12, 6.42, 7.25, 6.85]

A = [[4.5**3 , 4.5**2 , 4.5 , 1],
     [4.2**3 , 4.2**2 , 4.2 , 1],
     [3.8**3 , 3.8**2 , 3.8 , 1],
     [3.2**3 , 3.2**2 , 3.2 , 1]]

B = [6.85,7.25,6.42,5.12]

# PROCEDIMIENTO
np.set_printoptions(precision=4)
casicero = 1e-15
# Matrices como arreglo, numeros reales
A = np.array(A,dtype=float)
B = np.array(B,dtype=float)

# Matriz aumentada AB
B_columna = np.transpose([B])
AB  = np.concatenate((A,B_columna),axis=1)

# Pivoteo parcial por filas
tamano = np.shape(AB)
n = tamano[0]
m = tamano[1]

# Para cada fila en AB
for i in range(0,n-1,1):
    # columna desde diagonal i en adelante
    columna = abs(AB[i:,i])
    dondemax = np.argmax(columna)
    
    if (dondemax !=0): # NO en diagonal
        # intercambia filas
        temporal = np.copy(AB[i,:])
        AB[i,:]  = AB[dondemax+i,:]
        AB[dondemax+i,:] = temporal
print('Pivoteo parcial por filas AB: ----')
print(AB)

# Eliminación hacia adelante
print('Eliminación hacia adelante: ------')
for i in range(0,n-1,1): # una fila
    pivote   = AB[i,i]
    adelante = i + 1
    for k in range(adelante,n,1): # diagonal adelante
        factor  = AB[k,i]/pivote
        AB[k,:] = AB[k,:] - AB[i,:]*factor

        print('i:',i,'k:',k, 'factor:',factor)
    print(AB)

# Eliminación hacia atras
print('Eliminación hacia atras: ------')
ultfila = n-1
ultcolumna = m-1
for i in range(ultfila,0-1,-1): # una fila
    pivote   = AB[i,i]
    print('i:',i,' pivote:',pivote)
    
    atras = i - 1
    for k in range(atras,0-1,-1): # diagonal adelante
        factor  = AB[k,i]/pivote
        AB[k,:] = AB[k,:] - AB[i,:]*factor
        for j in range(0,m,1): # casicero revisa
            if abs(AB[k,j])<casicero:
                AB[k,j]=0

        print(' k:',k, 'factor:',factor)
    print(AB)
    
    AB[i,:] = AB[i,:]/AB[i,i] # diagonal a unos
    
print('AB:')
print(AB)
X = np.copy(AB[:,ultcolumna])

# SALIDA
print('Método de Gauss-Jordan')
print('solución X: ')
print(X)

# Revisa polinomio
import matplotlib.pyplot as plt
a = np.min(xi)
b = np.max(xi)
muestras = 21

px = lambda x: X[0]*x**3 + X[1]*x**2 +X[2]*x + X[3]
xk = np.linspace(a,b,muestras)
pxk = px(xk)

# gráfica
plt.plot(xk,pxk)
plt.plot(xi,fi,'ro')
plt.show()