r3hab's picture
Create app.py
8f655b1 verified
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)