当我尝试使用python3中的以下代码解决三个方程组的系统时,我一直遇到错误:
import sympy
from sympy import Symbol, solve, nsolve
x = Symbol('x')
y = Symbol('y')
z = Symbol('z')
eq1 = x - y + 3
eq2 = x + y
eq3 = z - y
print(nsolve( (eq1, eq2, eq3), (x,y,z), (-50,50)))
以下是错误消息:
追踪(最近一次通话): 文件 " /usr/lib/python3/dist-packages/mpmath/calculus/optimization.py" ;, line 928,在findroot fx = f(* x0) TypeError :()缺少1个必需的位置参数: ' _Dummy_15'
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):文件"",第1行,in 文件"",第12行,在文件中 " /usr/lib/python3/dist-packages/sympy/solvers/solvers.py" ;,第2498行, 在nsolve中 x = findroot(f,x0,J = J,** kwargs) 文件 " /usr/lib/python3/dist-packages/mpmath/calculus/optimization.py" ;, line 931,在findroot fx = f(x0 [0]) TypeError :()缺少2个必需的位置参数: ' _Dummy_14'和' _Dummy_15'
奇怪的是,如果我只解决前两个等式---通过将代码的最后一行更改为
,错误消息就消失了print(nsolve( (eq1, eq2), (x,y), (-50,50)))
输出:
exec(open('bug444.py').read())
[-1.5]
[ 1.5]
我感到困惑;非常感谢你的帮助!
其他一些信息:
我在ubuntu 14.04上使用python3.4.0 + sympy 0.7.6-3。我在python2中遇到了同样的错误
我可以使用
解决这个问题求解([eq1,eq2,eq3],[x,y,z])
但这个系统只是一个玩具的例子;在实际应用中,系统是非线性的,我需要更高的精度,我不知道如何调整求解的精度,而对于nsolve,我可以使用nsolve(... , prec=100)
谢谢!
答案 0 :(得分:2)
在您的打印声明中,您错过了对z
print(nsolve((eq1, eq2, eq3), (x,y,z), (-50,50)))
试试这个(在大多数情况下,使用1进行所有猜测都很好):
print(nsolve((eq1, eq2, eq3), (x,y,z), (1,1,1)))
<强>输出:强>
[-1.5]
[ 1.5]
[ 1.5]
答案 1 :(得分:1)
如果您使用linsolve
:
>>> from sympy import linsolve
>>> print(linsolve((eq1, eq2, eq3), x,y,z))
{(-3/2, 3/2, 3/2)}
然后您可以将nonlinsolve
用于非线性问题集。
答案 2 :(得分:1)
问题是变量的数量应该等于猜测向量的数量,
<input>
如果您在多维问题上使用数值求解器,它想从某个地方开始并按照渐变来解决问题。 猜测向量是你开始的地方。 如果空间中存在多个局部最小值/最大值,则不同的猜测矢量可能导致不同的输出。 或者一个不幸的猜测向量可能根本不会收敛。 对于一维问题,猜测向量仅为x0。 对于大多数功能,您可以轻松记录,几乎任何矢量都将汇聚到一个全局解决方案。
所以(1,1,1)这里的猜测矢量和(-50,50,50)一样好 只是为了程序而不留空位
答案 3 :(得分:0)
您的代码应为:
nsolve([eq1, eq2, eq3], [x,y,z], [1,1,1])
您的代码是:
nsolve([eq1, eq2, eq3], [x,y,z], [1,1])
您在最后一个参数中错了一个猜测值。
要点是:如果您要求解n
个未知术语,则需要为每个未知术语提供一个猜测(最后一个参数中的n
个猜测)