代码之家  ›  专栏  ›  技术社区  ›  Matrix23

用Python中的一个变量求解方程

  •  0
  • Matrix23  · 技术社区  · 2 年前

    我正试图解方程: log(1+x)/x - 1/(1+x) == 2/3 * q * x**2 对于 x 具有 q = 4e-4

    我试过了

    import numpy as np
    import scipy.optimize as so
    
    q = 4e-4
    eqn = lambda x: np.log(1+x) / x  -  1 / (1+x)   -   2/3 * q * x**2 
    sol = so.fsolve(eqn, 1)[0]
    print(sol)
    

    q = 4e-4
    eqn = lambda x: np.log(1+x) / x  -  1 / (1+x)   -   2/3 * q * x**2 
    sol = so.root_scalar(eqn, bracket=(1e-6, 1e20)).root
    print(sol)
    

    却得到荒谬的答案。

    我试着把方程式绘制如下: enter image description here

    我希望答案是 x ~ 20 。我该怎么得到这个?

    2 回复  |  直到 2 年前
        1
  •  2
  •   jared    2 年前

    当你提供一个好的初始猜测或一个更严格的括号时,这些算法效果最好。

    import numpy as np
    from scipy.optimize import fsolve, root_scalar, root
    
    def eqn(x): 
        q = 4e-4
        return np.log(1+x)/x - 1/(1+x) - 2/3*q*x**2
    
    
    sol_fsolve = fsolve(eqn, 10)[0]
    sol_rootscalar = root_scalar(eqn, bracket=(1e-6, 100)).root
    sol_root = root(eqn, 10).x[0]
    
    print(sol_fsolve)       # 19.84860182482322
    print(sol_rootscalar)   # 19.848601824823366
    print(sol_root)         # 19.84860182482322
    
        2
  •  1
  •   Xiaomin Wu    2 年前

    只需修改x的init值可能会有所帮助

    import numpy as np
    import scipy.optimize as so
    
    q = 4e-4
    eqn = lambda x: np.log(1+x) / x  -  1 / (1+x)   -   2/3 * q * x**2 
    sol = so.fsolve(eqn, [15])[0]
    print(sol)
    
    

    将输出

    19.848601824823362