Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import numpy as np | |
| import torch | |
| import sympy as sp | |
| from transformers import pipeline | |
| import plotly.graph_objects as go | |
| import plotly.express as px | |
| import matplotlib.pyplot as plt | |
| from scipy.integrate import odeint | |
| from typing import Dict, List, Tuple | |
| class PhysicsSolver: | |
| def __init__(self): | |
| self.nlp = pipeline("text-classification", model="bert-base-uncased") | |
| def solve_mechanics_problem(self, problem_text: str, problem_type: str) -> str: | |
| """Solve various physics problems using symbolic mathematics""" | |
| try: | |
| # Common symbols | |
| t, v, a, s, m, F, E, P, W, k, x = sp.symbols('t v a s m F E P W k x') | |
| g = 9.81 | |
| solutions = { | |
| 'kinematics': self._solve_kinematics, | |
| 'forces': self._solve_forces, | |
| 'energy': self._solve_energy, | |
| 'harmonic': self._solve_harmonic_motion | |
| } | |
| if problem_type in solutions: | |
| return solutions[problem_type](problem_text) | |
| else: | |
| return "Unsupported problem type" | |
| except Exception as e: | |
| return f"Error solving problem: {str(e)}" | |
| def _solve_kinematics(self, problem_text: str) -> str: | |
| """Handle kinematics problems""" | |
| t, v, a, s = sp.symbols('t v a s') | |
| solution = "Kinematics Analysis:\n\n" | |
| solution += "Using equations:\n" | |
| solution += "1. v = u + at\n" | |
| solution += "2. s = ut + ½at²\n" | |
| solution += "3. v² = u² + 2as\n\n" | |
| return solution | |
| def _solve_forces(self, problem_text: str) -> str: | |
| """Handle force and Newton's laws problems""" | |
| m, a, F = sp.symbols('m a F') | |
| solution = "Force Analysis:\n\n" | |
| solution += "Using Newton's Laws:\n" | |
| solution += "1. F = ma\n" | |
| solution += "2. Action = -Reaction\n" | |
| return solution | |
| def _solve_energy(self, problem_text: str) -> str: | |
| """Handle energy conservation problems""" | |
| m, v, h, k, E = sp.symbols('m v h k E') | |
| solution = "Energy Analysis:\n\n" | |
| solution += "Using energy conservation:\n" | |
| solution += "1. KE = ½mv²\n" | |
| solution += "2. PE = mgh\n" | |
| solution += "3. Total E = KE + PE\n" | |
| return solution | |
| def _solve_harmonic_motion(self, problem_text: str) -> str: | |
| """Handle simple harmonic motion problems""" | |
| m, k, x, t = sp.symbols('m k x t') | |
| solution = "Harmonic Motion Analysis:\n\n" | |
| solution += "Using SHM equations:\n" | |
| solution += "1. F = -kx\n" | |
| solution += "2. ω = √(k/m)\n" | |
| solution += "3. x = A cos(ωt)\n" | |
| return solution | |
| class ExperimentSimulator: | |
| def __init__(self): | |
| self.supported_experiments = ['pendulum', 'projectile', 'spring', 'wave'] | |
| def simulate_pendulum(self, length: float, theta0: float, time_span: float) -> Tuple[np.ndarray, np.ndarray, np.ndarray]: | |
| """Simulate simple pendulum motion""" | |
| def pendulum_eq(state, t, L): | |
| theta, omega = state | |
| dydt = [omega, -(9.81/L) * np.sin(theta)] | |
| return dydt | |
| t = np.linspace(0, time_span, 1000) | |
| state0 = [theta0, 0] | |
| solution = odeint(pendulum_eq, state0, t, args=(length,)) | |
| x = length * np.sin(solution[:, 0]) | |
| y = -length * np.cos(solution[:, 0]) | |
| return x, y, t | |
| def simulate_projectile(self, v0: float, angle: float, height: float) -> Tuple[np.ndarray, np.ndarray]: | |
| """Simulate projectile motion""" | |
| g = 9.81 | |
| theta = np.radians(angle) | |
| # Calculate time of flight | |
| t_flight = (v0 * np.sin(theta) + np.sqrt((v0 * np.sin(theta))**2 + 2*g*height)) / g | |
| t = np.linspace(0, t_flight, 1000) | |
| # Calculate position | |
| x = v0 * np.cos(theta) * t | |
| y = height + v0 * np.sin(theta) * t - 0.5 * g * t**2 | |
| return x, y | |
| def simulate_spring(self, mass: float, k: float, x0: float, time_span: float) -> Tuple[np.ndarray, np.ndarray]: | |
| """Simulate spring motion""" | |
| omega = np.sqrt(k/mass) | |
| t = np.linspace(0, time_span, 1000) | |
| x = x0 * np.cos(omega * t) | |
| v = -x0 * omega * np.sin(omega * t) | |
| return x, v, t | |
| def simulate_wave(self, amplitude: float, frequency: float, wavelength: float, time_span: float) -> Tuple[np.ndarray, np.ndarray, np.ndarray]: | |
| """Simulate wave propagation""" | |
| x = np.linspace(0, 5*wavelength, 1000) | |
| t = np.linspace(0, time_span, 100) | |
| k = 2 * np.pi / wavelength | |
| omega = 2 * np.pi * frequency | |
| X, T = np.meshgrid(x, t) | |
| Y = amplitude * np.sin(k*X - omega*T) | |
| return X, T, Y | |
| class VisualizationTools: | |
| def plot_pendulum(x: np.ndarray, y: np.ndarray, t: np.ndarray) -> go.Figure: | |
| """Create an interactive pendulum visualization""" | |
| fig = go.Figure() | |
| # Add pendulum path | |
| fig.add_trace(go.Scatter(x=x, y=y, mode='lines', name='Pendulum Path')) | |
| # Add animation frames | |
| frames = [go.Frame(data=[go.Scatter( | |
| x=[0, x[i]], | |
| y=[0, y[i]], | |
| mode='lines+markers', | |
| line=dict(color='red', width=2), | |
| marker=dict(size=[10, 20]) | |
| )]) for i in range(0, len(t), 10)] | |
| fig.frames = frames | |
| # Add animation controls | |
| fig.update_layout( | |
| updatemenus=[dict( | |
| type='buttons', | |
| showactive=False, | |
| buttons=[dict(label='Play', | |
| method='animate', | |
| args=[None, dict(frame=dict(duration=50, redraw=True), | |
| fromcurrent=True, | |
| mode='immediate')])])]) | |
| fig.update_layout( | |
| title='Simple Pendulum Motion', | |
| xaxis_title='X Position (m)', | |
| yaxis_title='Y Position (m)', | |
| yaxis=dict(scaleanchor="x", scaleratio=1), | |
| ) | |
| return fig | |
| def plot_projectile(x: np.ndarray, y: np.ndarray) -> go.Figure: | |
| """Create projectile motion visualization""" | |
| fig = go.Figure() | |
| fig.add_trace(go.Scatter(x=x, y=y, mode='lines', | |
| name='Projectile Path')) | |
| fig.update_layout( | |
| title='Projectile Motion', | |
| xaxis_title='Distance (m)', | |
| yaxis_title='Height (m)', | |
| yaxis=dict(scaleanchor="x", scaleratio=1), | |
| ) | |
| return fig | |
| def plot_spring(x: np.ndarray, v: np.ndarray, t: np.ndarray) -> go.Figure: | |
| """Create spring motion visualization""" | |
| fig = go.Figure() | |
| fig.add_trace(go.Scatter(x=t, y=x, name='Position')) | |
| fig.add_trace(go.Scatter(x=t, y=v, name='Velocity')) | |
| fig.update_layout( | |
| title='Spring Motion', | |
| xaxis_title='Time (s)', | |
| yaxis_title='Position/Velocity', | |
| ) | |
| return fig | |
| def plot_wave(X: np.ndarray, T: np.ndarray, Y: np.ndarray) -> go.Figure: | |
| """Create wave propagation visualization""" | |
| fig = go.Figure() | |
| # Create animation frames | |
| frames = [go.Frame( | |
| data=[go.Scatter( | |
| x=X[i], | |
| y=Y[i], | |
| mode='lines', | |
| line=dict(width=2) | |
| )], | |
| name=f'frame{i}' | |
| ) for i in range(len(T))] | |
| fig.frames = frames | |
| # Add initial data | |
| fig.add_trace(go.Scatter( | |
| x=X[0], | |
| y=Y[0], | |
| mode='lines', | |
| line=dict(width=2) | |
| )) | |
| # Add animation controls | |
| fig.update_layout( | |
| updatemenus=[dict( | |
| type='buttons', | |
| showactive=False, | |
| buttons=[dict(label='Play', | |
| method='animate', | |
| args=[None, dict(frame=dict(duration=50, redraw=True), | |
| fromcurrent=True, | |
| mode='immediate')])])]) | |
| fig.update_layout( | |
| title='Wave Propagation', | |
| xaxis_title='Position (m)', | |
| yaxis_title='Amplitude', | |
| ) | |
| return fig | |
| def create_interface(): | |
| # Initialize components | |
| solver = PhysicsSolver() | |
| simulator = ExperimentSimulator() | |
| viz_tools = VisualizationTools() | |
| # Define interface functions | |
| def solve_physics_problem(problem_text: str, problem_type: str) -> str: | |
| return solver.solve_mechanics_problem(problem_text, problem_type) | |
| def run_pendulum_simulation(length: float, initial_angle: float, duration: float) -> go.Figure: | |
| x, y, t = simulator.simulate_pendulum(length, np.radians(initial_angle), duration) | |
| return viz_tools.plot_pendulum(x, y, t) | |
| def run_projectile_simulation(velocity: float, angle: float, height: float) -> go.Figure: | |
| x, y = simulator.simulate_projectile(velocity, angle, height) | |
| return viz_tools.plot_projectile(x, y) | |
| def run_spring_simulation(mass: float, k: float, x0: float, duration: float) -> go.Figure: | |
| x, v, t = simulator.simulate_spring(mass, k, x0, duration) | |
| return viz_tools.plot_spring(x, v, t) | |
| def run_wave_simulation(amplitude: float, frequency: float, wavelength: float, duration: float) -> go.Figure: | |
| X, T, Y = simulator.simulate_wave(amplitude, frequency, wavelength, duration) | |
| return viz_tools.plot_wave(X, T, Y) | |
| # Create the interface | |
| with gr.Blocks() as interface: | |
| gr.Markdown("# Enhanced AI Physics Platform") | |
| with gr.Tab("Problem Solver"): | |
| problem_input = gr.Textbox( | |
| label="Enter your physics problem", | |
| placeholder="Describe your physics problem here..." | |
| ) | |
| problem_type = gr.Dropdown( | |
| choices=['kinematics', 'forces', 'energy', 'harmonic'], | |
| label="Problem Type" | |
| ) | |
| solve_button = gr.Button("Solve Problem") | |
| solution_output = gr.Textbox(label="Solution") | |
| solve_button.click( | |
| fn=solve_physics_problem, | |
| inputs=[problem_input, problem_type], | |
| outputs=solution_output | |
| ) | |
| with gr.Tab("Pendulum Simulation"): | |
| with gr.Row(): | |
| length_input = gr.Slider(1, 10, value=2, label="Pendulum Length (m)") | |
| angle_input = gr.Slider(0, 90, value=45, label="Initial Angle (degrees)") | |
| duration_input = gr.Slider(1, 20, value=10, label="Simulation Duration (s)") | |
| pendulum_button = gr.Button("Run Pendulum Simulation") | |
| pendulum_plot = gr.Plot(label="Pendulum Motion") | |
| pendulum_button.click( | |
| fn=run_pendulum_simulation, | |
| inputs=[length_input, angle_input, duration_input], | |
| outputs=pendulum_plot | |
| ) | |
| with gr.Tab("Projectile Motion"): | |
| with gr.Row(): | |
| velocity_input = gr.Slider(0, 50, value=20, label="Initial Velocity (m/s)") | |
| proj_angle_input = gr.Slider(0, 90, value=45, label="Launch Angle (degrees)") | |
| height_input = gr.Slider(0, 100, value=0, label="Initial Height (m)") | |
| projectile_button = gr.Button("Run Projectile Simulation") | |
| projectile_plot = gr.Plot(label="Projectile Motion") | |
| projectile_button.click( | |
| fn=run_projectile_simulation, | |
| inputs=[velocity_input, proj_angle_input, height_input], | |
| outputs=projectile_plot | |
| ) | |
| with gr.Tab("Spring Motion"): | |
| with gr.Row(): | |
| mass_input = gr.Slider(0.1, 10, value=1, label="Mass (kg)") | |
| k_input = gr.Slider(1, 100, value=10, label="Spring Constant (N/m)") | |
| x0_input = gr.Slider(0.1, 2, value=0.5, label="Initial Displacement (m)") | |
| spring_duration = gr.Slider(1, 20, value=10, label="Simulation Duration (s)") | |
| spring_button = gr.Button("Run Spring Simulation") | |
| spring_plot = gr.Plot(label="Spring Motion") | |
| spring_button.click( | |
| fn=run_spring_simulation, | |
| inputs=[mass_input, k_input, x0_input, spring_duration], | |
| outputs=spring_plot | |
| ) | |
| with gr.Tab("Wave Propagation"): | |
| with gr.Row(): | |
| amp_input = gr.Slider(0.1, 2, value=1, label="Amplitude (m)") | |
| freq_input = gr.Slider(0.1, 5, value=1, label="Frequency (Hz)") | |
| wavelength_input = gr.Slider(0.1, 10, value=2, label="Wavelength (m)") | |
| wave_duration = gr.Slider(1, 20, value=10, label="Simulation Duration (s)") | |
| # Continuing from the previous code... | |
| wave_button = gr.Button("Run Wave Simulation") | |
| wave_plot = gr.Plot(label="Wave Propagation") | |
| wave_button.click( | |
| fn=run_wave_simulation, | |
| inputs=[amp_input, freq_input, wavelength_input, wave_duration], | |
| outputs=wave_plot | |
| ) | |
| with gr.Tab("Advanced Visualizations"): | |
| with gr.Row(): | |
| visualization_type = gr.Dropdown( | |
| choices=[ | |
| 'Phase Space Plot', | |
| 'Energy Distribution', | |
| 'Vector Field', | |
| '3D Motion' | |
| ], | |
| label="Visualization Type" | |
| ) | |
| def create_advanced_visualization(viz_type): | |
| if viz_type == 'Phase Space Plot': | |
| return create_phase_space_plot() | |
| elif viz_type == 'Energy Distribution': | |
| return create_energy_distribution() | |
| elif viz_type == 'Vector Field': | |
| return create_vector_field() | |
| elif viz_type == '3D Motion': | |
| return create_3d_motion() | |
| advanced_viz_button = gr.Button("Generate Visualization") | |
| advanced_plot = gr.Plot(label="Advanced Visualization") | |
| advanced_viz_button.click( | |
| fn=create_advanced_visualization, | |
| inputs=visualization_type, | |
| outputs=advanced_plot | |
| ) | |
| with gr.Tab("Data Analysis"): | |
| data_input = gr.File(label="Upload Experimental Data (CSV)") | |
| analysis_type = gr.Dropdown( | |
| choices=[ | |
| 'Statistical Analysis', | |
| 'Curve Fitting', | |
| 'Error Analysis', | |
| 'Fourier Transform' | |
| ], | |
| label="Analysis Type" | |
| ) | |
| def analyze_data(file, analysis_type): | |
| # Add data analysis functionality here | |
| return f"Analysis results for {analysis_type}" | |
| analyze_button = gr.Button("Analyze Data") | |
| analysis_output = gr.Textbox(label="Analysis Results") | |
| analysis_plot = gr.Plot(label="Analysis Visualization") | |
| analyze_button.click( | |
| fn=analyze_data, | |
| inputs=[data_input, analysis_type], | |
| outputs=[analysis_output, analysis_plot] | |
| ) | |
| return interface | |
| # Additional visualization functions | |
| def create_phase_space_plot(): | |
| """Create a phase space plot for a dynamical system""" | |
| fig = go.Figure() | |
| # Generate sample phase space data | |
| t = np.linspace(0, 20, 1000) | |
| x = np.sin(t) | |
| v = np.cos(t) | |
| fig.add_trace(go.Scatter(x=x, y=v, mode='lines', | |
| name='Phase Space Trajectory')) | |
| fig.update_layout( | |
| title='Phase Space Plot', | |
| xaxis_title='Position', | |
| yaxis_title='Velocity' | |
| ) | |
| return fig | |
| def create_energy_distribution(): | |
| """Create an energy distribution visualization""" | |
| fig = go.Figure() | |
| # Generate sample energy data | |
| E = np.linspace(0, 10, 100) | |
| P = np.exp(-E) * np.sqrt(E) # Maxwell-Boltzmann-like distribution | |
| fig.add_trace(go.Scatter(x=E, y=P, mode='lines', | |
| name='Energy Distribution')) | |
| fig.update_layout( | |
| title='Energy Distribution', | |
| xaxis_title='Energy (J)', | |
| yaxis_title='Probability Density' | |
| ) | |
| return fig | |
| def create_vector_field(): | |
| """Create a vector field visualization""" | |
| fig = go.Figure() | |
| # Generate vector field data | |
| x = np.linspace(-5, 5, 20) | |
| y = np.linspace(-5, 5, 20) | |
| X, Y = np.meshgrid(x, y) | |
| U = -Y # x-component of vector field | |
| V = X # y-component of vector field | |
| fig.add_trace(go.Cone( | |
| x=X.flatten(), | |
| y=Y.flatten(), | |
| u=U.flatten(), | |
| v=V.flatten(), | |
| name='Vector Field' | |
| )) | |
| fig.update_layout( | |
| title='Vector Field Visualization', | |
| scene=dict( | |
| xaxis_title='X', | |
| yaxis_title='Y' | |
| ) | |
| ) | |
| return fig | |
| def create_3d_motion(): | |
| """Create a 3D motion visualization""" | |
| fig = go.Figure() | |
| # Generate 3D motion data (e.g., spiral motion) | |
| t = np.linspace(0, 10*np.pi, 1000) | |
| x = np.cos(t) | |
| y = np.sin(t) | |
| z = t/10 | |
| fig.add_trace(go.Scatter3d( | |
| x=x, y=y, z=z, | |
| mode='lines', | |
| name='3D Motion Path' | |
| )) | |
| fig.update_layout( | |
| title='3D Motion Visualization', | |
| scene=dict( | |
| xaxis_title='X', | |
| yaxis_title='Y', | |
| zaxis_title='Z' | |
| ) | |
| ) | |
| return fig | |
| class DataAnalyzer: | |
| def statistical_analysis(data): | |
| """Perform statistical analysis on experimental data""" | |
| stats = { | |
| 'mean': np.mean(data), | |
| 'std': np.std(data), | |
| 'median': np.median(data), | |
| 'min': np.min(data), | |
| 'max': np.max(data) | |
| } | |
| return stats | |
| def curve_fit(x, y): | |
| """Perform curve fitting on experimental data""" | |
| from scipy.optimize import curve_fit | |
| def func(x, a, b, c): | |
| return a * np.exp(-b * x) + c | |
| popt, pcov = curve_fit(func, x, y) | |
| return popt, pcov | |
| def error_analysis(data, uncertainties): | |
| """Perform error propagation analysis""" | |
| # Add error analysis calculations here | |
| pass | |
| def fourier_transform(data): | |
| """Perform Fourier transform analysis""" | |
| from scipy.fft import fft, fftfreq | |
| n = len(data) | |
| freq = fftfreq(n) | |
| freq_spectrum = fft(data) | |
| return freq, freq_spectrum | |
| # Launch the interface | |
| if __name__ == "__main__": | |
| interface = create_interface() | |
| interface.launch(share=True) |