File size: 2,210 Bytes
f0225be
04a0096
861a920
 
f0225be
861a920
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import numpy as np
import plotly.graph_objs as go
from plotly.subplots import make_subplots
import streamlit as st

def calculate_wave(wavelength, amplitude, frequency, num_periods, time_step):
    k = 2*np.pi/wavelength
    omega = 2*np.pi*frequency
    period = 1/frequency
    time_array = np.arange(0, num_periods*period, time_step)
    wave = amplitude * np.sin(k * np.arange(0, 1, wavelength/1000)[:, None] - omega * time_array)
    return time_array, wave

def plot_3d_wave(wavelength, amplitude, frequency):
    fig = make_subplots(rows=1, cols=2,
                        specs=[[{'type': 'surface'}, {'type': 'surface'}]],
                        subplot_titles=('Electric field', 'Magnetic field'),
                        )
    time_step = 1/(100*frequency)
    num_periods = 5
    time_array, wave = calculate_wave(wavelength, amplitude, frequency, num_periods, time_step)
    E_x = wave*np.cos(2*np.pi*time_array*frequency)
    E_y = np.zeros_like(E_x)
    E_z = np.zeros_like(E_x)
    B_x = np.zeros_like(E_x)
    B_y = -wave*np.sin(2*np.pi*time_array*frequency)
    B_z = np.zeros_like(E_x)
    
    fig.add_trace(go.Surface(x=wave, y=E_x, z=E_y, colorscale='Blues'), row=1, col=1)
    fig.add_trace(go.Surface(x=wave, y=B_x, z=B_y, colorscale='Reds'), row=1, col=2)
    fig.update_layout(scene_aspectratio=dict(x=1, y=1, z=1), width=800, height=400,
                      scene=dict(xaxis_title='Wave', yaxis_title='E_x', zaxis_title='E_y'),
                      scene2=dict(xaxis_title='Wave', yaxis_title='B_x', zaxis_title='B_y'),
                     )
    
    fig.update_xaxes(range=[0, wavelength], row=1, col=1)
    fig.update_xaxes(range=[0, wavelength], row=1, col=2)
    fig.update_yaxes(range=[-amplitude, amplitude], row=1, col=1)
    fig.update_yaxes(range=[-amplitude, amplitude], row=1, col=2)
    fig.update_zaxes(range=[-amplitude, amplitude], row=1, col=1)
    fig.update_zaxes(range=[-amplitude, amplitude], row=1, col=2)
    
    return fig

wavelength = st.slider('Wavelength', 0.1, 10.0, 1.0)
amplitude = st.slider('Amplitude', 0.1, 1.0, 0.5)
frequency = st.slider('Frequency', 0.1, 10.0, 1.0)

fig = plot_3d_wave(wavelength, amplitude, frequency)

st.plotly_chart(fig)