2017-01-17 2 views
2

Я постоянно получаю ошибки, когда я пытался решить систему трех уравнений с помощью следующего кода в Python3:питон nsolve/решить тройные уравнения


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 (most recent call last): File "/usr/lib/python3/dist-packages/mpmath/calculus/optimization.py", line 928, in findroot fx = f(*x0) TypeError:() missing 1 required positional argument: '_Dummy_15'

Во время обработки вышеуказанного исключения, другое исключение произошло:

Traceback (most recent call last): File "", line 1, in File "", line 12, in File "/usr/lib/python3/dist-packages/sympy/solvers/solvers.py", line 2498, in nsolve x = findroot(f, x0, J=J, **kwargs) File "/usr/lib/python3/dist-packages/mpmath/calculus/optimization.py", line 931, in findroot fx = f(x0[0]) TypeError:() missing 2 required positional arguments: '_Dummy_14' and '_Dummy_15'


Странная вещь, сообщение об ошибке исчезнет, ​​если я только решить первые два уравнения --- изменив последнюю строку кода

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

выход:

exec(open('bug444.py').read()) 
[-1.5] 
[ 1.5] 

Я озадачен; ваша помощь очень ценится!

Несколько частей дополнительной информации:

  • Я использую python3.4.0 + SymPy 0.7.6-3 на убунту 14.04. Я получил ту же ошибку в python2

  • я мог бы решить эту систему, используя

    решения ([EQ1, EQ2, EQ3], [х, у, г])

, но эту систему это просто игрушечный пример; в реальных приложениях система нелинейна, и мне нужна более высокая точность, и я не вижу, как настроить точность для решения, тогда как для nsolve я мог бы использовать nsolve(... , prec=100)

СПАСИБО!

+0

https: // GitHub. com/sympy/sympy/issues/12052 – asmeurer

+0

Кстати, вы должны знать, что для установки точности в 'nsolve' требуется версия git для Sympy. – asmeurer

ответ

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

Вы можете отказаться первоначальные догадки/манекены, если вы используете linsolve:

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

И тогда вы можете использовать nonlinsolve для нелинейной задачи набора.

+1

'nonlinsolve' будет работать только в том случае, если система имеет решение с закрытой формой, что часто (обычно) не так. – asmeurer

1

Проблема является число переменных должно быть равно числу Угадайте векторы,

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

Если вы используете числовой решатель на многомерной задаче, он хочет чего-то начинать и следовать градиент к решению. вектор предположения, где вы начинаете. , если в пространстве имеется несколько локальных минимумов/максимумов, разные векторы догадок могут привести к разным выводам. Или неудачный вектор предсказания может вообще не совпадать. Для одномерной задачи вектор угадывания равен x0. Для большинства функций вы можете легко записать, почти любой вектор будет сходиться к одному глобальному решению.

так (1,1,1) догадка векторы здесь так же хорошо, как (-50,50,50) Просто не оставить пустое пространство для программы

Смежные вопросы