Python: Как решить систему нелинейных уравнений с несколькими решениями - PullRequest
0 голосов
/ 13 февраля 2019

Я хочу решить систему из трех нелинейных уравнений.Что-то вроде

f1 = 1.02226923451805*x**2 - 1.9683360808094*x*y + 1.03639538768756*y**2 - 49
f2 = 1.03639538768756*y**2 - 2.03796060801355*y*z + 1.04842646546047*z**2 - 25
f3 = 1.02226923451805*x**2 - 1.93479820599624*x*z + 1.04842646546047*z**2 - 74

В Matlab я могу использовать решение и получить восемь решений:

-20.3224 -22.8100 -23.1694
-23.5467 -22.9631 -23.1503
-23.6222 -22.1818 -23.0558
-23.6372 -22.4943 -20.5865
23.6372 22.4943 20.5865
23.6222 22.1818 23.0558
23.5467 22.9631 23.1503
20.3224 22.8100 23.1694

В python я пробовал использовать sympy's solve_poly_equations, но он возвращает None.Я также попробовал fsolve от scipy, но он возвращает только одно решение, основанное на первоначальном предположении.

from sympy import solve_poly_system
from sympy.abc import x,y,z
f1 = 1.02226923451805*x**2 - 1.9683360808094*x*y + 1.03639538768756*y**2 - 49 
f2 = 1.03639538768756*y**2 - 2.03796060801355*y*z + 1.04842646546047*z**2 - 25 
f3 = 1.02226923451805*x**2 - 1.93479820599624*x*z + 1.04842646546047*z**2 - 74 
s = solve_poly_system([f1, f2, f3], x, y, z)
print(s)
>> None

from scipy.optimize import fsolve
def myFunc(v):
    x = v[0]
    y = v[1]
    z = v[2]
    f = empty((3))
    f[0] = 1.02226923451805*x**2 - 1.9683360808094*x*y + 1.03639538768756*y**2 - 49 
    f[1] = 1.03639538768756*y**2 - 2.03796060801355*y*z + 1.04842646546047*z**2 - 25 
    f[2] = 1.02226923451805*x**2 - 1.93479820599624*x*z + 1.04842646546047*z**2 - 74 
    return f
s = fsolve(myFunction, [1, 1, 1])   
print(s)
>> [23.63719275 22.49425691 20.58646335]

Я пытаюсь решить проблему, в которой важно, чтобы все возможные решения были возвращены.Есть ли в Python способ получить все восемь решений, которые дает Matlab?

...