根据积分最小化函数 - scipy

Minimizing function in terms of integral - scipy

我想找到一个函数的参数,它会在定义的区间内产生一个特定的整数值。为了简单起见,下面的例子把函数看成一条直线,我要求的参数是斜率m。我使用 scipy.integrate.quad 进行积分,并尝试使用 scipy.integrate.minimize 求斜率:

from scipy.integrate import quad
from scipy.optimize import minimize

IntegralValue = 10
initial_guess = 0.1

def function(m):
    intgrl, abserr = quad(lambda x: m*x, 0, 10) # interval from 0 to 10
    return intgrl - IntegralValue
res = minimize(function, initial_guess, method='nelder-mead',options={'xtol': 1e-8, 'disp': True})

print(res.x)

一个简单的 0.2 应该是结果(function(0.2) 结果 0),但出于某种原因我收到警告“已超过最大函数计算次数” " 并且输出是一些没有意义的东西 (-6.338253e+27)。默认最小化方法也不起作用。也许我遗漏了什么或被误解了,但我无法弄清楚。感谢您的帮助。我在 Windows 10.

上使用 Python 3.7.10

最小值当然是负无穷大。为了得到零,我只需要将问题限制为非负值,正如@ForceBru 和@joni 所评论的那样。谢谢!

编辑

这是最终的功能完整代码:

from scipy.integrate import quad
from scipy.optimize import minimize

IntegralValue = 10
initial_guess = 0.1

def function(m):
    intgrl, abserr = quad(lambda x: m*x, 0, 10) # interval from 0 to 10
    return abs(intgrl - IntegralValue)
res = minimize(function, initial_guess, method='nelder-mead',options={'xtol': 1e-8, 'disp': True})

print(res.x)

您描述的问题是 SciPy 中的 root finding; that is, you want to find m such that function(m) = 0. The appropriate tool for such a problem is one of the root finding functions 之一。

例如,您可以像下面的代码那样使用 root_scalar,它使用您的原始函数 function:

from scipy.integrate import quad
from scipy.optimize import root_scalar


def function(m):
    intgrl, abserr = quad(lambda x: m*x, 0, 10) # interval from 0 to 10
    return intgrl - IntegralValue


IntegralValue = 10
guess_bracket = [0.0, 1.0]

res = root_scalar(function, x0=guess_bracket[0], x1=guess_bracket[1])

if res.converged:
    print(f"m = {res.root}")
else:
    print(f'root_scalar failed: res.flag={res.flag}')

输出:

m = 0.2