Este método tiene su fundamento teórico en el Teorema del Valor Intermedio, se basa en establecer un intervalo cerrado (a, b) en el cual la función es continua. Se deben buscar los valores que hagan que f(a) y f(b) tengan signos contrarios, de manera que f(a) ⋅ f(b) < 0, asegurando así la existencia de una raíz en el intervalo.
A diferencia del método de bisección, la Regla de Falsa Posición no toma el punto medio, sino que utiliza la intersección del eje x con la recta que une los puntos (a, f(a)) y (b, f(b)). Esta técnica puede ofrecer una mayor rapidez en la convergencia, especialmente si la función es casi lineal en el intervalo considerado.
La fórmula que se utiliza es:
X_r = b - \frac{f(b)(a - b)}{f(a) - f(b)}
El algoritmo para encontrar una raíz por el método de falsa posición se basa en los siguientes puntos:
- Escoger valores iniciales a (inferior) y b (superior) que encierren una raíz, es decir, tal que f(a) ⋅ f(b) < 0.
- Calcular una primera aproximación con la fórmula de la Regla de Falsa Posición.
Evaluar el signo de :
- Si , entonces la raíz está en el subintervalo , por lo que se reemplaza .
- Si , la raíz está en el subintervalo , por lo que se reemplaza .
- Si , entonces es raíz de la ecuación.
Ejemplo 1
f(x) = cos(x) - x
Esta función tiene una raíz en el intervalo (0, 1).
Ejemplo 2
x³ - 6x² + 11x - 6
Esta función tiene una raíz en el intervalo (1, 2).
Ejemplo 3
Esta función tiene una raíz en el intervalo (1, 2).
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# EJEMPLO 3
# Definimos la función
def f(x):
return x**3 + 4*x**2 - 10
# Regla de la falsa posición
def falsa_posicion(f, a, b, tol=1e-5, max_iter=100):
if f(a) * f(b) >= 0:
raise ValueError("La función debe cambiar de signo en el intervalo [a, b]")
data = []
for i in range(1, max_iter + 1):
fa = f(a)
fb = f(b)
xr = b - (fb * (a - b)) / (fa - fb)
fxr = f(xr)
if i == 1:
error = None
else:
error = abs((xr - xr_ant) / xr) * 100
data.append([i, a, b, xr, f(xr), error])
if fxr * fa < 0:
b = xr
else:
a = xr
if fxr == 0 or (error is not None and error < tol * 100):
break
xr_ant = xr
return data, xr
# Parámetros iniciales
a = 1
b = 2
tabla, raiz = falsa_posicion(f, a, b)
# Mostrar resultados
df_resultado = pd.DataFrame(tabla, columns=["Iteración", "a", "b", "xr", "f(xr)", "Error Rel (%)"])
print(df_resultado)
print(f"\nRaíz aproximada: {raiz:.6f}")
# Graficar función y puntos
x_vals = np.linspace(0.5, 2.5, 400)
y_vals = f(x_vals)
plt.figure(figsize=(10, 5))
plt.plot(x_vals, y_vals, label='f(x)', color='blue')
plt.axhline(0, color='black', linestyle='--')
# Puntos de xr
for row in tabla:
plt.plot(row[3], f(row[3]), 'ro')
plt.title("Método de la Falsa Posición para $f(x) = x^3 + 4x^2 - 10$")
plt.xlabel("x")
plt.ylabel("f(x)")
plt.grid(True)
plt.legend()
plt.show()