By: Jesús Ángel Martínez Mendoza | 2024
Modelos matemáticos
Lineal
Dada una serie da valores, o puntos.
| $x$ | $f(x)$ |
|---|---|
| $\dots$ | $\dots$ |
| $x_{-1}$ | $f(x_{-1})$ |
| $x_{0}$ | $f(x_{0})$ |
| $x_{1}$ | $f(x_{1})$ |
| $\dots$ | $\dots$ |
Si queremos conocer un valor de $x$ entre $x_{0}$ y $x_{1}$ con la condición de que
$$x_{0} < x < x_{1}$$
Se aplica la siguiente formula
$$f(x)=f(x_{0})+\frac{f(x_{1})-f(x_{0})}{x_{1}-x_{0}}(x - x_{0})$$
Para comprobar el resultado al ser una línea (creciente) basta con que se cumpla la siguiente condición
$$f(x_{0}) < f(x) < f(x_{1})$$
Si es decreciente es
$$f(x_{0}) > f(x) > f(x_{1})$$Cuadrada por Interpolación de Newton
- Dado una serie de puntos de la forma
- $(x_{0}, f(x_{0}))$
- $(x_{1}, f(x_{1}))$
- $(x_{2}, f(x_{2}))$
- Se calculan los siguientes valores $$b_{0}=f(x_{0})$$ $$b_{1}=\frac{f(x_{1})-f(x_{0})}{x_{1}-x_{0}}$$ $$b_{2}=\frac{\frac{f(x_{2})-f(x_{1})}{x_{2}-x_{1}}-\frac{f(x_{1})-f(x_{0})}{x_{1}-x_{0}}}{x_{2}-x_{0}}$$
- Se sustituyen en la siguiente expresión $$f(x)=b_{0}+b_{1}(x-x_{0})+b_{2}(x-x_{0})(x-x_{1})$$
- Reducimos la expresión y obtenemos algo de la forma $$c_{2}x^{2}+c_{1}x+c_{0}$$
- Podemos comprobar usado las $x$ obteniendo sus respectivos $f(x)$
Cúbica por Interpolación de Newton
- Dado una serie de puntos
- $(x_{0},f(x_{0}))$
- $(x_{1},f(x_{1}))$
- $(x_{2},f(x_{2}))$
$(x_{3},f(x_{3}))$
Calcula los siguientes valores
$$b_{0}=f(x_{0})$$
$$b_{1}=\frac{f(x_{1})-f(x_{0})}{x_{1}-x_{0}}$$
$$b_{2}=\frac{\frac{f(x_{2})-f(x_{1})}{x_{2}-x_{1}}-\frac{f(x_{1})-f(x_{0})}{x_{1}-x_{0}}}{x_{2}-x_{0}}$$
$$b_{3}=\frac{\frac{f(x_{3})-f(x_{2})}{x_{3}-x_{2}}-\frac{f(x_{2})-f(x_{1})}{x_{2}-x_{1}}-\frac{f(x_{1})-f(x_{0})}{x_{1}-x_{0}}}{x_{3}-x_{0}}$$
3. Sustituye en la siguiente expresión
$$f(x)=b_{0}+b_{1}(x-x_{0})+b_{2}(x-x_{0})(x-x_{1})+b_{3}(x-x_{0})(x-x_{1})(x-x_{2})$$
4. Reducimos la expresión y nos queda de la forma.
$$c_{3}x^{3}+c_{2}x^{2}+c_{1}x+c_{0}$$
5. Podemos comprobar usado las $x$ obteniendo sus respectivos $f(x)$
Interpolación Cuadrática de Lagrange
- Dado una serie de puntos de la forma
- $(x_{0}, f(x_{0}))$
- $(x_{1}, f(x_{1}))$
$(x_{2}, f(x_{2}))$
Se calculan los siguientes valores
$$a_{0}=\frac{f(x_{0})}{(x_{0}-x_{1})(x_{0}-x_{2})}$$
$$a_{1}=\frac{f(x_{1})}{(x_{1}-x_{0})(x_{1}-x_{2})}$$
$$a_{2}=\frac{f(x_{2})}{(x_{2}-x_{0})(x_{2}-x_{1})}$$Se sustituyen en la siguiente expresión
$$a_{0}(x-x_{1})(x-x_{2})+a_{1}(x-x_{0})(x-x_{2})+a_{2}(x-x_{0})(x-x_{1})$$Reducimos la expresión y obtenemos algo de la forma
$$c_{2}x^{2}+c_{1}x+c_{0}$$Podemos comprobar usado las $x$ obteniendo sus respectivos $f(x)$
Interpolación Cúbica de Lagrange
- Dado una serie de puntos
- $(x_{0},f(x_{0}))$
- $(x_{1},f(x_{1}))$
- $(x_{2},f(x_{2}))$
$(x_{3},f(x_{3}))$
Calcula los siguientes valores en este caso llamado Lagranges
$$L_{0}=\frac{(x-x_{1})(x-x_{2})(x-x_{3})}{(x_{0}-x_{1})(x_{0}-x_{2})(x_{0}-x_{3})}$$
$$L_{1}=\frac{(x-x_{0})(x-x_{2})(x-x_{3})}{(x_{1}-x_{0})(x_{1}-x_{2})(x_{1}-x_{3})}$$
$$L_{2}=\frac{(x-x_{0})(x-x_{1})(x-x_{3})}{(x_{2}-x_{0})(x_{2}-x_{1})(x_{2}-x_{3})}$$
$$L_{3}=\frac{(x-x_{0})(x-x_{1})(x-x_{2})}{(x_{3}-x_{0})(x_{3}-x_{1})(x_{3}-x_{2})}$$Sustituye en la siguiente expresión
$$P_{n}(x)=f(x_{0})L_{0}(x)+f(x_{1})L_{1}(x)+f(x_{2})L_{2}(x)+f(x_{3})L_{3}(x)$$Reducimos la expresión y nos queda de la forma.
$$c_{3}x^{3}+c_{2}x^{2}+c_{1}x+c_{0}$$Podemos comprobar usado las $x$ obteniendo sus respectivos $f(x)$
Scripts en Python
Lineal
print("\tINTERPOLACION LINEAL")
print("\t1. INSERTE DATOS")
x0 = float(input("x0: "))
fx0 = float(input("f(x0): "))
x1 = float(input("x1: "))
fx1 = float(input("f(x1): "))
x = float(input("x: "))
print("\t2. SUSTITUIR")
print("f(x) = f(x0) + (f(x1) - f(x0)) / (x1 - x0) * (x - x0)")
# Expresión con los valores sustituidos
interpolated_expression = f"{fx0} + ({fx1} - {fx0}) / ({x1} - {x0}) * ({x} - {x0})"
print(f"f(x) = {interpolated_expression}")
print("\t3. RESULTADO")
# Calcula el valor interpolado usando los valores ingresados
result = fx0 + (fx1 - fx0) / (x1 - x0) * (x - x0)
print(f"El valor interpolado de f(x) en x = {x} es {result}")
Cuadrada por Interpolación de Newton
def calcular_coeficientes_newton(x0, fx0, x1, fx1, x2, fx2):
print("\tCalculando Coeficientes:")
b0 = fx0
print(f"b0 (f(x0)) = {b0}")
b1 = (fx1 - fx0) / (x1 - x0)
print(f"b1 = (f(x1) - f(x0)) / (x1 - x0) = ({fx1} - {fx0}) / ({x1} - {x0}) = {b1}")
b2 = ((fx2 - fx1) / (x2 - x1) - b1) / (x2 - x0)
print(f"b2 = ((f(x2) - f(x1)) / (x2 - x1) - b1) / (x2 - x0) = (({fx2} - {fx1}) / ({x2} - {x1}) - {b1}) / ({x2} - {x0}) = {b2}")
return b0, b1, b2
def formar_funcion_cuadratica(x0, x1, b0, b1, b2):
print("\tFormando la Función Polinómica:")
print("Partiendo de la fórmula general:")
print(f"f(x) = {b0} + {b1}(x - {x0}) + {b2}(x - {x0})(x - {x1})")
# Transformación de la función en la forma polinómica estándar
c2 = b2
c1 = b1 - b2 * (x0 + x1)
c0 = b0 - b1 * x0 + b2 * x0 * x1
print(f"Desarrollando cada término:")
print(f"c2 = b2 = {c2}")
print(f"c1 = b1 - b2*(x0 + x1) = {b1} - {b2}*({x0} + {x1}) = {c1}")
print(f"c0 = b0 - b1*x0 + b2*x0*x1 = {b0} - {b1}*{x0} + {b2}*{x0}*{x1} = {c0}")
return c2, c1, c0
print("Interpolación Cuadrada por Newton")
print("1. Inserte los datos:")
x0 = float(input("x0: "))
fx0 = float(input("f(x0): "))
x1 = float(input("x1: "))
fx1 = float(input("f(x1): "))
x2 = float(input("x2: "))
fx2 = float(input("f(x2): "))
b0, b1, b2 = calcular_coeficientes_newton(x0, fx0, x1, fx1, x2, fx2)
c2, c1, c0 = formar_funcion_cuadratica(x0, x1, b0, b1, b2)
print("3. Función Polinómica Reducida:")
funcion_cuadratica = f"f(x) = {c2}x^2 + {c1}x + {c0}"
print(funcion_cuadratica)
print("4. Comprobación con los puntos dados:")
for x, fx in [(x0, fx0), (x1, fx1), (x2, fx2)]:
fx_calculado = c2 * x**2 + c1 * x + c0
print(f"f({x}) = {fx_calculado}, esperado {fx}")
Cúbica por Interpolación de Newton
def calcular_coeficientes_newton_cubica(x0, fx0, x1, fx1, x2, fx2, x3, fx3):
print("\tCalculando Coeficientes:")
# Coeficiente b0 directamente de f(x0)
b0 = fx0
print(f"b0 = f(x0) = {b0}")
# Coeficiente b1 a partir de la primera diferencia dividida
b1 = (fx1 - fx0) / (x1 - x0)
print(f"b1 = (f(x1) - f(x0)) / (x1 - x0)")
print(f"\t({fx1} - {fx0}) / ({x1} - {x0}) = {b1}")
# Coeficiente b2 a partir de la segunda diferencia dividida
primera_dif_21 = (fx2 - fx1) / (x2 - x1)
primera_dif_10 = (fx1 - fx0) / (x1 - x0)
b2 = (primera_dif_21 - primera_dif_10) / (x2 - x0)
print(f"b2 = ((f(x2) - f(x1)) / (x2 - x1) - (f(x1) - f(x0)) / (x1 - x0)) / (x2 - x0)")
print(f"\t(({fx2} - {fx1}) / ({x2} - {x1}) - ({fx1} - {fx0}) / ({x1} - {x0})) / ({x2} - {x0}) = {b2}")
# Coeficiente b3 a partir de la tercera diferencia dividida
segunda_dif_32 = (fx3 - fx2) / (x3 - x2)
segunda_dif_21 = (fx2 - fx1) / (x2 - x1)
b3 = (segunda_dif_32 - segunda_dif_21 - primera_dif_10) / (x3 - x0)
print(f"b3 = (((f(x3) - f(x2)) / (x3 - x2) - (f(x2) - f(x1)) / (x2 - x1)) - ((f(x2) - f(x1)) / (x2 - x1) - (f(x1) - f(x0)) / (x1 - x0))) / (x3 - x0)")
print(f"\t((({fx3} - {fx2}) / ({x3} - {x2}) - ({fx2} - {fx1}) / ({x2} - {x1})) - (({fx2} - {fx1}) / ({x2} - {x1}) - ({fx1} - {fx0}) / ({x1} - {x0}))) / ({x3} - {x0}) = {b3}")
return b0, b1, b2, b3
def formar_funcion_cubica(x0, x1, x2, b0, b1, b2, b3):
print("\tFormando la Función Polinómica:")
print("Partiendo de la fórmula general:")
print(f"f(x) = {b0} + {b1}(x - {x0}) + {b2}(x - {x0})(x - {x1}) + {b3}(x - {x0})(x - {x1})(x - {x2})")
# Transformación de la función en la forma polinómica estándar
c3 = b3
c2 = b2 - b3 * (x0 + x1 + x2)
c1 = b1 - b2 * (x0 + x1) + b3 * (x0 * x1 + x1 * x2 + x2 * x0)
c0 = b0 - b1 * x0 + b2 * x0 * x1 - b3 * x0 * x1 * x2
print(f"Desarrollando cada término:")
print(f"c3 = b3 = {c3}")
print(f"c2 = b2 - b3*(x0 + x1 + x2) = {b2} - {b3}*({x0} + {x1} + {x2}) = {c2}")
print(f"c1 = b1 - b2*(x0 + x1) + b3*(x0*x1 + x1*x2 + x2*x0) = {b1} - {b2}*({x0} + {x1}) + {b3}*({x0*x1} + {x1*x2} + {x2*x0}) = {c1}")
print(f"c0 = b0 - b1*x0 + b2*x0*x1 - b3*x0*x1*x2 = {b0} - {b1}*{x0} + {b2}*{x0*x1} - {b3}*{x0*x1*x2} = {c0}")
return c3, c2, c1, c0
print("Interpolación Cúbica por Newton")
print("1. Inserte los datos:")
x0 = float(input("x0: "))
fx0 = float(input("f(x0): "))
x1 = float(input("x1: "))
fx1 = float(input("f(x1): "))
x2 = float(input("x2: "))
fx2 = float(input("f(x2): "))
x3 = float(input("x3: "))
fx3 = float(input("f(x3): "))
b0, b1, b2, b3 = calcular_coeficientes_newton_cubica(x0, fx0, x1, fx1, x2, fx2, x3, fx3)
c3, c2, c1, c0 = formar_funcion_cubica(x0, x1, x2, b0, b1, b2, b3)
print("3. Función Polinómica Reducida:")
funcion_cubica = f"f(x) = {c3}x^3 + {c2}x^2 + {c1}x + {c0}"
print(funcion_cubica)
print("4. Comprobación con los puntos dados:")
for x, fx in [(x0, fx0), (x1, fx1), (x2, fx2), (x3, fx3)]:
fx_calculado = c3 * x**3 + c2 * x**2 + c1 * x + c0
print(f"f({x}) = {fx_calculado}, esperado {fx}")
Interpolación Cuadrática de Lagrange
def calcular_coeficientes_lagrange(x0, fx0, x1, fx1, x2, fx2):
print("\tCalculando Coeficientes de Lagrange:")
# Coeficientes a0, a1, a2
a0 = fx0 / ((x0 - x1) * (x0 - x2))
print(f"a0 = f(x0) / ((x0 - x1) * (x0 - x2)) = {fx0} / (({x0} - {x1}) * ({x0} - {x2})) = {a0}")
a1 = fx1 / ((x1 - x0) * (x1 - x2))
print(f"a1 = f(x1) / ((x1 - x0) * (x1 - x2)) = {fx1} / (({x1} - {x0}) * ({x1} - {x2})) = {a1}")
a2 = fx2 / ((x2 - x0) * (x2 - x1))
print(f"a2 = f(x2) / ((x2 - x0) * (x2 - x1)) = {fx2} / (({x2} - {x0}) * ({x2} - {x1})) = {a2}")
return a0, a1, a2
def formar_funcion_cuadratica(x0, x1, x2, a0, a1, a2):
print("\tFormando la Función Polinómica:")
# Expresión completa de Lagrange
print(f"f(x) = {a0}*(x-{x1})*(x-{x2}) + {a1}*(x-{x0})*(x-{x2}) + {a2}*(x-{x0})*(x-{x1})")
# Expansión a forma polinómica
c2 = a0 + a1 + a2
c1 = -a0 * (x1 + x2) - a1 * (x0 + x2) - a2 * (x0 + x1)
c0 = a0 * x1 * x2 + a1 * x0 * x2 + a2 * x0 * x1
print(f"Función polinómica reducida: f(x) = {c2}x^2 + {c1}x + {c0}")
return c2, c1, c0
print("Interpolación Cuadrática de Lagrange")
print("Por favor, ingrese los datos:")
x0 = float(input("Ingrese x0: "))
fx0 = float(input("Ingrese f(x0): "))
x1 = float(input("Ingrese x1: "))
fx1 = float(input("Ingrese f(x1): "))
x2 = float(input("Ingrese x2: "))
fx2 = float(input("Ingrese f(x2): "))
a0, a1, a2 = calcular_coeficientes_lagrange(x0, fx0, x1, fx1, x2, fx2)
c2, c1, c0 = formar_funcion_cuadratica(x0, x1, x2, a0, a1, a2)
print("\n3. Función Polinómica Reducida:")
funcion_cuadratica = f"f(x) = {c2}x^2 + {c1}x + {c0}"
print(funcion_cuadratica)
print("\n4. Comprobación con los puntos dados:")
for x, fx_expected in [(x0, fx0), (x1, fx1), (x2, fx2)]:
fx_calculated = c2 * x**2 + c1 * x + c0
print(f"f({x}) calculado = {fx_calculated}, valor esperado = {fx_expected}")
Interpolación Cúbica de Lagrange
def calcular_coeficientes_lagrange_cubica(x0, fx0, x1, fx1, x2, fx2, x3, fx3):
print("\tCalculando Coeficientes de Lagrange:")
# Coeficientes L0, L1, L2, L3
# Aquí 'x' es una variable simbólica
from sympy import symbols
x = symbols('x')
L0 = ((x - x1) * (x - x2) * (x - x3)) / ((x0 - x1) * (x0 - x2) * (x0 - x3))
print(f"L0 = ((x - {x1}) * (x - {x2}) * (x - {x3})) / (({x0} - {x1}) * ({x0} - {x2}) * ({x0} - {x3})) = {L0}")
L1 = ((x - x0) * (x - x2) * (x - x3)) / ((x1 - x0) * (x1 - x2) * (x1 - x3))
print(f"L1 = ((x - {x0}) * (x - {x2}) * (x - {x3})) / (({x1} - {x0}) * ({x1} - {x2}) * ({x1} - {x3})) = {L1}")
L2 = ((x - x0) * (x - x1) * (x - x3)) / ((x2 - x0) * (x2 - x1) * (x2 - x3))
print(f"L2 = ((x - {x0}) * (x - {x1}) * (x - {x3})) / (({x2} - {x0}) * ({x2} - {x1}) * ({x2} - {x3})) = {L2}")
L3 = ((x - x0) * (x - x1) * (x - x2)) / ((x3 - x0) * (x3 - x1) * (x3 - x2))
print(f"L3 = ((x - {x0}) * (x - {x1}) * (x - {x2})) / (({x3} - {x0}) * ({x3} - {x1}) * ({x3} - {x2})) = {L3}")
Pn = fx0 * L0 + fx1 * L1 + fx2 * L2 + fx3 * L3
print(f"\nPn(x) = {fx0}*L0 + {fx1}*L1 + {fx2}*L2 + {fx3}*L3")
print(f"Reduced Polynomial: {Pn.expand()}")
return Pn.expand()
# Solicitar datos de usuario
print("Interpolación Cúbica de Lagrange")
print("Por favor, ingrese los datos:")
x0 = float(input("Ingrese x0: "))
fx0 = float(input("Ingrese f(x0): "))
x1 = float(input("Ingrese x1: "))
fx1 = float(input("Ingrese f(x1): "))
x2 = float(input("Ingrese x2: "))
fx2 = float(input("Ingrese f(x2): "))
x3 = float(input("Ingrese x3: "))
fx3 = float(input("Ingrese f(x3): "))
polinomio = calcular_coeficientes_lagrange_cubica(x0, fx0, x1, fx1, x2, fx2, x3, fx3)
# Comprobación de la función generada
print("\nComprobación con los puntos dados:")
from sympy import lambdify
funcion_polinomial = lambdify('x', polinomio)
for x, fx_expected in [(x0, fx0), (x1, fx1), (x2, fx2), (x3, fx3)]:
fx_calculated = funcion_polinomial(x)
print(f"f({x}) calculado = {fx_calculated}, valor esperado = {fx_expected}")