用一个变量求解方程的特定结果

问题描述 投票:0回答:1

如果我想求解一个方程的特定结果,其中一个变量可通过增加或减少来求解我想要的结果,我该怎么做?

我最初建议使用二分算法,但经过进一步研究,我发现它仅适用于 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 作为结果。

python numpy math sympy ode
1个回答
0
投票

这个问题是线性的,可以很容易地用手解决。解析解为

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(...)
    ,因为内部的值在整个问题中不会改变(至少对于您共享的代码而言不会改变)。我在上面的代码中做到了这一点。
© www.soinside.com 2019 - 2024. All rights reserved.