Python fmin 使用 lambda 表达式

Python fmin using lambda expression

我有以下函数,我尝试为给定的 S、h、g 求解 Vcr:

Vcr/np.sqrt(g*h)=((2/3)*(1-S+ (Vcr**2)/(2*g*h)))**(3/2)

我是这样做的:

from scipy.optimize import fsolve
import numpy as np
S = 0.06
h = 15.14
g = 9.8

def eqn(Vcr,g,h,S):
    return (Vcr/np.sqrt(g*h)-((2/3)*(1-S+ (Vcr**2)/(2*g*h)))**(3/2))
ans = fsolve(lambda Vcr,g,h,S: eqn(Vcr,g,h,S), x0=5, args=(S,h,g))
print(eqn(ans,g,h,S))

答案打印 4.9109。这个答案是不正确的。我在 Matlab 中检查了这个:

fun = @(Vcr) Vcr./sqrt(g*h)-((2/3)*(1-S+ (Vcr.^2)./(2*g*h))).^(3/2);
sol = fzero(fun, 5); % solution critical speed;
# sol = 8.5970

然后将解代入 Python 方程,得到: print(eqn(8.5970,g,h,S))=0 所以确实应该是8.5970.

如何在 Python 中使用接近给定 matlab 表达式(使用匿名函数)的表达式解决此问题?如果可能的话,我不想将函数定义为 def():

函数的额外参数必须按照函数期望的顺序传递,你颠倒了它们(args=(S,h,g) 而你的函数以相反的顺序声明它们:lambda Vcr,g,h,S:)。

将它们按正确的顺序排列即可得到预期的解决方案:

from scipy.optimize import fsolve
import numpy as np
S = 0.06
h = 15.14
g = 9.8

def eqn(Vcr,g,h,S):
    return (Vcr/np.sqrt(g*h)-((2/3)*(1-S+ (Vcr**2)/(2*g*h)))**(3/2))

ans = fsolve(lambda Vcr,g,h,S: eqn(Vcr,g,h,S), x0=5, args=(g, h, S))
print(ans, eqn(ans,g,h,S))
# [8.5970162] [1.11022302e-16]