MathSolver / plotter.py
Taizun's picture
Upload 15 files
761e949 verified
import numpy as np
import plotly.graph_objects as go
from sympy import symbols, lambdify
from sympy.parsing.sympy_parser import parse_expr, standard_transformations, implicit_multiplication_application
from solver import preprocess_equation
def plot_function(input_str):
"""Create an interactive plot of the function."""
try:
# Preprocess input
processed_input = preprocess_equation(input_str)
# Handle different types of input
if '=' in processed_input:
# Equation: move everything to left side
left_side, right_side = [side.strip() for side in processed_input.split('=')]
transformations = standard_transformations + (implicit_multiplication_application,)
expr = parse_expr(left_side, transformations=transformations) - parse_expr(right_side, transformations=transformations)
elif input_str.startswith('∫'):
# Integration: plot the original function
expr = parse_expr(processed_input[1:].strip(), transformations=(standard_transformations + (implicit_multiplication_application,)))
elif input_str.startswith('d/dx'):
# Derivative: plot the original function
expr = parse_expr(processed_input[4:].strip(), transformations=(standard_transformations + (implicit_multiplication_application,)))
else:
# Regular expression
expr = parse_expr(processed_input, transformations=(standard_transformations + (implicit_multiplication_application,)))
# Create lambda function for numpy evaluation
x = symbols('x')
f = lambdify(x, expr, 'numpy')
# Generate x values
x_vals = np.linspace(-10, 10, 1000)
# Calculate y values
y_vals = f(x_vals)
# Create plot
fig = go.Figure()
# Add function curve
fig.add_trace(go.Scatter(
x=x_vals,
y=y_vals,
mode='lines',
name='f(x)',
line=dict(color='#FF4B4B', width=2)
))
# Add x-axis line
fig.add_trace(go.Scatter(
x=x_vals,
y=[0]*len(x_vals),
mode='lines',
name='x-axis',
line=dict(color='black', width=1)
))
# Update layout
fig.update_layout(
title='Function Visualization',
xaxis_title='x',
yaxis_title='y',
showlegend=True,
hovermode='x',
plot_bgcolor='white',
width=800,
height=500
)
# Update axes
fig.update_xaxes(zeroline=True, zerolinewidth=1, zerolinecolor='black', gridcolor='lightgray')
fig.update_yaxes(zeroline=True, zerolinewidth=1, zerolinecolor='black', gridcolor='lightgray')
return fig
except Exception as e:
raise Exception(f"Error creating plot: {str(e)}")