整合到log-log空间


10

我正在使用的函数通常在对数-对数空间中更平滑,更好地表现---所以我可以在其中执行内插/外推等,并且效果很好。 有没有办法在对数-对数空间中集成这些数值函数?

即我希望使用某种简单的梯形规则来执行累积积分(例如在python中,使用scipy.integrate.cumtrapz),以找到一些 stF(r)

F(r)=0ry(x)dx

但是我希望使用值和,而不是和(如果可能)。log(y)log(x)yx


我找到了此链接(my.originlab.com/forum/topic.asp?TOPIC_ID=1251),该链接似乎与我通常使用的方式相同:计算斜率并在对数日志空间中进行拦截。然后转换为lin-lin空间,进行整合和评估。
MrMas

Answers:


6

您可以更改变量。设置,。积分变为a=log(x)b(a)=log(y(x))

F(r)=log(r)exp(a+b)da

您必须要小心一点,因为您正在从进行集成。您必须确切执行的操作取决于外观。y(x)


感谢您的答复!但是我认为这实际上只是在线性空间中执行积分。也许我是在问一些不可能的事情……
DilithiumMatrix 2015年

2
不,这是对日志空间的积分。离散化时da在日志空间(而不是线性空间)中大小相等。
大马士革钢铁厂

1
@DilithiumMatrix是正确的: x 值在对数空间中,但 y值发生在线性空间中。因此,如果使用梯形法则,则有效积分的函数在具有对数x轴和y线性轴的图中是分段线性的。
burnpanck '18

3

我不使用python,但如果我理解正确,则可以

F(r)=0ry(x)dx
你在想像
F=integrate(y,x)
哪里 F=[F1,...,Fn] 是在网格上采样积分的向量 x

但是您没有样品 xy,但是您有以下示例 x^=log(x)y^=log(y)

当然,最简单的方法是

F=integrate(exp(y^),exp(x^)),
但这容易出错,因为 y(x) 即使不平滑 y^(x^) 是。

现在,梯形法则基本上是假设您的输入y(x)是分段线性的。因此,简单的概括就是让您假设y^(x^) 是分段线性的。

在这种情况下,定义 ΔFk=Fk+1Fk, 你有

ΔFk=xkxk+1y(x)dx=x^kx^k+1ey^(x^)ex^dx^=x^kx^k+1y~(x^)dx^

然后,定义 t=(x^x^k)/Δx^k, 你有

y^k+ty^k+tΔy^k
y~(t)aebt,带有 a=ey^k+x^kb=Δy^k+Δx^k

所以积分变成

ΔFkaΔx^01ebtdt=aΔx^eb1b

在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]);

希望这可以帮助!

(编辑:我的答案与我打字时输入的大马士革钢给出的答案更为简洁。唯一的区别是,我尝试针对“特殊情况 y(x)“是分段线性的 y^(x^) 离散离散 x^ 网格,与 F(x^1)=0


感谢您的答复(非常明确的答复),但是正如我刚刚对@DamascusSteel所说的那样-我认为这只是将积分还原为线性-线性空间,而失去了对数空间的好处。
DilithiumMatrix

1
@DilithiumMatrix:这与DamascusSteel的答案不同。请注意,将梯形规则应用于DamascusSteel的答案不会得出exp(b)1b因子。
burnpanck '18

3

如果函数在对数-对数图中看起来很平滑,则可以在每个时间间隔上使用幂定律进行插值(幂律在对数对数中当然是线性的)。因此,在两点之间(xi,yi)(xi+1,yi+1) 假设 y=Cixni 在间隔内 i,您获得 ni=ln(yi/yi+1)/ln(xi/xi+1)Ci=ln(yi)niln(xi)。区间对积分的贡献i 然后

ΔFi=xixi+1Cixnidx={Cini+1(xi+1ni+1xini+1),ni1Ci(lnxi+1lnxi),ni=1,
您显然需要一定的容忍度来识别特殊情况 ni=1 在您的实施中。

3

我认为在某些先前的答案以及某些错误中,变量的更改有些混乱。对数函数的积分不是积分的对数。我认为通常很难知道其日志的整数来写出函数的整数。如果有人知道该怎么做,我将很感兴趣。

同时,@ Stefan的上述解决方案是解决在日志-日志空间中集成功能的方法。起点是您要处理的函数在log-log空间中对于足够小的段而言是线性的。

然后可以在线段端点处写直线方程: 在此处输入图片说明

log(y1)=m1log(x1)+n1
log(y2)=m1log(x1)+n1

哪里 m1 是线的斜率, n1 是它的y截距。

通过将两者相减,可以找到:

m1=log(y1)log(y2)log(x1)log(x2)

从替代:

n1=log(y1)m1log(x1)

如果在对数-对数空间中,线段的方程式接近直线,则在法线(线性)空间中,线段的方程式接近指数式:

y(x)xmen

如果我们对此部分有分析公式,则很容易集成:

x1x2y(x)dx=en1m1+1(x2m1+1x1m1+1),for m1

x1x2y(x)dx=en1logx2x1,for m=1

感觉有点像作弊,但这是在对数对数空间中进行采样,以便我们可以使用从对数对数空间派生的参数将线性空间中的函数近似为指数。


@elenapascal真是太好了,这已经困扰我三年多了,我认为这是(或非常接近)解决方案。我不太了解您的上一个关系,我认为y上的积分不等于log(x2 / x1)
DilithiumMatrix

特别是,如果我在左侧获取积分的对数,那么我会得到与右侧相似的项,但是用log([x_2/x_1]^{m_1+1} + 1),即对数的参数中有一个额外的+1
DilithiumMatrix

今天,它也困扰着我很多,直到我写完它,我才意识到@Stefan发表了相同的答案。对于m = -1,您只需将其替换为y的定义:y(x)= e ^ n / x。那给出日志。我不知道我按照你的第二个职位
埃琳娜帕斯卡尔

我只是意识到同样的事情,但是直到我读完你的解释之后我才完全明白
DilithiumMatrix

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即可找到一个积分收敛的数字。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.