One - One Code All

Blog Content

python科学计算之非线性方程组求解scipy

Python   2013-07-14 09:27:06

optimize库中的fsolve函数可以用来对非线性方程组进行求解。它的基本调用形式如下:

fsolve(func, x0)

func(x)是计算方程组误差的函数,它的参数x是一个矢量,表示方程组的各个未知数的一组可能解,func返回将x代入方程组之后得到的误差;x0为未知数矢量的初始值。


由于fsolve函数在调用函数f时,传递的参数为数组,因此如果直接使用数组中的元素计算的话,计算速度将会有所降低,因此这里先用float函数将数组中的元素转换为Python中的标准浮点数,然后调用标准math库中的函数进行运算。

在对方程组进行求解时,fsolve会自动计算方程组的雅可比矩阵,如果方程组中的未知数很多,而与每个方程有关的未知数较少时,即雅可比矩阵比较稀疏时,传递一个计算雅可比矩阵的函数将能大幅度提高运算速度。在一个模拟计算的程序中需要大量求解近有50个未知数的非线性方程组的解。每个方程平均与6个未知数相关,通过传递雅可比矩阵的计算函数使计算速度提高了4倍。

雅可比矩阵

雅可比矩阵是一阶偏导数以一定方式排列的矩阵,它给出了可微分方程与给定点的最优线性逼近,因此类似于多元函数的导数。


上代码:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

'''
方程组:
    5*x1 + 3 = 0
    4*x0*x0 - 5*(x1*x2) = 0
    x1*x2 - 2.5 = 0

'''


from scipy.optimize import fsolve,leastsq 

# from math import sin,cos

def f(x):
    x0 = float(x[0])
    x1 = float(x[1])
    x2 = float(x[2])
    return [
        5*x1+3,
        4*x0*x0 - 5*(x1*x2),
        x1*x2 - 2.5
    ]

x0 = [1,1,1]  
result = fsolve(f,x0)  
  
print("===================")  
print()  
print("求解函数名称:",fsolve.__name__)  
print("解:",result)  
print("各向量值:",f(result))  
#拟合函数来求解  
h = leastsq(f,x0)  
  
print("===================")  
print()  
print("求解函数名称:",leastsq.__name__)  
print("解:",h[0])  
print("各向量的值:",f(h[0]))


输出结果:

===================

求解函数名称: fsolve
解: [-1.76776695 -0.6        -4.16666667]
各向量值: [0.0, 1.7763568394002505e-14, 1.7763568394002505e-15]
===================

求解函数名称: leastsq
解: [ 1.76776695 -0.6        -4.16666667]
各向量的值: [0.0, 1.7763568394002505e-15, 0.0]


上一篇:python科学计算之线性方程组求解sympy
下一篇:sqlalchemy commit 和 flush

The minute you think of giving up, think of the reason why you held on so long.