如何在Python中从一组线性方程组绘制平面?

如何在Python中从一组线性方程组绘制平面?,python,matplotlib,linear-algebra,Python,Matplotlib,Linear Algebra,我有一个线性系统,有三个方程: x1-2x2+x3=02x2 -8x3=8 -4x1+5x2+9x3=-9 解集是(29,16,3),它是这些平面相交处的一个点 希望有人能使用Matplotlib在3D空间中绘制这些平面,以清晰地可视化问题。你的第三个等式是: -4x+5y+9z-9=0 或者一般来说,你的方程式是 a x+b y+c z+d=0 正常值为(a、b、c) 如果a不是0,则平面上的点是(-d/a,0,0) 如果b不是0,则平面上的点是(0,-d/b,0) 如果c不是0,平面上的点

我有一个线性系统,有三个方程:

x1-2x2+x3=0
2x2 -8x3=8
-4x1+5x2+9x3=-9

解集是(29,16,3),它是这些平面相交处的一个点


希望有人能使用Matplotlib在3D空间中绘制这些平面,以清晰地可视化问题。

你的第三个等式是:

-4x+5y+9z-9=0

或者一般来说,你的方程式是

a x+b y+c z+d=0

正常值为(a、b、c)

  • 如果a不是0,则平面上的点是(-d/a,0,0)
  • 如果b不是0,则平面上的点是(0,-d/b,0)
  • 如果c不是0,平面上的点是(0,0,-d/c)
将其插入到绘制库中,该库获取平面上的法向量和点,并执行3次(每个平面一次)


实际上,我有一个关于如何从法线和向量绘制一个平面的方法,但没有关于如何使用matplotlib从方程绘制平面的方法。@blueMix:为什么不把代码发布到从平面上的法线向量加上点绘制,我们将教你如何将方程转换成这种格式。@carlosdc它是[这里](),请看第二个答案。@Jack\u of theu All\u Trades,老实说,我什么都没试过,我对Python matplotlib和线性代数都是新手,需要您的“转换”@carlosdc。但我发现这些平面的显示并不是“安静地”真实的,因为当你旋转视图时,总有一个平面从未被另一个平面相交或隐藏;可能是matplotlib中有错误,或者代码不够。无论如何,我学到了一些好东西。@blueMix@tcaswell好的,谢谢,我在显示平面时添加了alpha,这稍微解决了问题,因为老实说,我找到了三个平面之间的角度并阅读了你的代码,但不知道如何将其更改为三个平面之间有不同角度。重点是,matplotlib一次渲染每个艺术家,然后将其分层到最终图像中。它不会为你做交叉路口。如果你真的想这样做,你必须用手把飞机分成“上面”和“下面”两部分。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

point1  = np.array([0,0,0])
normal1 = np.array([1,-2,1])

point2  = np.array([0,-4,0])
normal2 = np.array([0,2,-8])

point3  = np.array([0,0,1])
normal3 = np.array([-4,5,9])

# a plane is a*x+b*y+c*z+d=0
# [a,b,c] is the normal. Thus, we have to calculate
# d and we're set
d1 = -np.sum(point1*normal1)# dot product
d2 = -np.sum(point2*normal2)# dot product
d3 = -np.sum(point3*normal3)# dot product

# create x,y
xx, yy = np.meshgrid(range(30), range(30))

# calculate corresponding z
z1 = (-normal1[0]*xx - normal1[1]*yy - d1)*1./normal1[2]
z2 = (-normal2[0]*xx - normal2[1]*yy - d2)*1./normal2[2]
z3 = (-normal3[0]*xx - normal3[1]*yy - d3)*1./normal3[2]

# plot the surface
plt3d = plt.figure().gca(projection='3d')
plt3d.plot_surface(xx,yy,z1, color='blue')
plt3d.plot_surface(xx,yy,z2, color='yellow')
plt3d.plot_surface(xx,yy,z3, color='cyan')
plt.show()