python - SymPy中的点平面距离
问题描述
我试图在 SymPy 中计算从点 (x_1, y_1, z_1) 到平面 ax+by+cz+d=0 的点平面距离,但我发现结果不正确。以下是我使用的代码
from sympy import *
a, b, c, d = symbols('a b c d')
x1, y1, z1 = symbols('x_1 y_1 z_1')
p1 = Point(x1, y1, z1)
plane1 = Plane(Point(0, 0, -d/c), normal_vector=(a, b, c))
plane1.distance(p1)
正确答案应该是 \frac{ax_1+by_1+cz_1+d}{\sqrt{a^2+b^2+c^2}}
但是 SymPy 给了我 \frac{ax_1+by_1+cz_1+d}{\sqrt{a^2+b^2}}。
解决方案
这对我来说似乎是一个错误。以下是 sympy 计算距离的方式(方法distance(self, o)
):
self = plane1
o = p1
x, y, z = map(Dummy, 'xyz')
k = self.equation(x, y, z)
a, b, c = [k.coeff(i) for i in (x, y, z)]
d = k.xreplace({x: o.args[0], y: o.args[1], z: o.args[2]})
t = abs(d/sqrt(a**2 + b**2 + c**2))
如果我们检查k
并a, b, c
看到方程的系数不正确:
print(k)
print(a, b, c)
# output:
_x*a + _y*b + c*(_z + d/c)
a b 0
c
为零,这解释了你的结果。这可以通过简化方程来解决:
k = simplify(self.equation(x, y, z))
在这种情况下,距离t
与您预期的一样:
print(t)
# output
Abs((a*x_1 + b*y_1 + c*z_1 + d)/sqrt(a**2 + b**2 + c**2))
更新:这已在 SymPy 的当前 master 中修复。请参阅相应的问题。
推荐阅读
- java - 我的代码说小程序没有初始化
- php - 检查字符串中的多个单词并显示找到/未找到的单词
- angular - 在 Angular 中使用 InMemoryDbService 时找不到错误 404 Url
- reactjs - 尽管单击其他选项,但无法更改 React 本机选择器
- python - 如何在QLabel中调整图片的大小?
- react-native - 如何将 Stack.Screen 中的内容垂直居中,包括标题到计算中?
- sql - 使用 SQL 根据查询中的值创建和填充列
- computation-theory - 考虑Alphabet = {0,a},表示语言L = {w ∈ Σ^* : |w|0a = |w|a0} 的自动机是规则的吗?
- javascript - 使用字典映射 API 响应并创建对象数组,尝试删除重复项
- wordpress - 如何使用 WooCommerce 预订来安排面对面的课程?