Función en VBA para aplicar Método de Regula Falsi

Como se vio en el artículo sobre el método de falsa posición o regula falsi para conseguir una raíz de una función se utiliza un proceso iterativo donde en cada iteración se encuentra una aproximación a la raíz en la intersección de una recta con el eje X.  Esta recta une a dos puntos pertenecientes a la función a los cuales designamos como (x0, f(x0)) y (x1, f(x1)).

La intersección de esa recta con el eje X genera una abscisa a la cual denominaremos x2. Si el valor de f(x2) se aproxima a cero, de acuerdo a un nivel de tolerancia establecido, el valor de x2 se considera una raíz de la función f(x)

El valor de x2 como ya vimos anteriormente es:

regulaformula

En una nueva iteración vemos cual punto tiene abscisa más cercana a x2. El punto más cercano será el valor del nuevo punto x0. Y el valor de x2 se convertirá en x1.

Si esto se cumple x0=x1 y x1=x2, en caso contrario

x0=x0 y x1=x2

 

Se calcula un nuevo valor de x2 y de f(x2).  Si el valor de f(x2) está cerca de cero, de acuerdo a la tolerancia establecida el valor de x2 es una raíz. En caso contrario se vuelve a repetir el proceso. Esto es algo que puede automatizarse utilizando un ciclo Do While “condition” Loop.

regula10
Seudocódigo para metodo de Regula falsi

 

A continuación se muestra un código de VBA (Excel) para utilizar el método de Regula Falsi.

Se han creado dos funciones definidas por el usuario (UDF por sus siglas en ingles: User defined function).

La primera función funct(x) se utiliza para definir la función a la que deseamos calcular la raíz. Hay que introducir dentro del código la ecuación de la función.

La segunda función Regulaf(a,b) es el código del método Regula Falsi. Esta llama a la primera función y realiza las iteraciones para conseguir el valor de la raíz de acuerdo a la desviación que especifiquemos.

 

Public Function funct(x As Double) As Double

funct = x ^ 3 – 2 * x – 5

End Function

 

Public Function Regulaf(a, b)

Dim x0 As Double

Dim x1 As Double

Dim x2 As Double

Dim fx0 As Double

Dim fx1 As Double

Dim fx2 As Double

x0 = a

x1 = b

fx0 = funct(x0)

fx1 = funct(x1)

x2 = x0 – (x1 – x0) / (fx1 – fx0) * fx0

fx2 = funct(x2)

Do While Abs(fx2) > 0.001

If Abs(x2 – x1) < Abs(x2 – x0) Then

x0 = x1

x1 = x2

Else

x1 = x2

End If

fx0 = funct(x0)

fx1 = funct(x1)

x2 = x0 – (x1 – x0) / (fx1 – fx0) * fx0

fx2 = funct(x2)

Loop

Regulaf = x2

End Function

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s