我想在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])
但是,我在python中找不到合适的函数。scipy.optimize.fsolve
需要初始值。而且,它总是带有无法解释的错误。您能告诉我如何在python中实现它吗?
python代码如下:
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:数学域错误
您遇到的问题与您对根的最初猜测以及它如何影响算法实现的稳定性有关。例如,如果用1e-3交换0.5,则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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句