Как построить синусоидальную волну в Python с внезапным изменением амплитуды? - PullRequest
0 голосов
/ 07 апреля 2020

Опубликовано: 7/4/2020

Мне было интересно, знает ли кто-нибудь, как построить синусоидальную волну, скажем, с амплитудой 0,1 в качестве начала, а затем продолжить как обычно. Пока в одной точке, амплитуда не изменится до 1,0. Как внезапный всплеск изменения амплитуды. Как будто я был колебательной системой, которая была стабильной и становилась нестабильной в одной точке. Сюжет, который я ожидаю, следующий:

fault current model

С уважением, Анис

Обновленный прогресс: 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 () для ее решения. Когда я это сделал, я не получил ожидаемой точки помпажа. Так есть идеи по этому поводу? Я использую время как ось х вместо индексации. И я использую numoy синус вместо математической библиотеки. Это потому, что когда я попробовал FFT для кода, предложенного ниже, я не получал 50 Гц, он был больше 30 или 10 Гц, и это понятно, учитывая, что частота не была установлена, и это зависит от периода periodi c созданный самой синусоидой.

С уважением, Анис

Ответы [ 3 ]

1 голос
/ 07 апреля 2020

Вы могли бы построить кусочную функцию 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()

И вы получит:

piecewisesinfunction

1 голос
/ 07 апреля 2020

Точно так же, как синусоидальная волна в реальности, если амплитуда изменяется. Вы соединяете точки амплитуды непосредственно перед изменением и сразу после него. Это не отличается от построения самой синусоидальной волны. Как это выглядит, например, резкость краев, зависит только от момента, когда произойдет изменение.

Это очень простой c способ вычисления точек и построения линий между ними.

При 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()

enter image description here

После структурирования еще немного и внесения требуемых изменений амплитуды в списке легко создавать хорошие шипы.

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()

enter image description here

0 голосов
/ 21 апреля 2020

Я преобразовал код в период времени:

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()

Результат

enter image description here

...