0

首先,是的,我已经阅读了有关此问题的先前线程和文档,例如How to make a quiver plot in polar coordinates。这对我没有帮助。让我向您展示我正在使用的内容,然后是一些代码。在此处输入图像描述 这是一个会聚的运河,它显示了一个速度/矢量场。显然我只有一个径向分量,但它会随着角度 theta 而变化。当我们向下(流)向 alpha 时,这种箭头模式会重复。所以它应该很容易绘制,对吧。这是径向速度分量的方程:

在此处输入图像描述 现在,在我展示我的代码之前,我已经为多个 theta 存储了 f(theta) 的值。这个函数 f 必须进行数值求解,我将其存储为向量 u[0]。这就是我现在在我的代码中所做的:

radii = np.linspace(0.1,1,11)
thetas = np.linspace(-alpha,alpha,20)
theta, r = np.meshgrid(thetas, radii)

q = 0.0001


dr = [-q/x for x in radii]*u_sol[0]
dt = 0

f = plt.figure()
ax = f.add_subplot(111, polar=True)

ax.quiver(theta, r, dr * cos(theta) - dt * sin (theta), dr * sin(theta) +     
dt* cos(theta))

变量 dr 的第五个表达式是拼命尝试将网格网格中所有固定长度的 r 与 u[0] 相乘,但它们的维度不同,因此它不起作用。所以我被困住了。

我的问题是如何获得汇流管的矢量场?我真的不能把最后的部分放在一起,我要操纵网格吗?

迄今为止在 MATLAB 中的结果: 在此处输入图像描述

编辑上面的代码取自我文本开头的链接。我对 dr 和 dt 做了一些修改,除此之外什么都没有。

4

1 回答 1

2

您的代码唯一真正的问题是numpy问题,即您dr的尺寸错误。对您的代码稍作调整:

from matplotlib import pyplot as plt
import numpy as np

#to make the code runnable
u_sol = [1]
alpha0 = 5*np.pi/180
alpha = 10*np.pi/180

radii = np.linspace(0.2,1,10)
print(radii)
thetas = np.linspace(alpha0-alpha,alpha0+alpha,20)
print(thetas)
theta, r = np.meshgrid(thetas, radii)

q = 0.0001


#dr = [-q/x for x in radii]*u_sol[0]
dr = -q/r
dt = 0

f = plt.figure()
ax = f.add_subplot(111, polar=True)

ax.quiver(
    theta, r,
    dr * np.cos(theta) - dt * np.sin(theta),
    dr * np.sin(theta) + dt * np.cos(theta),
)

plt.show()

我得到以下图像:

上述代码的结果

请注意,在radii定义中,我将下限从 0.1 移到了 0.2,否则箭头会变得太长,以至于它们指向原点的另一侧,这看起来很奇怪。

于 2018-12-05T12:21:43.743 回答