python nsolve / solve三重方程

时间:2017-01-17 01:57:58

标签: python sympy

当我尝试使用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)

谢谢!

4 个答案:

答案 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个猜测)