我正在尝试使用Scipy优化以下问题
目前我已经定义了我的方程,并试图使用四元函数和最小化来求解方程。
import numpy as np
from scipy.integrate import quad
from scipy.optimize import minimize
def g_x(x, cv):
cv2 = np.square(cv)
return (x+1-np.sqrt(np.square(x)+2*cv2*x+1))/(1-cv2)
def g_approx(x, c):
return (c*x)/(1+c*x)
def integrand(x, cv, c):
return g_x(x, cv)-g_approx(x, c)
def minimization_function(c, cv, xm):
return quad(integrand, 0, xm, args=c)
c_0 = 1
cv = 0.6
xm = 15
res = minimize(minimization_function, c_0, method='CG', tol=1.e-2, options={'gtol': 0.01, 'maxiter': 5})
在尝试解决此问题时,我得到以下错误。
scipy\optimize\optimize.py:261, in _prepare_scalar_function(fun, x0, jac, args, bounds, epsilon, finite_diff_rel_step, hess)
257 bounds = (-np.inf, np.inf)
259 # ScalarFunction caches. Reuse of fun(x) during grad
...
132 # Overwriting results in undefined behaviour because
133 # fun(self.x) will change self.x, with the two no longer linked.
--> 134 return fun(np.copy(x), *args)
TypeError: minimization_function() missing 2 required positional arguments: 'cv' and 'xm'
所以我知道在某个点上我需要给予C_v和X_m,因为它们都缺失了才能解决这个问题,但是我不确定如何做到这一点。有人能帮助我理解如何定义这些方程中的变量和常数吗?我试着看过以前的答案,但是我似乎不能让它们起作用。
1条答案
按热度按时间vkc1a9a21#
quad
和minimize
都需要一个签名为fun(x, *args)
的函数。因此,您需要用lambda表达式 Package 该函数,或者使用args
参数。还要注意,quad
不返回标量,因此您需要从返回的元组中提取整数值:使用
args
参数,您的程式码看起来会像这样:PS:没有必要用
quad
来计算积分,相反,你可以简单地使用封闭形式的表达式(如果你不想自己推导它,请参阅Wolfram Alpha)。