使用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
相关产品推荐
相关产品推荐

