我想要产生二维正弦波。为此,我为平面波设置了参数,并为任意时刻生成了波,如下所示:
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,:])时间的变化规律。

。然而,当我想在不同的时间附加平面波时,图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,:])发布于 2022-03-29 11:09:40
这并不是编程的问题。它必须做更多的事实,你使用物理量以一种有点不寻常的方式。你的情节是绝对正确的。
你似乎误解了这样一个事实,那就是你谈论的是一个二维问题,它为时间增加了一个三维空间。这绝不是错误的,但如果您试图并排附加2D波的快照,则使用(再次)x空间维来表示时间变化。这导致使用该坐标系的不一致。现在,为了使这更直观,分别考虑这两个时间实例。在2D平面上的所有点都必须有不同的振幅(当然,除非时间是波周期的倍数),这不符合你的直觉吗?事实确实如此。因此,当您试图附加这两个快照时,就会显示出不连续性。为了避免你不得不使用一个等于一个周期的时间步长,我认为这是没有实际意义的,或者是一个恒定的时间步长,它会使图像左边边界上的波在当前时间的相位等于上一个时间步骤中图像右侧边界上的波的相位。然而,这将始终是一个恒定的时间步长,交替的相位(在图像的边缘)之间的两个所述的值。
这同样适用于一维情况,因为你使用两个坐标轴来表示波(x是x空间维数,y代表振幅)。这就是你最后一个阴谋中可以看到的。
现在,你可能会问什么解决方案。通过对波函数数学公式的简单检验,给出了求解的方法。在2D中,它是一个由三个变量组成的标量函数(即以三个值作为输入,输出一个),因此您至少需要四个维度来表示它。唉,我们不能感觉到第四个空间维度,但在您的情况下,这不是一个问题,因为函数的输出是用颜色表示的。然后有三个维度可以用来表示你的功能的时间演变。您所要做的就是创建一个3D数组,其中第三维空间表示时间,所有2D快照都将存储在前两个维度中。
当涉及到结果的视觉表示时,你可以使用某种瀑布图,其中z轴表示时间,或者利用我们可以感知到的第四维度,即时间,来创建波浪演化的动画。
我对Python不是很熟悉,所以我只提供一个普通的简单实现。我相信这里的很多人可以对下面的片段进行一些简化和/或优化。我假设头两个代码块中的所有内容都是可用的,因此必须只在当前的最后一个块中进行更改。
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 ithttps://stackoverflow.com/questions/71654062
复制相似问题