例1:
求解方程组的一个解: x0*cos(x1) = 4, x1*x0 - x1 = 5。
需要注意两点:
1.定义方程组,方程组要写出f(x)=0的形式(=0不需要写出来),所以原方程右边4和5都要移项到左边。
2.求解方程都根,对于非线性方程,通常会有不止一个解(对于唯一解的线性方程,初始值的设置对方程的解没有影响),因此需要设置大致初始解(取值范围),这样方程在初始值附近按梯度下降进行求解,可得局部最优解
3.第2步中的局部最优解不一定是满足方程的解,可以使用np.isclose(func(root), [0.0, 0.0])进行验证,如果是方程的近似解,则为True(可以设置相等的tolerence,默认相对插值不超过1e-5,绝对插值不超过1e-8)
import numpy as np
from scipy.optimize import fsolve
# 定义方程组,方程组要写出f(x)=0的形式(=0不需要写出来),所以原方程4和5都要移项到左边
def func(x):
return [x[0] * np.cos(x[1]) - 4,
x[1] * x[0] - x[1] - 5]
# 求解方程都根,对于非线性方程,通常会有多个解,因此需要设置解的大致初始值(取值范围),这样方程在初始值附近按梯度下降进行求解,可得局部最优解
# x0,x1初始解为10,1的结果
root = fsolve(func, [10, 1])
root
array([6.50409711, 0.90841421])
np.isclose(func(root), [0.0, 0.0]) # 检验解是否是符合方程组的近似解
array([ True, True])
# x0,x1初始解为1,1的结果
root = fsolve(func, [10, 1])
root
array([6.50409711, 0.90841421])
# x0,x1初始解为100,100的结果
root = fsolve(func, [100, 100])
root
array([ 1.08031886, 62.8304055 ])
np.isclose(func(root), [0.0, 0.0]) # 检验解是否是符合方程组的近似解
array([ False, False]) # 不能满足方程的近似解,看下值为多少
# 把方程的根array([ 1.08031886, 62.8304055 ])代入方程组,看下结果是多少
func(root)
[-2.919682271484323, 0.04646656815791772]
第一个方程结果是-2.9196,第二个方程为0.0464