帮助向量化计算,其中向量乘法需要创建一个额外的维度

计算科学 麻木的 矢量化
2021-12-03 15:26:43

我想使用矢量化计算(使用 python 和 numpy)来做一些涉及贝塞尔函数的计算。

通常情况下,我需要计算(无限)不同阶的贝塞尔函数的总和。我需要为整个向量场这样做,并且想使用向量化计算。实际上,贝塞尔阶数和场的维度都可以方便地进行矢量化,但它们相交。这是该问题的最小化演示:

import numpy as np
from scipy.special import kn, iv

order = 20
size = 200

r = np.arange(-size, size, 1.0)
theta = np.arange(0, 2 * np.pi, 2 * np.pi / size)
z = np.arange(0, 1, 1 / size)

R, T, Z = np.meshgrid(r, theta, z)

m = np.arange(order)

eta = m * R
bessel_term = iv(m, eta) * kn(m, eta)

print(sum(bessel_term))

这里需要发生的是,对于 R 的每个值,需要计算具有阶向量的贝塞尔函数。可以这么说,它需要在向量中创建一个额外的维度。

相反,我收到以下错误消息,我理解,但想避免:

Traceback (most recent call last):
    eta = m * R 
ValueError: operands could not be broadcast together with shapes (20,) (200,400,200) 

我怎样才能做到这一点?一种方法是手动迭代空间维度(未矢量化)并将矢量化用于计算贝塞尔函数总和的内部循环。但对我来说,如果有一种方法可以向 numpy 表明此时需要在所涉及的向量中增加一个维度,并在计算无限和时再次折叠这个维度,那将是更可取的。

背景,数学:

实际上,我想在我的网格空间的每个点中计算一个具有三个矢量分量的磁场。在每一点我都需要计算无穷阶的贝塞尔函数的无穷和:

Br=j3μ0I14πrm=...5,2,1,4,7...2mIm(ηm)Km(ηmra)+2πrmqp[Im1(ηm)Km1(ηmra)+Im+1(ηm)Km+1(ηmra)]exp[jm(θ2πz/p)]

r,zθ作为输入参数(空间坐标),a,p,q作为常量参数和ηm=|mq|作为缩写。

0个回答
没有发现任何回复~