用Scipy求定积分常数的极小值

camsedfj  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(137)

我正在尝试使用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,因为它们都缺失了才能解决这个问题,但是我不确定如何做到这一点。有人能帮助我理解如何定义这些方程中的变量和常数吗?我试着看过以前的答案,但是我似乎不能让它们起作用。

vkc1a9a2

vkc1a9a21#

quadminimize都需要一个签名为fun(x, *args)的函数。因此,您需要用lambda表达式 Package 该函数,或者使用args参数。还要注意,quad不返回标量,因此您需要从返回的元组中提取整数值:


# ... your other functions and constants here ...

def minimization_function(c, cv, xm):
    return quad(lambda x: integrand(x, cv, c), 0, xm)[0]

res = minimize(lambda c: minimization_function(c, cv, xm), c_0)

使用args参数,您的程式码看起来会像这样:


# ... your other functions and constants here ...

def minimization_function(c, cv, xm):
    return quad(integrandx, 0, xm, args=(cv, c))[0]

res = minimize(minimization_function, c_0, args=(cv, c))

PS:没有必要用quad来计算积分,相反,你可以简单地使用封闭形式的表达式(如果你不想自己推导它,请参阅Wolfram Alpha)。

相关问题