scipy.optimize.fsolve:用Python求解方程的解

例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
  • 16
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值