Sunteți pe pagina 1din 10

UNIVERSIDAD DE BUENOS AIRES

FACULTAD DE INGENIERA
DEPARTAMENTO DE COMPUTACIN

ASIGNATURA: ANLISIS NUMRICO I CDIGOS: 75.12, 95.04, 95.13


AO: 2017 2 CUATRIMESTRE

PROFESORA: LIC. MIRYAM SASSANO

INTEGRANTES:

Ramn, Facundo PADRN N - - - - -


Lpez Carbonaro, Martn Alejo PADRN N 9 2 8 0 1
PADRN N
PADRN N

TRABAJO PRCTICO N 1

TTULO: MTODO DE NEWTON-RAPHSON

FECHA DE PRESENTACIN: 28/09/2017

OBSERVACIONES FECHA

NOTA:

FIRMA DEL DOCENTE:


Anlisis Numrico - TP1 Ramn - Lpez Carbonaro

1. Introduccin
El presente trabajo expone la implementacin de mtodos numricos para el anlisis de
rentabilidad en un proyecto de inversin.
El objetivo principal es brindar, a los inversores, una herramienta simple para obtener el Valor
Actual Neto (V.A.N) en funcin de la tasa de descuento (i) y, a partir del clculo de races de la
funcin V AN (i) , obtener la Tasa Interna de Retorno (T.I.R) que define la tasa de descuento
mxima a partir de la cual la inversin deja de ser rentable. Con esta herramienta, se debe decidir
por s o por no, si es aconsejable realizar la inversin con un prstamo bancario cuya tasa de
inters anual es del 20%.
El proyecto consiste en la instalacin de una bloquera de premoldeados de hormign a cargo de la
cooperativa Vaca Aurora Ltda., y el anlisis se realiza a partir de dos parmetros de entrada
definidos por la cooperativa: monto de la inversin inicial (I0), en pesos; y capacidad mxima de
produccin anual (B), en unidades de ladrillos. Adems, se utilizan parmetros fijos inherentes al
proyecto, a saber: el costo de produccin prorrateado por unidad (c), en pesos; el precio unitario de
venta al pblico (p), tambin en pesos; y los volmenes pronosticados de ventas para los prximos
tres aos (Q1, Q2 y Q3),
en unidades de ladrillos.
De esta forma, la funcin V AN (i) queda definida en la ecuacin 1.

pQ1 cB pQ2 cB pQ3 cB


V AN (i) = I 0 + 1+i
+
(1+i)2
+
(1+i)3
(1)

Para garantizar rentabilidad, el valor de la funcin debe ser mayor o igual a cero, de modo que la
raz de esta funcin se corresponde con la Tasa Interna de Retorno.

V AN (T IR) = 0 (2)

Se propone utilizar el mtodo de Newton-Raphson para encontrar la T.I.R en base a los parmetros
de entrada definidos por el usuario. Esto le permitir, al inversor, simular diferentes situaciones de
inversin inicial y capacidad productiva para decidir sobre la viabilidad del proyecto.

2. Desarrollo
A continuacin se detalla la informacin numrica disponible para realizar el anlisis. Luego, se
evala la admisibilidad de la funcin para aplicar el mtodo de Newton-Raphson y, por ltimo, se
describe el algoritmo de clculo.

2.1. Datos numricos del problema


Los valores I0 y B se encuentran acotados de modo tal que:
190000 $ < I 0 < 200000 $ (3)

Pg. 1 de 9
Anlisis Numrico - TP1 Ramn - Lpez Carbonaro

20000 u < B < 35000 u (4)

Por otro lado, los costos de produccin y el precio de venta unitarios son los siguientes.

c=2$ (5)
p = 10 $ (6)

Y, por ltimo, la proyeccin de unidades vendidas para los prximos tres aos es la siguiente.

Q1 = 10000 u (7)
Q2 = 15000 u (8)
Q3 = 20000 u (9)

2.2. Admisibilidad de la funcin para aplicar N-R


Siendo V AN (i) una suma de funciones exponenciales y 0 i 1 , es posible afirmar que
V AN C 2 para valores de i [0, 1] .
Por otro lado, se analiza el signo de la funcin en ambos extremos del intervalo para dos
combinaciones de inversin inicial y capacidad de produccin anual: el primero
I 0 = 190000, B = 35000 , que representa la mejor situacin para el proyecto; y, el segundo,
I 0 = 200000, B = 20000 ; que representa la peor situacin. Para ambos casos
V AN (0)V AN (1) < 0 . En consecuencia, para cualquier combinacin de valores iniciales, existe un
punto p [0, 1] / V AN (p) = 0 .
La ltima condicin necesaria para que la funcin sea admisible es que su derivada no sea nula en
el intervalo de anlisis. Se cumple que:

d pQ1 cB 2(pQ2 cB) 3(pQ3 cB)


V AN (i) = =/ 0 i (0, 1) (10)
dt (1+i)2 (1+i)3 (1+i)4

Bajo estas condiciones, es posible aplicar el mtodo de Newton-Raphson para el clculo de raz
sobre la funcin V AN . Es decir, la sucesin definida en (11) converge a la raz de la funcin.

f (pn1 )
pn = pn1 f (pn1 )
n 1 (11)

2.3. Desarrollo del cdigo de mquina


El cdigo est desarrollado en la plataforma Octave 4.2.1. Los datos numricos se trabajan en
formato long para contar con una precisin de hasta 15 cifras significativas [1].
Se comienza por solicitar al usuario el ingreso de los dos parmetros iniciales: I0, correspondiente
a I0 restringido segn (3); y ProdMax, correspondiente a B y con las restricciones definidas en
(4).

Pg. 2 de 9
Anlisis Numrico - TP1 Ramn - Lpez Carbonaro

Luego, se define un vector Q que representa el valor de las proyecciones de venta para los
prximos tres aos, siendo Q = [Q1 Q2 Q3 ] definidas en (7 a 9). Tambin, se definen las
constantes c y p como costo de produccin (5) y precio de venta (6).
A partir de esos valores se obtiene el vector Flu, que representa el flujo de ingresos (diferencia
entre ganancia y costo) para los prximos tres aos, con el cual se construye la funcin VAN(i) (1).
Para construir la funcin se declara un objeto de tipo function_handle con variable
independiente i. Se utiliza una funcin secundaria, de tres parmetros de ingreso y uno de salida,
que devuelve el valor numrico de la funcin en el punto i. Este valor se identifica como van.

f = @(i) funcion_van(i, I0, Flu); %function_handle

function [ van] = funcion_van(i, I0, Flu) %funcin auxiliar


van = -I0;
for j = 1:length(Flu);
van += Flu(j)./(1+i).^j;
end
end;

d
Para realizar el mtodo de N-R es necesario calcular el valor de dt V AN (i) (10). Para esto se
construye un segundo objeto del tipo function_handle con la misma variable independiente
i. Tambin se utiliza una funcin auxiliar que obtiene el valor de la derivada en el punto i
utilizando la expresin definida en (10).

f_deriv = @(i) deriv_van(i, Flu); %handle_function

function [van_deriv] = deriv_van(i, Flu) %funcin auxiliar


van_deriv = 0;
for j = 1:length(Flu);
van_deriv += -1.*j.*Flu(j)./(1+i).^(j+1);
end
end;

Definidos f y f_deriv, se prosigue con la implementacin del mtodo de N-R para el clculo de
la raz de f=@(i). Se recuerda que el punto i para el cual la funcin es nula se corresponde con
la T.I.R del proyecto.
El mtodo se realiza por medio de una funcin auxiliar con tres parmetros de entrada: los objetos
f , f_deriv y la semilla de la iteracin, elegida como 0.2.

[x0, ea, tabla] = metodo_NR(f, f_deriv, 0.2); %funcin auxiliar

Esta funcin entrega tres parmetros: x0, la semilla elegida; ea, vector con el error absoluto en
cada iteracin; y tabla, matriz que incorpora en la primer columna las aproximaciones

Pg. 3 de 9
Anlisis Numrico - TP1 Ramn - Lpez Carbonaro

calculadas en cada iteracin, en la segunda columna el error absoluto y, por ltimo el error relativo
entre una iteracin y la anterior.
A continuacin se expone el mtodo y una breve explicacin.

function [x0, delta_abs, tabla] = metodo_NR(f, f_deriv, x1)

max_iter = 1000; % Cantidad mxima de iteraciones


rel_tol = 1e-14; % Error relativo deseado - se utiliza.
abs_tol = 0; % Error absoluto - no se utiliza.

x = zeros(max_iter, 1); %vector columna aproximaciones


ea = zeros(max_iter, 1); %vector columna errores absolutos
er = zeros(max_iter, 1); %vector columna errores relativos

x(1) = x1; %semilla

for i = 2:max_iter+2 %Arranca en d os pues 1 es semilla


x(i) = x(i-1) - f(x(i-1)) / f_deriv(x(i-1));
ea(i) = abs(x(i) - x(i-1));
er(i) = ea(i) / abs(x(i));
if ea(i) < abs_tol || er(i) < rel_tol
Break
end
end

if i =
= max_iter && not(ea(i) < abs_tol || er(i) < rel_tol);
disp('No hubo convergencia')
end

x = x(1:i);
ea = ea(1:i);
er = er(1:i);

x0 = x(end);
delta_abs = ea(end);
tabla = [x, ea, er];

end;

Se comienza por definir un mximo nmero de iteraciones para tener una ruta de escape por si el
mtodo no converge. Luego se definen el error relativo y absoluto deseado, al definir abs_tol =

Pg. 4 de 9
Anlisis Numrico - TP1 Ramn - Lpez Carbonaro

0 se establece como parmetro de paro al error relativo, esto es porque la condicin de detencin
implica un OR entre las dos condiciones, es decir, se detendr con el que suceda primero.
A continuacin se definen vectores de ceros que estn destinados a almacenar los valores
obtenidos en cada iteracin de errores y aproximaciones. En el vector de aproximaciones se define
la primer aproximacin como la semilla, x(1) = x1.
Luego se ingresa en un bucle del tipo for que realiza la sucesin definida en (11) hasta encontrar
un error relativo menor a la tolerancia establecida o hasta alcanzar un mximo de iteraciones. Si
sucede la primer condicin, entonces la sucesin convergi y la raz fue aproximada con el margen
de error establecido. Si la segunda condicin sucede, entonces la sucesin no logr aproximarse a
la raz con la tolerancia deseada.
Por ltimo, si hubo convergencia se despliegan los resultados en forma de tabla, se grafica la
funcin VAN(i) y se expresa el valor de la TIR junto con el error absoluto de la aproximacin.

2.4. Resultados
Al ejecutar el cdigo e ingresar dos valores iniciales se obtiene la siguiente informacin y el
grfico de la figura 1.

TP 1 - Anlisis numrico

os siguientes parmetros:
Ingrese l
Ingrese i nversion inicial I_0 (190000 a 200000): 1 90000
Ingrese p roduccin anual mxima (20000 a 35000): 2 0000

x_i // delta_i // deltar_i


0.200000000000000 0.000000000000000 0.000000000000000
0.272369942196532 0.072369942196532 0.265704584040747
0.280862570827904 0.008492628631373 0.030237666081097
0.280961514959665 0.000098944131760 0.000352162579187
0.280961528121599 0.000000013161934 0.000000046846038
0.280961528121599 0.000000000000000 0.000000000000001

La TIR es:
0.280961528121599
delta_abs=
2.77555756156289e-16

Pg. 5 de 9
Anlisis Numrico - TP1 Ramn - Lpez Carbonaro

Figura 1: Funcin VAN(i) para I0=190000


y B=20000. En rojo se encuentran
indicadas las aproximaciones obtenidas en cada iteracin

Con estos valores iniciales, s sera recomendable realizar la inversin utilizando un prstamo
bancario con inters anual del 20% anual, ya que la T.I.R es mayor a la tasa de inters impuesta
por el banco. Sin embargo, esta condicin no se satisface para todas las situaciones iniciales.
El consejo hacia el inversor sera pedir el prstamo para comenzar el proyecto pero no hacer
funcionar a la fbrica al 100% de su capacidad productiva, sino, producir acorde a la demanda
pronosticada. De este modo, su flujo de ingresos le permitir cubrir el prstamo y generar
ganancia.

3. Conclusin
Result de mucha ayuda realizar una implementacin en cdigo de mquina para asentar los
conceptos de mtodos numricos para hallar races vistos en clase. Contar con un cdigo de
ejemplo provisto por la ctedra simplific mucho el desarrollo y adems brind una forma de
comprobar que el algoritmo implementado por los integrantes del grupo devuelve la solucin
esperada.
La principal ventaja del mtodo Newton-Raphson consiste en la rpida convergencia, sin embargo
se requiere contar con la expresin de la derivada de la expresin a resolver. Si bien existe la
implementacin de este mtodo sin necesidad de la expresin de la derivada -en forma del mtodo
de la secante- (provisto a modo de ejemplo), el mismo requiere de ms operaciones por iteracin y
de dos semillas en lugar de una. Por este motivo se puede concluir que la expresin de N-R es ms

Pg. 6 de 9
Anlisis Numrico - TP1 Ramn - Lpez Carbonaro

eficiente que la secante, pero como desventaja requiere especificar la derivada de antemano. Esto
hace que sea ms difcil implementar N-R en forma genrica, si el objetivo fuera contar con un
algoritmo de resolucin de races no aplicado a un problema en particular, como en este caso fue al
clculo de una T.I.R. Una posible solucin sera que el programa o cdigo calcule primero la
derivada de la funcin en lenguaje simblico, algo que es realizable en Octave o Matlab. Dicha
operacin se hara por nica vez antes de comenzar con las iteraciones del mtodo.
Si llegado el caso, el clculo de la derivada fuera algortmicamente costoso o bien ineficiente, a la
hora de implementar un mtodo genrico de resolucin de races sera ms conveniente optar por
la implementacin de la secante y elegir correctamente las dos semillas.

4. Bibliografa
[1] John W. Eaton (1996), GNU Octave User Manual: Terminal Output. Recuperado de
https://www.gnu.org/software/octave/doc/v4.0.3/Terminal-Output.html

5. Anexo
Se presenta el cdigo principal junto con las funciones auxiliares.

5.1. Cdigo principal


%TP ANALISIS NUMERICO
%2017 - 2do cuat
%Lpez Carbonaro - Ramn

clc;
ll;
close a
clear a ll;

format long;

printf('TP 1 - analisis numerico \n')


printf('Ingrese los siguientes parametros: \n ')

%Ingreso de constantes por el usuario


do
printf('\n')
I0 = input('Ingrese inversion inicial I_0 (190000 a 200000): ');
ProdMax = input('Ingrese produccion anual maxima (20000 a 35000):
');
if (!(190000<=I0&&I0<=200000&&20000<=ProdMax&&ProdMax<=35000))
printf('Parametros no permitidos')
endif
until ( 190000<=I0&&I0<=200000&&20000<=ProdMax&&ProdMax<=35000 )

Pg. 7 de 9
Anlisis Numrico - TP1 Ramn - Lpez Carbonaro

%Datos fijos por enunciado


Q = [10000, 15000, 20000]; %se puede agregar mas valores para mas a?os
p = 10; %precio venta unitario
c = 2; %costo unitario

%Calculo de flujos, funcion VAN


Flu = p * Q - c * ProdMax; %vector fila de flujos
f = @(i) funcion_van(i, I0, Flu);
f_deriv = @(i) deriv_van(i, Flu);

%Busqueda de TIR por metodo N-R


[x0, ea, tabla] = metodo_NR(f, f_deriv, 0.2);

%salida por pantalla


disp(' x_i // delta_i // deltar_i')
disp(tabla)
disp('')
disp('La TIR es: ')
disp(x0)
disp('delta_abs= ')
disp(ea)

%Grafico de la van e iteraciones del metodo


ii = linspace(0, 1, 2^8+1);
plot(ii, f(ii), "b", "linewidth", 2)
hold on;
grid on;
xlabel("i");
ylabel("VAN(i)");
x = tabla(:,1);
plot(x, f(x), "r*", "linewidth", 2);
legend("VAN", "iteraciones");
title('TIR - metodo NR')
hold off;

%Salida a archivo
csvwrite("salida_tp1.csv", tabla); %! Si el archivo existe lo pisa !

5.2. Funciones auxiliares


function [van] = funcion_van(i, I0, Flu)

van = -
I0;
for j =
1:length(Flu);
van += Flu(j)./(1+i).^j;

Pg. 8 de 9
Anlisis Numrico - TP1 Ramn - Lpez Carbonaro

end
end;

function [van_deriv] = deriv_van(i, Flu)

van_deriv = 0;
for j = 1:length(Flu);
van_deriv += -1*j.*Flu(j)./(1+i).^(j+1);
end
end;

function [x0, delta_abs, tabla] = metodo_NR(f, f_deriv, x1)

max_iter = 1000;
rel_tol = 1e-14;
abs_tol = 0;

x = zeros(max_iter, 1); %vector columna aproximaciones


ea = zeros(max_iter, 1); %vector columna errores absolutos
er = zeros(max_iter, 1); %vector columna errores relativos

x(1) = x1; %semilla

for i =
2:max_iter+2 %Arranca en dos pues 1 es semilla
x(i) = x(i-1) - f(x(i-1)) / f_deriv(x(i-1));
ea(i) = abs(x(i) - x(i-1));
er(i) = ea(i) / abs(x(i));
I f ea(i) < abs_tol || er(i) < rel_tol
break %rompe el for
end%if
end%for

if i == max_iter && not (ea(i) < abs_tol || er(i) < rel_tol);


disp('No hubo convergencia')
end

x = x(1:i);
ea = ea(1:i);
er = er(1:i);

x0 = x(end);
delta_abs = ea(end);
tabla = [x, ea, er];

end

Pg. 9 de 9

S-ar putea să vă placă și