|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+import numpy as np
|
|
|
2
|
+from ipywidgets import interact
|
|
|
3
|
+import plotly.graph_objects as go
|
|
|
4
|
+from math import *
|
|
|
5
|
+
|
|
|
6
|
+def kappa(formula, x):
|
|
|
7
|
+ return eval(formula, {'acos': acos, 'exp': exp, 'cos': cos, 'sin': sin, 'pi': pi, 'x': x})
|
|
|
8
|
+
|
|
|
9
|
+def plot(formula='(1 + cos(((4)/2)*x))/2', RANGE_FROM=0, RANGE_TO=4*pi, N=10):
|
|
|
10
|
+ num_points = 1+2**N
|
|
|
11
|
+
|
|
|
12
|
+ # Generate x values with the specified number of points
|
|
|
13
|
+ x_vals = np.linspace(RANGE_FROM, RANGE_TO, num_points)
|
|
|
14
|
+
|
|
|
15
|
+ # Compute kappa values
|
|
|
16
|
+ kappa_vals = np.array([kappa(formula, x_val) for x_val in x_vals])
|
|
|
17
|
+
|
|
|
18
|
+ theta_vals = np.cumsum(kappa_vals) * (x_vals[1]-x_vals[0]) if num_points > 1 else np.array([0])
|
|
|
19
|
+ x_coords_ = np.cumsum(np.cos(theta_vals)) * (x_vals[1] - x_vals[0]) if num_points > 1 else np.array([0])
|
|
|
20
|
+ y_coords_ = np.cumsum(np.sin(theta_vals)) * (x_vals[1] - x_vals[0]) if num_points > 1 else np.array([0])
|
|
|
21
|
+
|
|
|
22
|
+ # Check if the first point is zero, if not, add it manually
|
|
|
23
|
+ if x_coords_[0] != 0 or y_coords_[0] != 0:
|
|
|
24
|
+ x_coords = np.insert(x_coords_, 0, 0)
|
|
|
25
|
+ y_coords = np.insert(y_coords_, 0, 0)
|
|
|
26
|
+ else:
|
|
|
27
|
+ x_coords = x_coords_
|
|
|
28
|
+ y_coords = y_coords_
|
|
|
29
|
+
|
|
|
30
|
+ fig = go.Figure()
|
|
|
31
|
+
|
|
|
32
|
+ fig.add_trace(go.Scatter(x=x_coords, y=y_coords, mode='lines', name='Curve'))
|
|
|
33
|
+
|
|
|
34
|
+ fig.update_layout(autosize=True, xaxis=dict(scaleanchor='y', scaleratio=1))
|
|
|
35
|
+ fig.show()
|
|
|
36
|
+
|
|
|
37
|
+# Create the interactive plot
|
|
|
38
|
+interact(plot, formula='(1 + cos(((4)/2)*x))/2', RANGE_FROM=(0, 4*pi, pi/4), RANGE_TO=(0, 4*pi, pi/4), N=(1,16));
|