Spaces:
Sleeping
Sleeping
import streamlit as st | |
from sympy import ( | |
symbols, integrate, diff, exp, log, ln, sin, cos, tan, sec, csc, cot, latex, SympifyError, sympify | |
) | |
# Define the Streamlit app | |
def main(): | |
st.set_page_config(layout="wide", page_title="Integration by Parts Solver") | |
st.title("Integration by Parts - Step-by-Step Solver") | |
st.markdown( | |
""" | |
## Formula for Integration by Parts | |
\[ | |
\\int u \\cdot v' \\, dx = u \\cdot v - \\int v \\cdot u' \\, dx | |
\] | |
""" | |
) | |
# Sidebar for input | |
st.sidebar.header("Input Section") | |
st.sidebar.markdown("Provide the integrand and ξuξ for integration by parts.") | |
# Sidebar inputs | |
function_input = st.sidebar.text_input( | |
"Enter the integrand (e.g., x * exp(x), cos(ln(x)), x^2 * sin(x)):", | |
"x * exp(x)" | |
) | |
u_input = st.sidebar.text_input( | |
"Choose 'u' (e.g., x for x * exp(x) or ln(x)):", "x" | |
) | |
solve_button = st.sidebar.button("Solve") | |
if solve_button: | |
try: | |
# Define the variable and import common functions for eval() | |
x = symbols("x") | |
safe_globals = {"x": x, "exp": exp, "ln": ln, "log": log, | |
"sin": sin, "cos": cos, "tan": tan, | |
"sec": sec, "csc": csc, "cot": cot} | |
# Validate and parse inputs | |
try: | |
integrand = sympify(function_input, locals=safe_globals) | |
u = sympify(u_input, locals=safe_globals) | |
except SympifyError: | |
st.error("Invalid input. Please use valid mathematical syntax (e.g., cos(ln(x))).") | |
return | |
dv = integrand / u | |
# Compute derivatives and integrals | |
du = diff(u, x) | |
v = integrate(dv, x) | |
# Compute the result | |
first_term = u * v | |
second_term = integrate(v * du, x) | |
result = first_term - second_term | |
# Display steps | |
st.subheader("Step-by-Step Solution") | |
st.markdown("### 1. Choose ξuξ and ξv'ξ:") | |
st.latex(f"u = {latex(u)}, \\quad v' = {latex(dv)}") | |
st.markdown("### 2. Compute ξduξ and ξvξ:") | |
st.latex(f"du = \\frac{{d}}{{dx}}[{latex(u)}] = {latex(du)}") | |
st.latex(f"v = \\int {latex(dv)} \\, dx = {latex(v)}") | |
st.markdown("### 3. Apply the Integration by Parts Formula:") | |
st.latex( | |
f"\\int {latex(integrand)} \\, dx = u \\cdot v - \\int v \\cdot du" | |
) | |
st.latex( | |
f"= ({latex(u)})({latex(v)}) - \\int ({latex(v)})({latex(du)}) \\, dx" | |
) | |
st.markdown("### 4. Evaluate the Terms:") | |
st.latex(f"First Term = {latex(first_term)}") | |
st.latex(f"Second Term = \\int {latex(v * du)} \\, dx = {latex(second_term)}") | |
st.markdown("### 5. Combine Results:") | |
st.latex(f"\\int {latex(integrand)} \\, dx = {latex(result)} + C") | |
# Final output | |
st.subheader("Final Answer") | |
st.latex(f"{latex(result)} + C") | |
except Exception as e: | |
st.error(f"An error occurred: {e}") | |
# Run the app | |
if __name__ == "__main__": | |
main() |