Python-fsolve求解非线性方程组

数学描述

已知多组x、y, 求下面非线性方程的三个常系数k、b、f
y ( x ) = 1 − ( e − k x ) ( b ( 1 − e − x b + f ( x − b ( 1 − e − x b ) ) ) y(x) = 1 - (e^{-kx})(b(1-e^{-\frac{x}{b}} + f(x - b(1 - e^{-\frac{x}{b}}))) y(x)=1(ekx)(b(1ebx+f(xb(1ebx)))
将方程转换为标准的二元函数
h ( x , y ∣ k , b , f ) = y − ( ( e − k x ) ( b ( 1 − e − x b + f ( x − b ( 1 − e − x b ) ) ) ) h(x, y | k, b, f) = y - ((e^{-kx})(b(1-e^{-\frac{x}{b}} + f(x - b(1 - e^{-\frac{x}{b}})))) h(x,yk,b,f)=y((ekx)(b(1ebx+f(xb(1ebx))))

形成如下三元非线性方程组
{ h ( x 0 , y 0 ∣ k , b , f ) = 0 h ( x 1 , y 1 ∣ k , b , f ) = 0 h ( x 2 , y 2 ∣ k , b , f ) = 0 \begin{cases} h(x_0, y_0|k, b, f) = 0 \\ h(x_1, y_1|k, b, f) = 0 \\ h(x_2, y_2|k, b, f) = 0 \\ \end{cases} h(x0,y0k,b,f)=0h(x1,y1k,b,f)=0h(x2,y2k,b,f)=0

代码求解

利用python的fsolve求解,代码如下:

import numpy as np
from scipy.optimize import fsolve, root

def func(X):
    def h(x, y, k, b, f):
        return y - (1 - np.exp(-k * x)) * ((b * (1 - np.exp(- x / b)) + f * (x - b * (1 - np.exp(- x / b))))) 

    k, b, f = X.tolist()
    x = [8.833, 4.949, 20.005]
    y = [4.864, 2.811, 8.126]
    return [h(x[i], y[i], k, b, f) for i in range(len(x))]

res = fsolve(func, x0=[1, 1, 1])
print(res) # [0.31822147 5.13982664 0.20741606]

要点说明

  • fslove求得的是局部最优解, 所以不一定能得到全局最优解,所以迭代初始值x0对结果的影响可能很大, 不合适的初值可能导致结果不收敛或偏差太大,从而爆出如下警告

    RuntimeWarning: The iteration is not making good progress, as measured by the improvement from the last ten iterations.

  • fsolve一般在使用时仅需提供待求解的函数func和迭代初始值x0

  • 当求解的是方程组时, func要求返回方程列表(list或者np.array都可以);当求解的是单个方程时,直接返回方程就行

  • 更多信息参见官网文档

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值