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

  1. Dado una serie de puntos de la forma
  2. $(x_{0}, f(x_{0}))$
  3. $(x_{1}, f(x_{1}))$
  4. $(x_{2}, f(x_{2}))$
  1. 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}}$$
  2. Se sustituyen en la siguiente expresión $$f(x)=b_{0}+b_{1}(x-x_{0})+b_{2}(x-x_{0})(x-x_{1})$$
  3. Reducimos la expresión y obtenemos algo de la forma $$c_{2}x^{2}+c_{1}x+c_{0}$$
  4. Podemos comprobar usado las $x$ obteniendo sus respectivos $f(x)$

Cúbica por Interpolación de Newton

  1. Dado una serie de puntos
  2. $(x_{0},f(x_{0}))$
  3. $(x_{1},f(x_{1}))$
  4. $(x_{2},f(x_{2}))$
  5. $(x_{3},f(x_{3}))$

  6. 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

  1. Dado una serie de puntos de la forma
  2. $(x_{0}, f(x_{0}))$
  3. $(x_{1}, f(x_{1}))$
  4. $(x_{2}, f(x_{2}))$

  5. 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})}$$

  6. 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})$$

  7. Reducimos la expresión y obtenemos algo de la forma
    $$c_{2}x^{2}+c_{1}x+c_{0}$$

  8. Podemos comprobar usado las $x$ obteniendo sus respectivos $f(x)$

Interpolación Cúbica de Lagrange

  1. Dado una serie de puntos
  2. $(x_{0},f(x_{0}))$
  3. $(x_{1},f(x_{1}))$
  4. $(x_{2},f(x_{2}))$
  5. $(x_{3},f(x_{3}))$

  6. 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})}$$

  7. 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)$$

  8. Reducimos la expresión y nos queda de la forma.
    $$c_{3}x^{3}+c_{2}x^{2}+c_{1}x+c_{0}$$

  9. 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}")