Posted: 7/4/2020
I was wondering if anyone knows how to plot a sine wave with let\'s say amplitude of 0.1 as a start and then continuing on as usual. Until at one point,
Just like a sine wave in reality if the amplitude changes. You connect the dots of the amplitude just before and just after the change. It's not different from plotting the sine wave itself. How it looks, sharps edges for example, depends only of the moment the change happens.
This is a very basic way of calculating the points and plotting the lines between them.
At x=5 I double the amplitude.
import matplotlib.pyplot as plt
import math
def y_func(x):
return math.sin(x)
x_values = []
y_values = []
x = 0
amplitude = 1
while x < 5:
x_values.append(x)
y_values.append(amplitude * y_func(x))
x += 0.1
amplitude = 2
while x < 10:
x_values.append(x)
y_values.append(amplitude * y_func(x))
x += 0.1
plt.plot(x_values, y_values)
plt.title('test')
plt.show()
After structuring it some more and putting the desired amplitude changes in a list, it's easy to produces nice spikes.
import matplotlib.pyplot as plt
import math
# ------------------------------------------------------------------------
def get_amplitude(x):
for amplitude_change in amplitude_changes:
if x >= amplitude_change['x']:
amplitude = amplitude_change['amplitude']
return amplitude
# --------------------------------------------------------------------------
def y_func(x, amplitude):
return amplitude * math.sin(x)
# --------------------------------------------------------------------------
amplitude_changes = [
{'x': -1, 'amplitude': 1},
{'x': 6.5, 'amplitude': 2.2},
{'x': 6.7, 'amplitude': 1},
{'x': 9.1, 'amplitude': 0.5},
{'x': 9.2, 'amplitude': 1.2},
{'x': 9.4, 'amplitude': 1},
]
x_values = []
y_values = []
x = 0
max_x = 10
step = 0.1
while x <= max_x:
x_values.append(x)
amplitude = get_amplitude(x)
y_values.append(y_func(x, amplitude))
x += step
plt.plot(x_values, y_values)
plt.title('test')
plt.show()