Построение унизительной функции consine в MatPlotLib - PullRequest
0 голосов
/ 26 октября 2018

Я ищу эффективный метод для создания двух массивов NumPy; первое - это серия равномерно распределенных чисел, а второе - результат передачи данных первого массива через математическую функцию.

Затем будут построены массивы NumPy, один как x, а другой как y. Я рисую демпфированные гармонические колебания пружины, которые даны как функция х (х - время на графике). Функция представляет собой экспоненциально убывающую синусоидальную волну, где у на графике - смещение от нуля:

f (x) = e ^ (- L. X). а. cos (w. x)

, где L, a и w - все константы (заданные пользователем), а e - экспоненциальная. В настоящее время я делаю это следующим образом, где SAMPLE_TIME и SAMPLE_RATE - это переменные модуля, установленные в другом месте. Я бы предпочел не перебирать массив y и искал способ сделать это за один раз.

# numpy arrays for x and y coords
x = np.arange(0, SAMPLE_TIME, SAMPLE_RATE)
y = np.arange(0, SAMPLE_TIME, SAMPLE_RATE)

# iterate over y array
with np.nditer(y, op_flags=['readwrite']) as arr:
    for el in arr:
        # under-damped harmonic oscillator equation
        el[...] = deflection * math.exp(-el*damping_coefficent) * math.cos(w * el)

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Попробуйте это:

x = np.linspace(0,10,1001)
L = 0.2
a = 2
w = 2
y = np.exp(-L*x) * a * np.cos(w * x)
plt.plot(x,y)
plt.show()

Обратите внимание, что массив numpy векторизован, что означает, что вы можете выполнять арифметику для всего массива.

0 голосов
/ 26 октября 2018

При использовании массива numpy операции векторизуются автоматически. Ниже приведен код, который вы можете использовать

# Create array x with length 200 and equally spaced values between 0 to 10
x = np.linspace(0,10, 200)    
y = deflection * np.exp(-x * damping_coefficient) * np.cos(w *x)
0 голосов
/ 26 октября 2018

Вот пример решения вашей проблемы с использованием векторизованного подхода NumPy без использования циклов for. Я выбираю некоторые входные данные для получения результата. Я использовал np.cos и np.exp для выполнения векторизованных операций, так как math.exp и math.cos их не позволяют.

SAMPLE_TIME = 100
SAMPLE_RATE = 0.2
x = np.arange(0, SAMPLE_TIME, SAMPLE_RATE)
deflection = 20
damping_coefficent = 0.1
w = 2*np.pi

el = deflection * np.exp(-x*damping_coefficent) * np.cos(w * x)
plt.plot(x, el)
plt.xlabel('x')
plt.ylabel('$f(x)$')

enter image description here

...