import streamlit as st import matplotlib.pyplot as plt import numpy as np def lagrange_basis(x, i, x_points): basis = 1.0 st.latex(f"L_{{{i}}}(x) = ") for j in range(len(x_points)): if j != i: basis *= (x - x_points[j]) / (x_points[i] - x_points[j]) st.latex(f"\\cdot \\frac{{(x - x_{{{j}}})}}{{(x_{{{i}}} - x_{{{j}}})}} = \\frac{{({x} - {x_points[j]})}}{{({x_points[i]} - {x_points[j]})}}") return basis def lagrange_interpolation(x, x_points, y_points): result = 0.0 st.header("Calculation Steps") for i in range(len(x_points)): with st.expander(f"Term for (x₀,y₀) = ({x_points[i]}, {y_points[i]})", expanded=True): st.subheader(f"Calculating L_{i}({x}) * y_{i}") col1, col2 = st.columns(2) with col1: st.markdown("**Basis Polynomial Calculation**") basis = lagrange_basis(x, i, x_points) with col2: st.markdown("**Term Contribution**") term = y_points[i] * basis st.latex(f"y_{i} \\cdot L_{i}({x}) = {y_points[i]} \\times {basis:.4f} = {term:.4f}") result += term st.markdown(f"**Current Total**: {result:.4f}") return result # Streamlit UI st.title("Lagrange Interpolation Visualizer") st.markdown("Interactive calculator with step-by-step LaTeX visualization") # Input section st.sidebar.header("Input Parameters") x_points = st.sidebar.text_input("X values (comma separated)", "1500,1600,1700,1900").split(',') x_points = [float(x.strip()) for x in x_points] y_points = st.sidebar.text_input("Y values (comma separated)", "1234,2345,4567,6789").split(',') y_points = [float(y.strip()) for y in y_points] x_target = st.sidebar.number_input("Target X value", value=1800.0) # Main calculation if len(x_points) != len(y_points): st.error("X and Y values must have the same number of elements!") else: st.header("Interpolation Formula") st.latex(r"P(x) = \sum_{i=0}^{n} y_i \cdot L_i(x)") st.latex(r"L_i(x) = \prod_{\substack{j=0 \\ j \neq i}}^{n} \frac{x - x_j}{x_i - x_j}") result = lagrange_interpolation(x_target, x_points, y_points) st.success(f"**Final Interpolated Value**: P({x_target}) = {result:.2f}") # Visualization st.header("Visualization") fig, ax = plt.subplots() # Plot original points ax.scatter(x_points, y_points, c='red', label='Original Data') # Plot interpolated point ax.scatter([x_target], [result], c='blue', s=100, label='Interpolated Point') # Plot polynomial curve x_vals = np.linspace(min(x_points)-50, max(x_points)+50, 400) y_vals = [lagrange_interpolation(x, x_points, y_points) for x in x_vals] ax.plot(x_vals, y_vals, '--', label='Interpolation Polynomial') ax.set_xlabel('X') ax.set_ylabel('Y') ax.legend() st.pyplot(fig)