python中是否有类似于matlab中fzero的函数?

python中是否有类似于matlab中fzero的函数?,python,scipy,Python,Scipy,我想用python来解下面的方程 它可以在Matlab中通过fzero函数实现,如下所示: K=5; H=6; u=100; fun=@(x) -(K*(-H+log(1+H/x)*(x+H)))/(log(2)*x^2*(log2((x+H)/x))^2*(x+H))+u; xx=fzero(fun,[1e-3,1]) import math from scipy.optimize import fsolve K=5 H=6 u=100 def fu

我想用python来解下面的方程

它可以在Matlab中通过fzero函数实现,如下所示:

    K=5;
    H=6;
    u=100;
    fun=@(x) -(K*(-H+log(1+H/x)*(x+H)))/(log(2)*x^2*(log2((x+H)/x))^2*(x+H))+u;
    xx=fzero(fun,[1e-3,1])
import math
from scipy.optimize import fsolve
K=5
H=6
u=100
def func(x,K,H,u):
    return (-(K*(-H+math.log(1+H/x)*(x+H)))/(math.log(2)*(x**2)*(math.log((x+H)/x,2))**2*(x+H))+u)
print(fsolve(func,0.5,args=(K,H,u)))
但是,我在python中找不到合适的函数
scipy.optimize.fsolve
需要初始值。此外,它总是有无法解释的错误。你能告诉我如何用python实现它吗

python代码如下所示:

    K=5;
    H=6;
    u=100;
    fun=@(x) -(K*(-H+log(1+H/x)*(x+H)))/(log(2)*x^2*(log2((x+H)/x))^2*(x+H))+u;
    xx=fzero(fun,[1e-3,1])
import math
from scipy.optimize import fsolve
K=5
H=6
u=100
def func(x,K,H,u):
    return (-(K*(-H+math.log(1+H/x)*(x+H)))/(math.log(2)*(x**2)*(math.log((x+H)/x,2))**2*(x+H))+u)
print(fsolve(func,0.5,args=(K,H,u)))
错误如下:
return(-(K*(-H+math.log(1+H/x)(x+H))/(math.log(2)(x**2)*(math.log((x+H)/x,2))*2(x+H))+u)ValueError:math domain error

您遇到的问题与根的初始猜测有关,以及它如何影响算法实现的稳定性。例如,如果将0.5替换为1e-3,则fsolve收敛。我在下面提出了一个替代脚本,它使用括号算法,并且可以毫无问题地收敛,前提是根位于括号内,括号两端的图像具有相反的符号。如果后一个条件中的任何一个没有强制执行,那么算法会让您知道

from numpy import log, log2
from scipy.optimize import root_scalar


def func(x, K, H, u):
    return (u - K * (log(1 + H / x) * (x + H) - H)
            / log(2) / x ** 2 / log2((x + H) / x) ** 2 / (x + H))


sol = root_scalar(func, args=(5, 6, 100), method='toms748', bracket=[1e-3, 1])
print(sol.root, func(sol.root, 5, 6, 100))
# 0.0784837307625566 4.263256414560601e-14

“无法解释的错误”?如果您提供足够的信息,我们愿意解释错误。错误如下:return(-K*(-H+math.log(1+H/x)*(x+H))/(math.log(2)*(x**2)*(math.log((x+H)/x,2))**2*(x+H))+u)ValueError:math domain error听起来像是一个
math。log
得到了一个否定的参数。因此,您可以通过分而治之的方法自行调试它:将复杂的语句分解为更小的元素,找出哪个术语产生了错误。感谢您的回复。math.log()的输入为正。我试图改变我可以改变的较小的元素,但错误仍然存在。它有效!非常感谢你的帮助,这解决了我的迫切需要。