我正在使用的函数通常在对数-对数空间中更平滑,更好地表现---所以我可以在其中执行内插/外推等,并且效果很好。 有没有办法在对数-对数空间中集成这些数值函数?
即我希望使用某种简单的梯形规则来执行累积积分(例如在python中,使用scipy.integrate.cumtrapz
),以找到一些 st
但是我希望使用值和,而不是和(如果可能)。
我正在使用的函数通常在对数-对数空间中更平滑,更好地表现---所以我可以在其中执行内插/外推等,并且效果很好。 有没有办法在对数-对数空间中集成这些数值函数?
即我希望使用某种简单的梯形规则来执行累积积分(例如在python中,使用scipy.integrate.cumtrapz
),以找到一些 st
但是我希望使用值和,而不是和(如果可能)。
Answers:
您可以更改变量。设置,。积分变为
您必须要小心一点,因为您正在从进行集成。您必须确切执行的操作取决于外观。
我不使用python,但如果我理解正确,则可以
但是您没有样品 和 ,但是您有以下示例 和 。
当然,最简单的方法是
现在,梯形法则基本上是假设您的输入是分段线性的。因此,简单的概括就是让您假设 是分段线性的。
在这种情况下,定义 , 你有
然后,定义 , 你有
所以积分变成
在Matlab中,这看起来像
dlogx=diff(logx); dlogy=diff(logy); k=1:length(logx)-1;
b=dlogx+dlogy; a=exp(logx+logy);
dF=a(k).*dlogx.*(exp(b)-1)./b;
F=cumsum([0,dF]);
希望这可以帮助!
(编辑:我的答案与我打字时输入的大马士革钢给出的答案更为简洁。唯一的区别是,我尝试针对“特殊情况 “是分段线性的 离散离散 网格,与 )
我认为在某些先前的答案以及某些错误中,变量的更改有些混乱。对数函数的积分不是积分的对数。我认为通常很难知道其日志的整数来写出函数的整数。如果有人知道该怎么做,我将很感兴趣。
同时,@ Stefan的上述解决方案是解决在日志-日志空间中集成功能的方法。起点是您要处理的函数在log-log空间中对于足够小的段而言是线性的。
哪里 是线的斜率, 是它的y截距。
通过将两者相减,可以找到:
从替代:
如果在对数-对数空间中,线段的方程式接近直线,则在法线(线性)空间中,线段的方程式接近指数式:
如果我们对此部分有分析公式,则很容易集成:
和
感觉有点像作弊,但这是在对数对数空间中进行采样,以便我们可以使用从对数对数空间派生的参数将线性空间中的函数近似为指数。
log([x_2/x_1]^{m_1+1} + 1)
,即对数的参数中有一个额外的+1
我使用的解决方案基本上是梯形规则的实现,并利用该scipy.misc.logsumexp
函数来保持精度。如果您有一些lny
返回对数的函数,y
则可以这样做,例如:
从scipy.misc导入logsumexp 将numpy导入为np xmin = 1e-15 xmax = 1e-5 #获取x的值以对数间隔 xvs = np.logspace(np.log10(xmin),np.log10(xmax),10000) #在xvs上评估您的功能 赖斯= lny(xvs) #执行梯形规则集成 增量= np.log(np.diff(xvs)) logI = -np.log(2。)+ logsumexp([logsumexp(lys [:-1] + deltas),logsumexp(lys [1:] + deltas)])
该值logI
是所需积分的对数。
显然,如果需要设置,则此方法将无效xmin = 0
。但是,如果您对积分有一些非零的正下限,则只需计算积分中的点数xvs
即可找到一个积分收敛的数字。