Ошибка при попытке использовать nonlinsolve для решения системы нелинейных уравнений - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь использовать SymPy, чего раньше никогда не делал, для решения системы нелинейных уравнений, но я не могу заставить ее работать.

Вот что я пробовал:

from sympy import *

a, b, c, d, e, f, x, y, z, g0, g1, g2 = symbols('a:f x:z g:3')
system = [(a * (x - y*z))/(b * (1 - z**2)) - g1,
(a * (y - x*z))/(c * (1 - z**2)) - g2,
f - d * (a * (x - y*z))/(b * (1 - z**2)) - e * (a * (y - x*z))/(c * (1 - z**2)) - g0]
nonlinsolve(system, [x, y, z])

То, что я хочу, это значения x, y и z в терминах других символов, которые решают систему. Но я получаю следующее сообщение об ошибке:

Traceback (most recent call last):
  File "/Users/phl43/Desktop/test.py", line 7, in <module>
    nonlinsolve(system, [x, y, z])
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sympy/solvers/solveset.py", line 3053, in nonlinsolve
    res = _handle_positive_dimensional(polys, symbols, denominators)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sympy/solvers/solveset.py", line 2801, in _handle_positive_dimensional
    denominators)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sympy/solvers/solveset.py", line 2719, in substitution
    old_result, solveset_real)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sympy/solvers/solveset.py", line 2708, in _solve_using_known_values
    result.remove(res)
ValueError: list.remove(x): x not in list

Есть идеи, как заставить это работать?

1 Ответ

1 голос
/ 22 октября 2019

Посмотрите, что вы можете узнать, решив систему вручную без проверки:

>>> r = solve(system, dict=True, manual=True, check=False)
>>> r
[{x: -y, z: -1}, {x: y, z: 1}, {x: (b*g1 + c*g2*z)/a, y: (b*g1*z + c*g2)/a}]

Первые два решения не будут работать, потому что это приведет к делению на 0. Последнее решение устанавливает первые дваУравнения в 0, в то время как последнее решение удовлетворяет первым двум уравнениям, но они делают последнее выражение независимым от z:

>>> [simplify(i.subs(r[-1])) for i in r]
[0, 0, -d*g1 - e*g2 + f - g0]

Таким образом, z может быть любым при условии, что g0 = f -d*g1 - e*g2. Это некорректная система уравнений для решения для x, y и z.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...