我有一个目标函数,我想最小化关于't'的值,在这个函数中,有一个从0到t的积分,这个积分必须被考虑用于优化。但是,我不知道如何将这个积分包括到我的目标函数中。我已经使用了simpy和scipy库,但是它们似乎都不起作用。下面是我的代码:
Cf= 100;
Cp=50;
Eta=72.66585511711865;
Beta=1.18609324
def R(t):
return math.exp(-t/Eta)**Beta
def f(t):
return (Beta/(Eta**Beta))*t**(Beta-1)*(math.exp(-t/Eta)**Beta)
def M(t):
return t*f(t)
import sympy as sp
from scipy import *
import scipy.integrate
t = sp.Symbol('t')
Mt=t*(Beta/(Eta**Beta))*t**(Beta-1)*(sp.exp(-t/Eta)**Beta);
intM=sp.integrate(Mt,t)
print(intM)
def C(t):
return (Cp*R(t)+Cf*(1-R(t)))/(t*R(t)+ intM)
from scipy.optimize import minimize_scalar
res = minimize_scalar(C)
res
这将显示错误“TypeError:无法确定关系”“的真值。在scipy.integrate.quad中,我无法将上限定义为”t“。另一方面,当我尝试将sp.integrate输出放入目标函数时,它也不起作用。如果你能帮助我,我将很高兴。谢谢。
2条答案
按热度按时间v1l68za41#
首先,你不能在优化程序中有一个 * 不定 * 积分,因为它被定义为一个常数。不是一个函数,而是一类函数。
但看起来你的积分是定积分--你对某个虚拟变量积分,比如说,从t '= 0到t'= t,所以这是非常好的,你只需要这样做。
首先,我们来做定积分:
这仍然依赖于
t
,所以现在我们把它转换成一个数值函数:然后将
intM_func(t)
而不是符号intM
粘贴到您的C
最小化函数中,您就可以开始了:)适用于我的完整版本:
我得到:
作为输出。
bvjveswy2#
我试图“关闭”这个,因为你没有给予完整的错误-与追溯。但它似乎你得到了一个答案,所以我只是试图集中错误,因为你给它。
这类似于numpy数组中常见的“二义性错误”。某个函数试图执行简单的True/False操作,例如
if
。scipy函数可能正在测试范围值的顺序是否正确。或者错误发生在func
中。如果没有回溯,我们只能猜测。或者从以前的知识中推断。所以你很幸运,有人已经熟悉这些问题。只是不要指望这一点!举例说明:
在
isympy
会话中,考虑以下符号:和一个亲戚:
把这个关系式放在一个‘if’中:
sympy
无法从关系表达式返回简单的True/False。同时使用
sympy
和scipy
需要对两者的工作原理有相当多的了解。在数值函数中使用symmy表达式太容易了,但却不起作用。以下是缺少的回溯:
因此,正如我所怀疑的,
scipy
正在尝试检查范围;C
被给定一个简单的标量参数产生一个sympy
表达式-带有一个未计算的积分。你忘了给我们看的那个
intM
: