如果我想求解一个方程的特定结果,其中一个变量可通过增加或减少来求解我想要的结果,我该怎么做?
我最初建议使用二分算法,但经过进一步研究,我发现它仅适用于 python 中的平方根方程。
例如
rho1 = 0.177
Nh = 9.3
Nv = 128
Qh = 10
H = 1
beta_h1 = .0000000001
def beta_h_func(beta_h):
return beta_h1*min(Nv/(Qh*Nh), 1) + rho1*H*min(Nv/(Qh*Nh), 1)
while beta_h_func(beta_h1) != 1:
if beta_h_func(beta_h1) < 1:
beta_h1 += .000000001
beta_h_func(beta_h1)
if beta_h_func(beta_h1) > 1:
beta_h1 -= .000000001
beta_h_func(beta_h1)
其中
beta_h1
是可增加或减少的变量。
但这样做只会导致无限地在 1 之上和之下来回,永无止境。我可以将 while 函数更改为什么才能获得决定性的 1 作为结果。
这个问题是线性的,可以很容易地用手解决。解析解为
beta_h1 = (1 - rho1*H*min(Nv/(Qh*Nh), 1))/min(Nv/(Qh*Nh), 1)
。在本例中,该值为 0.823。
假设这只是一个例子,你的实际问题更复杂,那么你遇到的是一个寻根问题。为此,您可以使用
scipy.optimize.root
来找到解决方案。 Scipy 包含其他求根方法,包括适用于这个问题的二分法(我不确定为什么你说二分法只适用于平方根问题,无论这意味着什么)。
from scipy.optimize import root
rho1 = 0.177
Nh = 9.3
Nv = 128
Qh = 10
H = 1
c = min(Nv/(Qh*Nh), 1)
def beta_h_func(beta_h1):
return c*(beta_h1 + rho1*H) - 1
sol = root(beta_h_func, 1)
print(sol)
输出:
message: The solution converged.
success: True
status: 1
fun: [ 0.000e+00]
x: [ 8.230e-01]
nfev: 4
fjac: [[-1.000e+00]]
r: [-1.000e+00]
qtf: [ 3.861e-13]
对您的代码的一些评论。
while
循环可能会永远运行,因为您正在使用浮点数并检查相等性。比较浮点数时,检查它们是否接近(有一定的容差),而不是完全相等。beta_h1
后对函数的评估是无用的,因为这些结果没有任何反应。beta_h
而不是 beta_h1
。min(...)
,因为内部的值在整个问题中不会改变(至少对于您共享的代码而言不会改变)。我在上面的代码中做到了这一点。