You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Matplotlib和Numpy绘制带特征向量的椭圆代码问题排查

椭圆特征向量与主轴不匹配的错误排查

核心错误点及解决方法

  • 非对称矩阵未做对称化处理
    椭圆方程x^T D x = 1中,非对称矩阵D的二次型等效于对称矩阵(D + D.T)/2的二次型,直接用非对称D的特征向量会和主轴方向不符。必须先对非对称矩阵做对称化再计算特征值和特征向量。

  • 特征向量未按主轴长度缩放
    numpy.linalg.eig()返回的特征向量是单位向量,而椭圆半轴长度为1/√λ(λ为特征值)。绘制时需将单位特征向量乘以对应的轴长,否则向量长度和主轴不匹配。

  • 坐标轴比例未设为等比例
    Matplotlib默认坐标轴比例不等,会导致椭圆和向量的视觉角度失真。添加plt.axis('equal')强制等比例显示,才能准确对应理论角度。

  • 特征值与轴长的对应关系搞反
    半长轴对应最小特征值的倒数平方根(λ越小,1/√λ越大),半短轴对应最大特征值的倒数平方根,搞反会导致向量长短和主轴颠倒。

修正后的示例代码

import numpy as np
import matplotlib.pyplot as plt

# 输入正定矩阵(支持对称/非对称)
D = np.array([[1, 3], [1, 4]])
# 非对称矩阵必须先对称化
D_sym = (D + D.T) / 2

# 计算对称矩阵的特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(D_sym)
# 计算主轴长度
axis_lengths = 1 / np.sqrt(eigenvalues)

# 生成椭圆点:通过特征向量矩阵将标准椭圆转换到目标坐标系
theta = np.linspace(0, 2 * np.pi, 100)
ellipse_coords = eigenvectors @ np.diag(axis_lengths) @ np.array([np.cos(theta), np.sin(theta)])

# 绘图
plt.figure(figsize=(6, 6))
plt.plot(ellipse_coords[0], ellipse_coords[1], label='Ellipse')

# 绘制带长度的特征向量(主轴)
for idx in range(2):
    axis_vec = eigenvectors[:, idx] * axis_lengths[idx]
    plt.quiver(0, 0, axis_vec[0], axis_vec[1], angles='xy', scale_units='xy', scale=1, 
               label=f'Axis {idx+1} (λ={eigenvalues[idx]:.2f})')

plt.axis('equal')
plt.legend()
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

内容的提问来源于stack exchange,提问作者jupiter_jazz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:20:09