python用fsolve、leastsq对非线性方程组求解
在工程问题中,非线性方程组的求解是非常普遍的,因为很多工程问题都涉及到了非线性的数学模型。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函数,我们可以很方便地求解非线性方程组和最小二乘问题。当然,对于不同的问题,我们需要针对性地选择适合的函数来求解。在实际的工程问题中,求解非线性方程组和最小二乘问题是非常常见的,因此理解和掌握这两个函数的使用方法是非常有用的。
