如何解决 python 中绘制二维正弦波的问题

How to fix the issue of plotting a 2D sine wave in python

我想生成二维行波正弦波。为此,我设置了平面波的参数并为任何时刻生成波,如下所示:

import numpy as np
import random
import matplotlib.pyplot as plt
f = 10         # frequency
fs = 100       # sample frequency
Ts = 1/fs      # sample period
t = np.arange(0,0.5, Ts)   # time index
c = 50             # speed of wave
w = 2*np.pi *f     # angular frequency
k = w/c            # wave number

resolution = 0.02
x = np.arange(-5, 5, resolution)
y = np.arange(-5, 5, resolution)
dx = np.array(x); M = len(dx)
dy = np.array(y); N = len(dy)
[xx, yy] = np.meshgrid(x, y);
theta = np.pi / 4         # direction of propagation
kx =  k* np.cos(theta)
ky = k * np.sin(theta)

所以,平面波是

plane_wave = np.sin(kx * xx + ky * yy - w * t[1])
plt.figure(); 
plt.imshow(plane_wave,cmap='seismic',origin='lower', aspect='auto')

. Also, the sine wave variation with plt.figure(); plt.plot(plane_wave[2,:]) time is given in 所示,给出平滑的平面波。 然而,当我想在不同的时刻附加平面波时,图 03 & 04 中出现了一些不连续性,我想摆脱这个问题。

我是 python 的新人,非常感谢任何帮助。提前致谢。

arr = []
for count in range(len(t)):
    p = np.sin(kx * xx + ky * yy - w * t[count]); # plane wave
    arr.append(p)
arr = np.array(arr)
print(arr.shape)
pp,q,r = arr.shape
sig = np.reshape(arr, (-1, r))
print('The signal shape is :', sig.shape)

plt.figure(); plt.imshow(sig.transpose(),cmap='seismic',origin='lower', aspect='auto')
plt.xlabel('X'); plt.ylabel('Y')
plt.figure(); plt.plot(sig[2,:])

这不是编程的问题。这与您以某种不寻常的方式使用物理量这一事实有关。你的情节绝对正确无误。

您似乎误解了您所谈论的二维问题,其中添加了时间的三维空间。这绝不是错误的,但是如果您尝试附加 2D 波 side-by-side 的快照,您将(再次)使用 x 空间维度来表示时间变化。这导致该坐标轴的使用不一致。现在,为了使这更直观,分别考虑两个时间实例。二维平面上的 所有 点必须具有不同的振幅(当然除非时间以波的周期的倍数前进),这不符合您的直觉吗?确实是这样。因此,当您尝试附加这两个快照时,会出现不连续性。为了避免您必须使用等于一个周期的时间步长,我认为这没有实际用途,或者使用恒定的时间步长,使当前图像左边界上的波浪相位time 等于上一个时间步中图像右边界上的波的相位。然而,这将始终是一个恒定的时间步长,在两个所述值之间交替相位(在图像的边缘)。

同样适用于一维情况,因为您使用两个坐标轴来表示波(x 是 x 空间维度,y 用于表示振幅)。这是你上一个情节中可以看到的。

现在,您可能会问解决方案是什么。通过简单地检查波函数的数学公式就可以找到解决方案。在 2D 中,它是三个变量的标量函数(即输入三个值并输出一个值),因此您至少需要四个维度来表示它。 las,我们无法感知第四个空间维度,但这在您的情况下不是问题,因为函数的输出是用颜色表示的。然后可以使用三个维度来表示函数的时间演化。您所要做的就是创建一个 3D 数组,其中第三个维度表示时间,所有 2D 快照将存储在前两个维度中。

当谈到结果的视觉表示时,您可以使用某种瀑布图,其中 z-axis 代表时间,或者利用我们可以感知的第四个维度,即时间,来创建动画波的演变。

我对Python不是很熟悉,所以我只会提供一个通用的朴素实现。我相信这里的很多人都可以对以下代码段进行一些简化 and/or 优化。我假设您的前两个代码块中的所有内容都可用,因此只需在您提供的最后一个代码块中进行更改

arr = np.zeros((len(xx), len(yy), len(t))) # Initialise the array to hold the temporal evolution of the snapshots

for i in range(len(t)):
    arr[:, :, i] = np.sin(kx * xx + ky * yy - w * t[i])

# Below you can plot the figures with any function you prefer or make an animation out of it