根据积分最小化函数 - 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
我想找到一个函数的参数,它会在定义的区间内产生一个特定的整数值。为了简单起见,下面的例子把函数看成一条直线,我要求的参数是斜率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.
最小值当然是负无穷大。为了得到零,我只需要将问题限制为非负值,正如@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