【问题标题】:python nsolve/solve triple of equationspython nsolve/求解方程组
【发布时间】:2017-01-17 01:57:57
【问题描述】:

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

这是错误信息:

Traceback(最近一次调用最后一次): 文件 “/usr/lib/python3/dist-packages/mpmath/calculus/optimization.py”,行 928,在 findroot 中 fx = f(*x0) TypeError: () 缺少 1 个必需的位置参数: '_Dummy_15'

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件“”,第 1 行,in 文件“”,第 12 行,在文件中 “/usr/lib/python3/dist-packages/sympy/solvers/solvers.py”,第 2498 行, 在解决 x = findroot(f, x0, J=J, **kwargs) 文件 “/usr/lib/python3/dist-packages/mpmath/calculus/optimization.py”,行 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)

谢谢!

【问题讨论】:

标签: python sympy


【解决方案1】:

在您的打印声明中,您错过了对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]

【讨论】:

    【解决方案2】:

    如果你使用linsolve,你可以丢弃最初的猜测/假人:

    >>> from sympy import linsolve
    >>> print(linsolve((eq1, eq2, eq3), x,y,z))
    {(-3/2, 3/2, 3/2)}
    

    然后您可以将nonlinsolve 用于您的非线性问题集。

    【讨论】:

    • nonlinsolve 仅在系统具有封闭式解决方案时才有效,而通常(通常)并非如此。
    【解决方案3】:

    问题是变量的数量应该等于猜测向量的数量,

    print(nsolve((eq1, eq2, eq3), (x,y,z), (-50,50,50)))

    如果您在多维问题上使用数值求解器,它希望从某个地方开始并遵循梯度求解。 猜测向量是你开始的地方。 如果空间中有多个局部最小值/最大值,则不同的猜测向量会导致不同的输出。 或者不幸的猜测向量可能根本不会收敛。 对于一维问题,猜测向量只是 x0。 对于您可以轻松写下的大多数函数,几乎任何向量都会收敛到一个全局解。

    所以这里的 (1,1,1) 猜测向量和 (-50,50,50) 一样好 只是不要为了程序而留空空间

    【讨论】:

      【解决方案4】:

      你的代码应该是:

      nsolve([eq1, eq2, eq3], [x,y,z], [1,1,1])
      

      你的代码是:

      nsolve([eq1, eq2, eq3], [x,y,z], [1,1])
      

      您在最后一个参数中遗漏了一个猜测值。

      要点是:如果您正在求解 n 未知项,则为每个未知项提供一个猜测(n 在最后一个参数中猜测)

      【讨论】:

        猜你喜欢
        • 2017-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多