Spaces:
Sleeping
Sleeping
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) |