如何解决 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
我想生成二维行波正弦波。为此,我设置了平面波的参数并为任何时刻生成波,如下所示:
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')
如plt.figure(); plt.plot(plane_wave[2,:])
time is given in
我是 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