2

私の目標は、2D で球体の密度ヒート マップ プロットを作成することです。長方形のドメインを使用すると、線の下のプロット コードが機能します。ただし、循環ドメインのコードを使用しようとしています。球の半径は 1 です。これまでのコードは次のとおりです。

from pylab import *
import numpy as np
from matplotlib.colors import LightSource
from numpy.polynomial.legendre import leggauss, legval

xi = 0.0
xf = 1.0
numx = 500

yi = 0.0
yf = 1.0
numy = 500


def f(x):
    if 0 <= x <= 1:
        return 100
    if -1 <= x <= 0:
        return 0


deg = 1000
xx, w = leggauss(deg)
L = np.polynomial.legendre.legval(xx, np.identity(deg))
integral = (L * (f(x) * w)[None,:]).sum(axis = 1)

c = (np.arange(1, 500) + 0.5) * integral[1:500]


def r(x, y):
    return np.sqrt(x ** 2 + y ** 2)


theta = np.arctan2(y, x)
x, y = np.linspace(0, 1, 500000)


def T(x, y):
    return (sum(r(x, y) ** l * c[:,None] *
                np.polynomial.legendre.legval(xx, identity(deg)) for l in range(1, 500)))

T(x, y)係数の合計にcの関数としての半径を乗じたものに等しい必要がxあり、引数が凡例多項式の である場合、凡例多項式ylべき乗に等しい必要がありcos(theta)ます。

Python: 区分関数の統合 で、ルジャンドル多項式を加算に使用する方法を学びましたが、その方法は少し異なり、プロットには関数が必要ですT(x, y)


これはプロットコードです。

densityinterpolation = 'bilinear'
densitycolormap = cm.jet
densityshadedflag = False
densitybarflag = True
gridflag = True
plotfilename = 'laplacesphere.eps'

x = arange(xi, xf, (xf - xi) / (numx - 1))
y = arange(yi, yf, (yf - yi) / (numy - 1))
X, Y = meshgrid(x, y)
z = T(X, Y)


if densityshadedflag:
    ls = LightSource(azdeg = 120, altdeg = 65)
    rgb = ls.shade(z, densitycolormap)
    im = imshow(rgb, extent = [xi, xf, yi, yf], cmap = densitycolormap)
else:
    im = imshow(z, extent = [xi, xf, yi, yf], cmap = densitycolormap)
im.set_interpolation(densityinterpolation)
if densitybarflag:
    colorbar(im)


grid(gridflag)

show()

最終目標が何であるかを参照するために Mathematica でプロットを作成しました ここに画像の説明を入力

4

1 に答える 1