我正在使用 GeoSolver 包来解决 3D 约束。链接到 GeoSolver - PyPI。 当我解决并行约束时,我得到一个复杂的解决方案,而存在一个真实的解决方案。 是否有可能只得到真实的解决方案?
代码:
result = sp.solve(AllEquestions, AllVariables)
其中所有问题=
['x1- 0', 'y1- 0', 'z1- 0', ((-x1 + x2)*(-x3 + x4) + (-y1 + y2)*(-y3 + y4) + (-z1 + z2)*(-z3 + z4))**2/(((x1 - x2)**2 + (y1 - y2)**2 + (z1 - z2)**2)**1.0*((x3 - x4)**2 + (y3 - y4)**2 + (z3 - z4)**2)**1.0) - 1, 'x2- 100', 'y2- 25', 'z2- 0', ((-x1 + x2)*(-x3 + x4) + (-y1 + y2)*(-y3 + y4) + (-z1 + z2)*(-z3 + z4))**2/(((x1 - x2)**2 + (y1 - y2)**2 + (z1 - z2)**2)**1.0*((x3 - x4)**2 + (y3 - y4)**2 + (z3 - z4)**2)**1.0) - 1, 'x3- 10', 'y3- 10', 'z3- 0', ((-x1 + x2)*(-x3 + x4) + (-y1 + y2)*(-y3 + y4) + (-z1 + z2)*(-z3 + z4))**2/(((x1 - x2)**2 + (y1 - y2)**2 + (z1 - z2)**2)**1.0*((x3 - x4)**2 + (y3 - y4)**2 + (z3 - z4)**2)**1.0) - 1, 'x4- 35', ((-x1 + x2)*(-x3 + x4) + (-y1 + y2)*(-y3 + y4) + (-z1 + z2)*(-z3 + z4))**2/(((x1 - x2)**2 + (y1 - y2)**2 + (z1 - z2)**2)**1.0*((x3 - x4)**2 + (y3 - y4)**2 + (z3 - z4)**2)**1.0) - 1]
和所有变量=
[x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4]
返回:
[(0.0, 0.0, 0.0, 100.000000000000, 25.0000000000000, 0.0, 10.0000000000000, 10.0000000000000, 0.0, 35.0000000000000, -1.03077640640442*I*z4 + 16.25, z4), (0.0, 0.0, 0.0, 100.000000000000, 25.0000000000000, 0.0, 10.0000000000000, 10.0000000000000, 0.0, 35.0000000000000, 1.03077640640442*I*z4 + 16.25, z4)]
应该返回:
[(0.0, 0.0, 0.0, 100.000000000000, 25.0000000000000, 0.0, 10.0000000000000, 10.0000000000000, 0.0, 35.0000000000000, 16.2500000000000, 0.0)]
我的观点定义如下:
self.x = sp.Symbol('x' + str(self.local_var))
其中 local_var 只是一个数字
当我在我的观点上设置标志 real=True 时
self.x = sp.Symbol('x' + str(self.local_var), real=True)
我收到以下错误:
文件“C:\Users\Achaibou Karim\AppData\Roaming\FreeCAD\Macro po ube\GeoSolver\solver.py", 第 25 行,求解 结果 = sp.solve(AllEquestions, AllVariables) 文件 "c:\Program Files\FreeCAD 0.21 in\lib\site-packages\sympy\solvers\solvers.py", 第 1172 行,解决 线性,解 = _solve_system(f, 符号, **flags) 文件 "c:\Program Files\FreeCAD 0.21 in\lib\site-packages\sympy\solvers\solvers.py",第 1896 行,在 _solve_system 中 raise NotImplementedError('未找到有效子集') NotImplementedError: 未找到有效子集
SymPy 无法推理出
z4*I
是真实的(尽管看起来应该如此):
>>> from sympy import *
>>> z4 = Symbol('z4', real=True)
>>> (z4*I).is_real
>>>
该值为“无”。如果使用
zero=False
的假设,则返回乘积为 None(然后没有解,而不是无法确定的假想解):
>>> y4 = Symbol('y4', real=True)
>>> 16*y4**2 - 520*y4 + 17*z4**2 + 4225
>>> solve(_)
[]
除了修复
Mul.is_real
的假设例程之外,我想不出简单的解决方法。像这样的东西
def is_real(e):
from sympy.utilities.iterables import sift
if e.is_real:
return True
if e.is_real is False:
return False
if isinstance(e, Add):
real = sift(e.args, lambda x: is_real(x))
if len(real[False]) == 1 and not real[None]:
return False
elif len(real[False])>1:
return None
elif not real[None]:
return True
return
if isinstance(e, Mul):
real = sift(e.args, lambda x: is_real(x))
if real[None]:
return
return not bool(len(real[False])%2)
if isinstance(e, Pow):
if e.exp.is_even:
return is_real(e.base)
if e.exp.is_odd:
b = is_real(e.base)
if b:
return True
if b is False:
return False
return e.is_real
但这对解决你手头的问题没有帮助。但这将为您提供一种自动检测问题案例的方法,因为如果您要求真正的解决方案,则解决方案字典中从
is_real
返回 False 的任何值都将指示存在问题。