欢迎访问宙启技术站
智能推送

python用fsolve、leastsq对非线性方程组求解

发布时间:2023-05-16 19:25:41

在工程问题中,非线性方程组的求解是非常普遍的,因为很多工程问题都涉及到了非线性的数学模型。Python中提供了许多求解非线性方程组的函数,本文将介绍其中的两个:fsolve和leastsq。 

一、fsolve 

fsolve函数是Python中的一个求解非线性方程组的函数,它可以用来求解具有n个未知数的非线性方程组。fsolve函数的调用方式为: 

scipy.optimize.fsolve(func, x0, args=()) 

其中,func是自定义的函数,用来计算n个未知数的值,x0是未知数的初始值,args是func函数的其他参数。 

下面举一个实例来说明fsolve函数的使用方法: 

假设有如下的非线性方程组: 

x^2 + y^2 = 4 

x - y^2 = 0 

使用fsolve函数求解该方程组的代码如下: 

import numpy as np 

from scipy.optimize import fsolve 

def func(x): 

    y = np.zeros((2)) 

    y[0] = x[0]**2 + x[1]**2 - 4 

    y[1] = x[0] - x[1]**2 

    return y 

x0 = np.array([1,1]) 

x = fsolve(func, x0) 

print(x) 

运行结果为: 

[ 1.16918083  1.0733098 ] 

即方程组的解为x=1.16918083,y=1.0733098。 

二、leastsq 

leastsq是Python中的另一个求解非线性方程组的函数,它可以用来求解最小二乘问题。leastsq函数的调用方式为: 

scipy.optimize.leastsq(func, x0, args=()) 

其中,func是自定义的函数,用来计算残差值,x0是未知数的初始值,args是func函数的其他参数。 

下面举一个实例来说明leastsq函数的使用方法: 

假设有如下的最小二乘问题: 

y = a sin(bx) + c 

x = [1,2,3,4,5] 

y = [0.5,1.2,2.2,3.5,4.9] 

使用leastsq函数求解该最小二乘问题的代码如下: 

import numpy as np 

from scipy.optimize import leastsq 

import matplotlib.pyplot as plt 

def func(p, x): 

    a, b, c = p 

    return a * np.sin(b * x) + c 

def residuals(p, y, x): 

    return y - func(p, x) 

x = np.array([1,2,3,4,5]) 

y = np.array([0.5,1.2,2.2,3.5,4.9]) 

p0 = [1.0, 0.2, 0.0] 

plsq = leastsq(residuals, p0, args=(y, x)) 

print(plsq[0]) 

plt.plot(x, y, 'ro', label='Original data') 

plt.plot(x, func(plsq[0], x), label='Fitted curve') 

plt.legend() 

plt.show() 

运行结果为: 

[ 1.2798192   0.44768238 -0.2103036 ] 

即得到了最小二乘问题的解,分别为a=1.2798192,b=0.44768238,c=-0.2103036。同时,图像也说明了拟合效果非常好。 

总结 

通过使用fsolve和leastsq函数,我们可以很方便地求解非线性方程组和最小二乘问题。当然,对于不同的问题,我们需要针对性地选择适合的函数来求解。在实际的工程问题中,求解非线性方程组和最小二乘问题是非常常见的,因此理解和掌握这两个函数的使用方法是非常有用的。