首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Sympy分段Python中的类型错误:无法确定关系的真值

Sympy分段Python中的类型错误:无法确定关系的真值
EN

Stack Overflow用户
提问于 2022-11-05 07:46:53
回答 2查看 33关注 0票数 0

我试图在一个区间中创建线性函数,而另一个区间是0。并将其添加到数组中。

所以我尝试了这段代码

代码语言:javascript
代码运行次数:0
运行
复制
import numpy as np
import sympy as sp
import matplotlib as plt  # This is all the library's i need
import mpmath
x = sp.symbols('x')
n = 10
xx = (np.array([np.linspace(0, 1, n+1)]))
i = 0
N = []
N[0] = sp.Piecewise( ((xx[0, i + 1] - x) / (xx[0, i + 1] - xx[0, i]), xx[0, i] <= x),
                     ((xx[0, i + 1] - x) / (xx[0, i + 1] - xx[0, i]), x <= xx[0, i + 1]),
                     (0, True)
)

它总是会回来

代码语言:javascript
代码运行次数:0
运行
复制
 line 511, in __bool__
    raise TypeError("cannot determine truth value of Relational")
TypeError: cannot determine truth value of Relational

编辑:在我把x加到符号上后,我尝试在循环中的区间中生成一个线性函数向量,我不知道它为什么拒绝确定真值,即使在上面的行中很难确定它成功的原因:

代码语言:javascript
代码运行次数:0
运行
复制
import sympy as sp
import matplotlib as plt  # This is all the library's i need
import mpmath
x = sp.symbols('x', positive=True)
n = 10
xx = (np.array([np.linspace(0, 1, n+1)]))
i = 0
N = []
a = sp.Piecewise(
              ((xx[0, i + 1] - x) / (xx[0, i + 1] - xx[0, i]), (xx[0, i]) <= x),
              ((xx[0, i + 1] - x) / (xx[0, i + 1] - xx[0, i]), (x <= (xx[0, i + 1]))),
              (0, True)
)
N.append(a)
for i in range(1, n):
    a = sp.Piecewise(
        (0, x < xx[0, i - 1]),
        ((xx[0, i - 1] - x) / (xx[0, i - 1] - xx[0, i]), ((xx[0, i - 1]) <= x)),
        ((xx[0, i - 1] - x) / (xx[0, i - 1] - xx[0, i]), (x <= (xx[0, i]))),
        ((xx[0, i + 1] - x) / (xx[0, i + 1] - xx[0, i]), ((xx[0, i]) <= x)),
        ((xx[0, i + 1] - x) / (xx[0, i + 1] - xx[0, i]), (x <= (xx[0, i + 1]))),
        (0, True)
    )
    N.append(a)

我也犯了同样的错误:

文件"",第23行,文件"pythonProjectFEANew\venv\lib\site-packages\sympy\core\relational.py",第511行,bool TypeError(“无法确定关系的真值”) TypeError:无法确定关系的真值

代码语言:javascript
代码运行次数:0
运行
复制
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-05 12:41:13

这是numpy float64中的一个bug:

代码语言:javascript
代码运行次数:0
运行
复制
In [48]: xx[0,1]
Out[48]: 0.1

In [49]: type(xx[0,1])
Out[49]: numpy.float64

In [50]: xx[0,1] < x
---------------------------------------------------------------------------
TypeError

sympy/core/relational.py in __bool__(self)
    509 
    510     def __bool__(self):
--> 511         raise TypeError("cannot determine truth value of Relational")
    512 
    513     def _eval_as_set(self):

TypeError: cannot determine truth value of Relational

错误来自同情,但这是因为numpy.float64.__lt__出于某种原因调用了x.__gt__返回的不等式的bool。如果您扭转了不等式的方向,或者将numpy.float64转换为普通的Python float,那么它将运行得很好:

代码语言:javascript
代码运行次数:0
运行
复制
In [51]: x > xx[0,1]
Out[51]: x > 0.1

In [52]: float(xx[0,1]) < x
Out[52]: x > 0.1

问题是,numpy.float64.__lt__应该在某个地方返回NotImplemented,但是却做了一些奇怪的事情。

票数 0
EN

Stack Overflow用户

发布于 2022-11-05 08:08:07

我相信那是个窃听器。

您可以通过首先将数值转换为Float来解决这个问题,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
sp.Piecewise(
    ((xx[0, i + 1] - x) / (xx[0, i + 1] - xx[0, i]), sp.Float(xx[0, i]) <= x),
    ((xx[0, i + 1] - x) / (xx[0, i + 1] - xx[0, i]), x <= xx[0, i + 1]),
    (0, True)
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74326008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档