Python 在给定径向距离的球坐标中绘图?

Python 在给定径向距离的球坐标中绘图?,python,matplotlib,linear-algebra,Python,Matplotlib,Linear Algebra,对于家庭作业问题,我们被要求 编写一个程序,计算矩阵a的所有特征值,使用瑞利商迭代找到每个特征值 一,。报告您对每个特征值的初始猜测。将n迭代时的误差与每个特征值的n+1迭代时的误差进行对比(在log中) 二,。计算在单位球体离散化上采样的x的瑞利商(使用球坐标)。绘制结果,例如使用网格(Θ,Θ,r(Θ,Θ))。解释临界点的数量和位置 我已经完成了问题的第一部分,但我不确定我是否理解如何完成第二部分。经过一些研究,我发现了用Python绘制球坐标的各种方法(和),这为我提供了一些线索。从这些

对于家庭作业问题,我们被要求


编写一个程序,计算矩阵
a
的所有特征值,使用瑞利商迭代找到每个特征值

一,。报告您对每个特征值的初始猜测。将
n
迭代时的误差与每个特征值的
n+1
迭代时的误差进行对比(在log中)

二,。计算在单位球体离散化上采样的
x
的瑞利商(使用球坐标)。绘制结果,例如使用网格
(Θ,Θ,r(Θ,Θ)
)。解释临界点的数量和位置


我已经完成了问题的第一部分,但我不确定我是否理解如何完成第二部分。经过一些研究,我发现了用Python绘制球坐标的各种方法(和),这为我提供了一些线索。从这些链接和其他一些来源借用我的资料

# The matrix for completness
A = np.matrix([[4,3,4], [3,1,3], [4,3,4]])
A = scipy.linalg.hessenberg(A)

num_points = 50
theta, phi = np.linspace(0, 2 * np.pi, num_points), np.linspace(0, np.pi, num_points)
x = np.sin(phi) * np.cos(theta)
y = np.sin(phi) * np.sin(theta)
z = np.cos(phi)

xyz = np.stack((x, y, z), axis=1)
rqs = np.array([np.dot(x, np.dot(A, np.conj(x).T)).item(0) for _,x in enumerate(xyz)])
在第一段代码中,创建
(Θ,Θ)
,并将其转换为笛卡尔坐标,有效地对
R^3
中的单位圆进行了离散化。这允许我创建
x
向量(
xyz
以上),用于计算每个离散点的瑞利商(
rqs
以上),即球坐标的
r(Θ,Θ)

不过,现在我有了径向距离,我不知道如何再次正确地重新创建
x,y,z
,以便
meshgrid
绘制为曲面。这可能超出了StackOverflow和Math.Stack的范畴,但我也不确定这个图最终是“扭曲平面”还是“扭曲球体”

在上面的链接中,我认为答案在于。在代码块中

theta, phi = np.linspace(0, 2 * np.pi, 40), np.linspace(0, np.pi, 40)
THETA, PHI = np.meshgrid(theta, phi)
R = np.cos(PHI**2)
X = R * np.sin(PHI) * np.cos(THETA)
Y = R * np.sin(PHI) * np.sin(THETA)
Z = R * np.cos(PHI)
R
这里我假设是指径向距离,但是,当计算
x,y,z
时,这个
R
在网格中。我曾尝试将上面的
rqs
重塑为相同的维度,但
rqs
的值与后续网格不一致,因此产生了明显错误的绘图

我几乎需要一种方法来将
meshgrid
的创建与
x
的计算联系起来。但直接应用于
网格网格
的计算似乎很复杂

给定径向距离,如何生成基于球坐标的绘图?


编辑:经过进一步搜索,我找到了生成所需绘图的方法,尽管我仍然希望用Python重现这一点。我想说,这段MatLab代码概述了如何在Python中实现这一点,但它似乎是一些非常古老和深奥的代码。这是它生成的图


我不知道数学或瑞利商,但从我收集的数据来看,你想要计算作为单位球体点函数的
rqs
。为此,我建议使用
meshgrid
为所有
Θ
Θ
生成值对。然后,因为你的矩阵公式是为笛卡尔坐标系而不是球坐标系定义的,所以我会将我的网格转换成笛卡尔坐标系并插入到公式中

最后,可以使用单位球体上的
plot_surface
对结果进行说明,其中(缩放的)
RQS
数据用于
facecolor

import numpy as np
import scipy.linalg
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt

# The matrix for completness
A = np.matrix([[4,3,4], [3,1,3], [4,3,4]])
A = scipy.linalg.hessenberg(A)

num_points = 25
theta = np.linspace(0, 2 * np.pi, num_points)
phi = np.linspace(0, np.pi, num_points)

THETA, PHI = np.meshgrid(theta, phi)

X = np.sin(PHI) * np.cos(THETA)
Y = np.sin(PHI) * np.sin(THETA)
Z = np.cos(PHI)

# Calculate RQS for points on unit sphere:
RQS = np.empty(PHI.shape)
for theta_pos, phi_pos in itertools.product(range(num_points), range(num_points)):
    x = np.array([X[theta_pos, phi_pos],
                  Y[theta_pos, phi_pos],
                  Z[theta_pos, phi_pos]])
    RQS[theta_pos, phi_pos] = np.dot(x, np.dot(A, np.conj(x).T))

# normalize in range 0..1
maxRQS = abs(RQS).max()
N = (RQS+maxRQS)/(2*maxRQS)

fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(
    X, Y, Z, rstride=1, cstride=1,
    facecolors=cm.jet(N),
    linewidth=0, antialiased=False, shade=False)
plt.show()
这给出了以下结果,这似乎与OP中的Matlab等高线图一致


请注意,可能有更好的方法(矢量化)将
X
Y
Z
网格转换为矢量,但主要的执行时间似乎在绘图过程中,因此我不会花时间试图弄清楚具体的方式。

您要绘制的是什么计数?它是半径作为角度的函数吗?轮廓是矩阵的瑞利商的轮廓
(M,x)=x*mx/x*x
()。它是矩阵和向量的函数。其中,向量是角度的函数;也就是说,向量是
R^3
中单位球体的离散化。因此函数应该看起来像
r(M,x(Θ,Θ))=x(Θ,Θ)*mx(Θ,Θ)/x(Θ,Θ)*x(Θ,Θ)
。因此,在上述代码中,
x(Θ,Θ)=xyz
r(M,x(Θ,Θ))=rqs
。问题是,我不知道如何将
rqs
与角度的创建及其随后到笛卡尔坐标的转换结合起来。但是
r
是一个标量值,是
Θ
Θ
的函数,而
M
可以被视为常数(在此特定计算中)?是
r
将计算为标量(瑞利商是单个标量值)。我想这就是我不确定的地方,也许需要一些数学知识。在这里叠加。从我的理解来看,我基本上需要绘制一个单位球体,作为一个曲面图,在球体上的每个点上都有一个标量值。可以说是一个“扭曲的球体”
r
(well
rps
)表示单位球体上每个点与原点的距离。实际上。。它应该绘制一个单位球体,但作为热图。单位球体上给定点的更强烈颜色应表示更大的
r
。实际上,我刚刚找到了创建所需绘图的MatLab代码()。我将上传一个图像在OP。