如何绘制 Python 中幅度突然变化的正弦波?
How to plot sine wave in Python with sudden amplitude change?
发布时间:2020 年 7 月 4 日
我想知道是否有人知道如何绘制一个正弦波,假设振幅为 0.1 作为开始,然后像往常一样继续。直到某一时刻,振幅变为 1.0。就像振幅变化的突然激增。就像我是一个稳定的振荡系统,并在某一时刻变得不稳定。我期待的情节如下:
此致,
阿妮丝
更新进度:18/4/2020
import numpy as np
import matplotlib.pyplot as plotter
from scipy import signal
# How many time points are needed i,e., Sampling Frequency
samplingFrequency = 1500
# At what intervals time points are sampled
samplingInterval = 1 / samplingFrequency;
# Begin time period of the signals
beginTime = 0;
# End time period of the signals
endTime = 0.3;
# Frequency of the signals
signal1Frequency = 50;
#Time points
time = np.arange(beginTime, endTime, samplingInterval);
phase = 180
pi = np.pi
phi = phase*pi/180
# Create two waves- sine and square
amplitude1 = np.sin(2*np.pi*signal1Frequency*time)
amplitude2 = signal.square(2 * np.pi * 50 * time+ phi )
figure, axis = plotter.subplots(1, 1)
plotter.subplots_adjust(hspace=1)
if (time >0.2):
amplitude = 3*amplitude1
plotter.plot(time, amplitude)
plotter.title('test')
plotter.show()
以上是我目前正在处理的代码。由于歧义,它不断弹出错误。要求我使用 a.all() 和 a.any() 函数来解决它。当我这样做时,我没有得到我期望的激增点。那么有什么想法吗?我使用时间作为 x 轴而不是索引。我正在使用 numoy sine 而不是数学库。这是因为当我对下面提出的代码尝试 FFT 时,我没有得到 50 Hz,它更多的是 30 或 10 Hz,这是可以理解的,因为频率没有设置并且它取决于由正弦波本身。
此致,
阿妮丝
如果幅度发生变化,就像现实中的正弦波一样。您将变化前后的振幅点连接起来。这与绘制正弦波本身没有什么不同。它的外观,例如锐利的边缘,仅取决于变化发生的时刻。
这是一种非常基本的计算点和绘制点之间线的方法。
在 x=5 时,我将振幅加倍。
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()
进一步构建它并将所需的振幅变化放入列表后,很容易产生漂亮的尖峰。
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()
您可以绘制一个分段 sin
函数,其中第二部分定义发生的浪涌,您可以在那里更改振幅。
例如:
import numpy as np
import matplotlib.pyplot as plt
import math
surge_point = 50
amplitudeAfterSurge = 4
T = 50
x_normal = np.linspace(0, surge_point, 1000)
x_surge = np.linspace(surge_point, 150, 1000)
y_normal = [math.sin(2*math.pi*i/T) for i in x_normal] # first part of the function
# second part ,note `amplitudeAfterSurge` multiplying the function
y_surge = [amplitudeAfterSurge * math.sin(2*math.pi*i/T) for i in x_surge]
plt.plot(x_normal, y_normal , 'r')
plt.plot(x_surge, y_surge , 'r')
plt.show()
你会得到:
我已将代码转换为周期时间:
import matplotlib.pyplot as plt
import math
# ------------------------------------------------------------------------
# uses the list amplitude_changes to get the amplitude for time t
def get_amplitude(t):
for amplitude_change in amplitude_changes:
if t >= amplitude_change['t']:
amplitude = amplitude_change['amplitude']
return amplitude
# --------------------------------------------------------------------------
def y_func(time, period_time, amplitude):
return amplitude * math.sin((time / period_time) * 2 * math.pi)
# --------------------------------------------------------------------------
t_values = []
amplitude_values = []
signal1Frequency = 50
period_time = 1 / signal1Frequency
sampling_frequency = 1500
delta_t = 1 / sampling_frequency
amplitude_changes = [
{'t': 0, 'amplitude': 1},
{'t': period_time * 0.9, 'amplitude': 1.5},
{'t': period_time * 0.95, 'amplitude': 1},
{'t': period_time * 1.2, 'amplitude': 0.8},
{'t': period_time * 1.25, 'amplitude': 1},
]
max_t = period_time * 3 # plot 3 periods
t = 0
while t <= max_t:
t_values.append(t)
amplitude = get_amplitude(t)
amplitude_values.append(y_func(t, period_time, amplitude))
t += delta_t
plt.plot(t_values, amplitude_values)
plt.title(f'f = {signal1Frequency} Hz (T = {period_time}) - Sampling frequency = {sampling_frequency} Hz')
plt.show()
结果
发布时间:2020 年 7 月 4 日
我想知道是否有人知道如何绘制一个正弦波,假设振幅为 0.1 作为开始,然后像往常一样继续。直到某一时刻,振幅变为 1.0。就像振幅变化的突然激增。就像我是一个稳定的振荡系统,并在某一时刻变得不稳定。我期待的情节如下:
此致, 阿妮丝
更新进度:18/4/2020
import numpy as np
import matplotlib.pyplot as plotter
from scipy import signal
# How many time points are needed i,e., Sampling Frequency
samplingFrequency = 1500
# At what intervals time points are sampled
samplingInterval = 1 / samplingFrequency;
# Begin time period of the signals
beginTime = 0;
# End time period of the signals
endTime = 0.3;
# Frequency of the signals
signal1Frequency = 50;
#Time points
time = np.arange(beginTime, endTime, samplingInterval);
phase = 180
pi = np.pi
phi = phase*pi/180
# Create two waves- sine and square
amplitude1 = np.sin(2*np.pi*signal1Frequency*time)
amplitude2 = signal.square(2 * np.pi * 50 * time+ phi )
figure, axis = plotter.subplots(1, 1)
plotter.subplots_adjust(hspace=1)
if (time >0.2):
amplitude = 3*amplitude1
plotter.plot(time, amplitude)
plotter.title('test')
plotter.show()
以上是我目前正在处理的代码。由于歧义,它不断弹出错误。要求我使用 a.all() 和 a.any() 函数来解决它。当我这样做时,我没有得到我期望的激增点。那么有什么想法吗?我使用时间作为 x 轴而不是索引。我正在使用 numoy sine 而不是数学库。这是因为当我对下面提出的代码尝试 FFT 时,我没有得到 50 Hz,它更多的是 30 或 10 Hz,这是可以理解的,因为频率没有设置并且它取决于由正弦波本身。
此致, 阿妮丝
如果幅度发生变化,就像现实中的正弦波一样。您将变化前后的振幅点连接起来。这与绘制正弦波本身没有什么不同。它的外观,例如锐利的边缘,仅取决于变化发生的时刻。
这是一种非常基本的计算点和绘制点之间线的方法。
在 x=5 时,我将振幅加倍。
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()
进一步构建它并将所需的振幅变化放入列表后,很容易产生漂亮的尖峰。
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()
您可以绘制一个分段 sin
函数,其中第二部分定义发生的浪涌,您可以在那里更改振幅。
例如:
import numpy as np
import matplotlib.pyplot as plt
import math
surge_point = 50
amplitudeAfterSurge = 4
T = 50
x_normal = np.linspace(0, surge_point, 1000)
x_surge = np.linspace(surge_point, 150, 1000)
y_normal = [math.sin(2*math.pi*i/T) for i in x_normal] # first part of the function
# second part ,note `amplitudeAfterSurge` multiplying the function
y_surge = [amplitudeAfterSurge * math.sin(2*math.pi*i/T) for i in x_surge]
plt.plot(x_normal, y_normal , 'r')
plt.plot(x_surge, y_surge , 'r')
plt.show()
你会得到:
我已将代码转换为周期时间:
import matplotlib.pyplot as plt
import math
# ------------------------------------------------------------------------
# uses the list amplitude_changes to get the amplitude for time t
def get_amplitude(t):
for amplitude_change in amplitude_changes:
if t >= amplitude_change['t']:
amplitude = amplitude_change['amplitude']
return amplitude
# --------------------------------------------------------------------------
def y_func(time, period_time, amplitude):
return amplitude * math.sin((time / period_time) * 2 * math.pi)
# --------------------------------------------------------------------------
t_values = []
amplitude_values = []
signal1Frequency = 50
period_time = 1 / signal1Frequency
sampling_frequency = 1500
delta_t = 1 / sampling_frequency
amplitude_changes = [
{'t': 0, 'amplitude': 1},
{'t': period_time * 0.9, 'amplitude': 1.5},
{'t': period_time * 0.95, 'amplitude': 1},
{'t': period_time * 1.2, 'amplitude': 0.8},
{'t': period_time * 1.25, 'amplitude': 1},
]
max_t = period_time * 3 # plot 3 periods
t = 0
while t <= max_t:
t_values.append(t)
amplitude = get_amplitude(t)
amplitude_values.append(y_func(t, period_time, amplitude))
t += delta_t
plt.plot(t_values, amplitude_values)
plt.title(f'f = {signal1Frequency} Hz (T = {period_time}) - Sampling frequency = {sampling_frequency} Hz')
plt.show()
结果