此Symphy代码的工作方式与我预期的一样:

>>> x = sp.Symbol("x")
>>> y = sp.Symbol("y")
>>> z = sp.Symbol("z")
>>> (x+y+z).evalf(subs={"x":1, "y":2, "z":3})
6.0

但是,如果我使用实值符号,则表达式不会简化:

>>> x = sp.Symbol("x", real=True)
>>> y = sp.Symbol("y", real=True)
>>> z = sp.Symbol("z", real=True)
>>> (x+y+z).evalf(subs={"x":1, "y":2, "z":3})
x + y + z

我无法通过搜索像sympy symbol real evalf这样的关键字找到对此的解释-我只得到了不相关的结果.

为什么在第二种情况下表达式没有简化?如何用in值替换实值符号并计算表达式?

推荐答案

使用符号作为替换字典的键,而不是字符串名称:

>>> (x + y + z).evalf(subs={x: 1, y: 2, z: 3})
6.00000000000000

复杂符号和真实符号的处理方式似乎不一致:

>>> x = sp.Symbol('x')
>>> x.subs(x, 1)
1
>>> x.subs('x', 1)
1
>>> x = sp.Symbol('x', real=True)
>>> x.subs(x, 1)
1
>>> x.subs('x', 1)
x

我在文档中找不到任何与此相关的内容,而且内置的帮助文本也没有用处.我最好的猜测是,字符串'x'使用sp.Symbol进行简单转换,得到的符号始终是复数符号,与同名实值符号不匹配.

我会将这种行为视为一个bug,并提交bug报告(或查找现有报告).依我看,如果一个字符串是可用的,它应该匹配任何符号与该名称;一个表达式不应该包含两个同名、不同类型的不同变量;try 用匹配的名称和不兼容的类型替换变量可能会引发异常:

>>> x = sp.Symbol('x')
>>> # why allow this?
>>> broken = sp.Symbol('x', real=True) + x
>>> broken # if the types matched, it would simplify to 2*x
x + x
>>> # surely 2 is the only value that makes sense?
>>> broken.subs('x', 1)
x + 1
>>> x.subs('x', 1)
1
>>> # If this is allowed at all, surely the result should be 1?
>>> x.subs(sp.Symbol('x', real=True), 1)
x

Python相关问答推荐

自定义新元未更新参数

DuckDB将蜂巢分区插入拼花文件

在上下文管理器中更改异常类型

在Pandas框架中截短至固定数量的列

根据给定日期的状态过滤查询集

分组数据并删除重复数据

列表上值总和最多为K(以O(log n))的最大元素数

比较两个二元组列表,NP.isin

Gekko:Spring-Mass系统的参数识别

如何在给定的条件下使numpy数组的计算速度最快?

梯度下降:简化要素集的运行时间比原始要素集长

如何在表中添加重复的列?

为什么np. exp(1000)给出溢出警告,而np. exp(—100000)没有给出下溢警告?

可以bcrypts AES—256 GCM加密损坏ZIP文件吗?

在pandas数据框中计算相对体积比指标,并添加指标值作为新列

matplotlib + python foor loop

python中csv. Dictreader. fieldname的类型是什么?'

在pandas/python中计数嵌套类别

基于Scipy插值法的三次样条系数

将一个双框爆炸到另一个双框的范围内