python-3.x - 用python 3求解一个包含绝对值的方程
问题描述
我正在尝试使用 python 3.6.3 解决以下等式:
我做了
from sympy import *
x = Symbol('x', real=True)
solve(abs((abs(x**2-1)-x))-x)
但我收到以下消息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python36-32\lib\site-packages\sympy\solvers\solvers.py", line 1065, i
n solve
solution = _solve(f[0], *symbols, **flags)
File "C:\Python36-32\lib\site-packages\sympy\solvers\solvers.py", line 1366, i
n _solve
candidates = _solve(piecewise_fold(expr), symbol, **flags)
File "C:\Python36-32\lib\site-packages\sympy\solvers\solvers.py", line 1634, i
n _solve
raise NotImplementedError('\n'.join([msg, not_impl_msg % f]))
NotImplementedError: multiple generators [x, Abs(-x**2 + x + 1)]
No algorithms are implemented to solve equation -x + Abs(-x**2 + x + 1)
但是使用 python 2.7.14 和 matlab 我得到了答案。我错过了什么吗?
解决方案
[1, -1 + sqrt(2), 1 + sqrt(2)]
如果您使用当前主控并手动将表达式重写为分段,这将给出。显然,重写solve
本身是不完整的:
>>> solve((abs((abs(x**2-1)-x))-x).rewrite(Piecewise))
[1, -1 + sqrt(2), 1 + sqrt(2)]
SymPy 代码库可以使用以下差异进行更改以纠正问题:
diff --git a/sympy/solvers/solvers.py b/sympy/solvers/solvers.py
index 172d504..96bfa94 100644
--- a/sympy/solvers/solvers.py
+++ b/sympy/solvers/solvers.py
@@ -1020,8 +1020,13 @@ def _sympified_list(w):
# Abs
fi = fi.replace(Abs, lambda arg:
separatevars(Abs(arg)) if arg.has(*symbols) else Abs(arg))
- fi = fi.replace(Abs, lambda arg:
- Abs(arg).rewrite(Piecewise) if arg.has(*symbols) else Abs(arg))
+ while True:
+ was = fi
+ fi = fi.replace(Abs, lambda arg:
+ (Abs(arg).rewrite(Piecewise) if arg.has(*symbols)
+ else Abs(arg)))
+ if was == fi:
+ break
for e in fi.find(Abs):
if e.has(*symbols):
推荐阅读
- javascript - 如何从 div[html+jquery] 中获取文本
- c++ - 如何在透视图中绘制文本
- c - 为什么 printf("value: %f",10/2); 输出 0.000000?
- machine-learning - 如何修复“ValueError:发现样本数量不一致的输入变量:[32979, 21602]”?
- vba - ThisDocument 对象引用
- amazon-web-services - 如何从 Azure DevOps 部署到 AWS Kubernetes
- debugging - Code lite 中的调试器会立即打开和关闭
- bash - 仅在找到时打印文件名
- python - 如何使用递归实现快速排序
- java - 使用 HtmlUnit 2.35.0 进行网页抓取