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]
我有以下函数,我尝试为给定的 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]