前端开发

python 非线性方程组

2021-01-08 20:40:24 阅读数 9950 收藏 0

 

使用scipy 求解非线性方程组实例

'''
5 * x1 - 25 = 0
5 * x0 * x0 - x1 * x2 = 0
x2 * x0 -27 = 0
scipy.optimize fsolve(func, x)

所使用的scipy中的库optimize以及方法fsolve
func 是自己构造的函数
'''
from scipy.optimize import fsolve


def func(x):
    x0, x1, x2 = x
    return [
        5 * x1 - 25,
        5 * x0 * x0 - x1 * x2,
        x2 * x0 - 27
    ]


r = fsolve(func, [1, 1, 1])
print(r)
# [3. 5. 9.]

 

使用求导矩阵加速

'''
5 * x1 + 3 = 0
5 * x0 * x0 - 2
sin(x1 * x2) = 0
x1 * x2 - 1.5 = 0
'''
from scipy.optimize import fsolve
from math import sin, cos


def func(x):
    x0, x1, x2 = x
    return [
        5 * x1 + 3,
        5 * x0 * x0 - 2 * sin(x1 * x2),
        x1 * x2 - 1.5
    ]


def j(x):
    x0, x1, x2 = x
    return [
        [0, 5, 0],  # 分别对x0, x1, x2 求偏导
        [10 * x0, -2 * x2 * cos(x1 * x2),
         -2 * x1 * cos(x1 * x2)], [0, x2, x1]
    ]


r = fsolve(func, [1, 1, 1], fprime=j)
# 使用求导矩阵传入时可以提高4倍效率
print(r)
# [-0.63166288 -0.6 -2.5]