通过映射到笛卡尔坐标中的Matplotlib中的极坐标图

时间:2019-12-24 18:59:36

标签: python-3.x matplotlib plot scipy bessel-functions

我有一个变量(P),它是角度(θ)的函数:

enter image description here

在此等式中, K 是一个常数, theta_p 等于零,而 I 是第一类经过修改的贝塞尔函数(订单0),其定义为:

enter image description here

现在,我想针对常数 K 的不同值绘制 P θ。首先,我计算了参数 I ,然后将其插入第一个方程,以计算不同角度theta的P。我通过将其映射到笛卡尔坐标中:

x = P * cos(theta)

y = P * sin(theta)

当常数k = 2.0时,这是我使用matplotlib和scipy的python实现:

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad

def integrand(x, a, k):
   return a*np.exp(k*np.cos(x))

theta = (np.arange(0, 362, 2))
theta_p = 0.0

X = []
Y = []

for i in range(len(theta)):
    a = (1 / np.pi)
    k = 2.0
    Bessel = quad(integrand, 0, np.pi, args=(a, k))
    I = list(Bessel)[0]
    P = (1 / (np.pi * I)) * np.exp(k * np.cos(2 * (theta[i]*np.pi/180. - theta_p)))
    x = P*np.cos(theta[i]*np.pi/180.)
    y = P*np.sin(theta[i]*np.pi/180.)
    X.append(x)
    Y.append(y)

plt.plot(X,Y,  linestyle='-', linewidth=3, color='red')
axes = plt.gca()
plt.show()

对于不同的K值,我应该得到一组如下图的图形: enter image description here

(请注意,分布是在单位1的圆上绘制的,以便于观察)

但是,以上代码生成的图形似乎与上图不同。 知道上述实现有什么问题吗?  在此先感谢您的帮助。

这是它的样子(对于k = 2): enter image description here

这些公式的参考是公式5和6,您可以找到here

1 个答案:

答案 0 :(得分:1)

您的公式有误。

您的公式会在单位圆上方给出函数的 delta 。因此,在函数中获取所需的绘图,只需向其添加1。

这就是您想要的,带有一些经过整理的python。 ...请注意,您可以将N个“ P”值作为numpy向量行进行整个计算,而无需遍历所有指标。 ...您也可以直接在matplotlib中做极坐标图-无需将其转换为笛卡尔坐标。

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad

theta = np.arange(0, 2*np.pi+0.1, 2*np.pi/100)

def integrand(x, a, k):
   return a*np.exp(k*np.cos(x))

for k in np.arange(0, 5, 0.5):
    a = (1 / np.pi)
    Bessel = quad(integrand, 0, np.pi, args=(a, k))
    I = Bessel[0]    
    P = 1 + (1/(np.pi * I)) * np.exp(k * np.cos(2 * theta))
    plt.polar(theta, P)

plt.show()

Polar plot