Sympy - 返回真实解

问题描述 投票:0回答:1

我正在使用 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: 未找到有效子集

python sympy
1个回答
0
投票

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 的任何值都将指示存在问题。

© www.soinside.com 2019 - 2024. All rights reserved.