Python:如何用多个解求解一组非线性方程

时间:2019-02-12 23:09:38

标签: python python-3.x scipy sympy polynomials

我想求解一组三个非线性方程。像

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中,我可以使用Solve获得八个解决方案:

-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的solve_poly_equations,但返回None。我也尝试了scipy的fsolve,但这只会基于初始猜测返回一个解决方案。

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一样提供全部八个解决方案?

0 个答案:

没有答案