当我试图用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",第928行,在findroot = f(*x0) TypeError:()中缺少一个必需的位置参数:'_Dummy_15‘
在处理上述异常的过程中,发生了另一个异常:
追溯(最近一次调用):文件“,第1行,在文件”中“,第12行,在文件"/usr/lib/python3/dist-packages/sympy/solvers/solvers.py",第2498行,在nsolve = findroot(f,x0,J=J,**kwargs)文件"/usr/lib/python3/dist-packages/mpmath/calculus/optimization.py",行931,在findroot = f(x0) TypeError:()中,缺少两个必需的位置参数:“_Dummy_14”和“_Dummy_15”
奇怪的是,如果我只解决前两个方程--通过将代码的最后一行改为
print(nsolve( (eq1, eq2), (x,y), (-50,50)))产出:
exec(open('bug444.py').read())
[-1.5]
[ 1.5]我很困惑,你的帮助是我最感激的!
一些额外的信息:
但是这个系统只是一个玩具例子,在实际应用中,系统是非线性的,我需要更高的精度,我不知道如何调整解决方案的精度,而对于nsolve,我可以使用nsolve(... , prec=100)。
谢谢!
发布于 2017-01-17 02:01:19
在打印语句中,您错过了对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]发布于 2017-01-17 02:05:50
如果使用linsolve,可以放弃最初的猜测/假人。
>>> from sympy import linsolve
>>> print(linsolve((eq1, eq2, eq3), x,y,z))
{(-3/2, 3/2, 3/2)}然后,您可以使用nonlinsolve对您的非线性问题集。
发布于 2017-01-24 22:19:54
问题是变量的数量应该等于猜测向量的数量,
print(nsolve((eq1, eq2, eq3), (x,y,z), (-50,50,50)))
如果你在多维问题上使用数值解,它想要从某个地方开始,并遵循一个梯度到解。猜测向量是你开始的地方。如果空间中存在多个局部极小/极大值,则不同的猜测向量会导致不同的输出。或者一个不幸的猜测向量可能根本不收敛。对于一维问题,猜测向量就是x0。对于大多数函数,您可以轻松地写下,几乎任何向量都将收敛到一个全局解决方案。
所以(1,1,1)猜测向量和(-50,50,50)一样好,只是为了程序而不留下空空间。
https://stackoverflow.com/questions/41687908
复制相似问题