解决隐式函数

3

我有一个隐式函数需要解决:

enter image description here

因此,我尝试使用scipy.optimize中的根查找函数:

- fsolve : RuntimeWarning: The iteration is not making good progress, as 
  measured by the improvement from the last ten iterations.
- excitingmixing : NoConvergence
-brent:  RuntimeWarning: invalid value encountered in double_scalars (but 
  without a chance to set constraints)

我必须承认我不确定正确的求解器。能有人帮忙吗?

最小工作示例:

from scipy.optimize import fsolve, newton, brent, excitingmixing
import numpy as np

def func_zeta(zeta):
    k= 1.2
    Re = 5000.
    d = 0.03
    return (2.51 /Re/np.sqrt(zeta)+k/d/3.71) + 10**(0.5/ np.sqrt(zeta))
zeta = fsolve(func_zeta, 64/Re)
1个回答

3
您的公式翻译存在问题。它不应该是以下的return语句吗?
return 2.51 / (Re * np.sqrt(zeta)) + k / (d * 3.71) - 10 ** (-0.5 / np.sqrt(zeta))

但即便如此,我们仍会再次收到一个RuntimeWarning。让我们再试一次,替换zeta

from scipy.optimize import fsolve
import numpy as np

def zeta_in_disguise(x):
    global k, d, Re
    return x + 2 * np.log10(2.51 * x / Re + k / (d * 3.71))

k = 1.2
Re = 5000
d = 0.03
#x = 1 / np.sqrt(zeta)
x = fsolve(zeta_in_disguise, 0)
print(x)
#let's test, if x is really the solution to the equation
print(-2 * np.log10(2.51 * x / Re + k / d / 3.71))

啊,现在它已经收敛并产生了以下输出。
-2.06528864

这就是问题所在 - 对于您给定的参数,至少当我们只考虑浮点数时,没有解决方案。


不,我认为这些术语具有相同的符号。应该想到替换的想法。谢谢!但不幸的是这也行不通。我有点困惑,因为方程式是阻力系数的官方方程式,值是合理的。 - TThe
我不太明白你的意思。这是针对1/sqrt(zeta)和给定参数k、d、Re的方程的解决方案。如果你不信任Python,可以使用计算器进行检查。结果是否符合你所期望的任何模型都是完全不同的问题。 - Mr. T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接