使用Matplotlib和NumPy绘制一个方程组的图形。

4

我正在尝试学习如何使用matplotlib和numpy为我的某门课程绘制方程组的图像。我们没有得到太多指导,而且我对编程不是很擅长,无法理解如何实现这个目标,尽管我认为这并不是太复杂。基本上,我的方程组如下:

4x -2y + z =11
-2x +4y -2z = -16
x -2y + 4z = 17

我该如何使用matplotlib为这些方程式绘制图形呢?同时,指令还要求使用mplot3d。解决方法请参考此链接:How to draw planes from a set of linear equations in Python?。感谢!

我不清楚你所说的“绘制解决方案”是什么意思。你写下的是一个线性方程组,它可能有零个、一个或无限多个解。这与matplotlib本身无关,而是一个线性代数问题。 - David Zwicker
抱歉,我的意思是绘制方程式而不是解决方案 - 我会编辑。 - Vandexel
如果你想以图形方式完成任务,那么在三维空间中有三条线,所以你需要使用mplot3d来绘制这三条线。然后你就可以看到解集是什么样子的。请查看https://dev59.com/H2445IYBdhLWcg3w7urD以获取一些必要的框架。 - MathBio
2
实际上,每个方程都定义了空间中的一个平面,而不是一条直线。 - Christoph
@DimiMak 请编辑问题。这有助于未来的提问者。您的答案在这里:https://dev59.com/k3jZa4cB1Zd3GeqPZQwL - abalter
你的每个方程都定义了一个平面。当任意两个相交时,你会得到一条直线。如果所有三个相交于一个点,则该点是唯一解。否则,当任意两个相交时,你会得到一条直线,也就是无数个点。如果某种方式下,没有相交(也就是这些平面都是平行的),那么就没有解决方案。感谢@Christoph纠正我。 - abalter
1个回答

6

您可以从前两个方程中消去z,得到x=1和第一二平面的交线z=7+2y,然后再用剩余的方程求解,得到点(1,-2,3)。您可以使用numpy.linalg.solve进行验证:

In [11]: M = np.array([[4., -2., 1.], [-2., 4., -2.], [1., -2., 4.]])

In [12]: b = np.array([11., -16., 17.])

In [13]: np.linalg.solve(M, b)
Out[13]: array([ 1., -2.,  3.])

在Matplotlib中,可以使用plot_surface绘制平面,使用plot绘制第一二个平面的交线(蓝色),并使用标记表示第三个平面(绿色)与交线相交的点。为了使平面透明一些,可以设置alpha=0.5。由于平面是平的,所以不需要使用标记线来铺设表面(可以将行跨度和列跨度设置为较大值)。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x, y = np.linspace(-8,8,100), np.linspace(-8,8,100)
X, Y = np.meshgrid(x,y)
Z1 = 11 - 4*X + 2*Y
Z2 = (16 - 2*X + 4*Y) / 2
Z3 = (17 - X + 2*Y) / 4

ax.plot_surface(X,Y,Z1, alpha=0.5, rstride=100, cstride=100)
ax.plot_surface(X,Y,Z2, alpha=0.5, rstride=100, cstride=100)


ax.plot((1,1),(-8,8),(-9,23), lw=2, c='b')
ax.plot_surface(X,Y,Z3, alpha=0.5, facecolors='g', rstride=100, cstride=100)
ax.plot((1,),(-2,),(3,), lw=2, c='k', marker='o')

plt.show()

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接