ログ-ログスペースの統合


10

私は一般に、ログログスペースでよりスムーズでより適切に動作する関数を使用しています。そのため、補間/補外などを実行し、非常にうまく機能します。 これらの数値関数をログ-ログスペースに統合する方法はありますか?

つまりscipy.integrate.cumtrapz st を見つけるために、ある種の単純な台形ルールを使用して累積積分を実行することを望んでいます(たとえば、Pythonではを使用)。Fr

Fr=0ryバツdバツ

しかし、私はyx(可能な場合)の代わりに、値l o g x を使用することを望んでいます。logylogバツyバツ


このリンク(my.originlab.com/forum/topic.asp?TOPIC_ID=1251)が見つかりました。これは、通常の方法と同じように進むようです。勾配を計算し、ログ-ログスペースでインターセプトします。次に、lin-linスペースに変換し、統合して評価します。
MrMas

回答:


6

変数を変更するだけです。設定= L O G X Bを= L O G Y X 。積分はa=log(x)b(a)=log(y(x))

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

あなたがから統合しているので、少し注意する必要があります。正確に何をしなければならないかは、y x がどのように見えるかに依存します。y(x


お返事をありがとうございます!しかし、これは事実上、線形空間で積分を実行するだけだと思います。多分私は何か不可能なことを求めています...
DilithiumMatrix

2
いいえ、これはログ領域で不可欠です。離散化するとき、は線形空間ではなく対数空間で同じサイズになります。da
ダマスカス鋼、

1
@DilithiumMatrixは正しい:値の離散化は対数空間で行われますが、y値の補間は線形空間で行われます。したがって、台形規則を使用する場合、効果的に統合される関数は、対数のx軸と線形のy軸を持つプロットで区分的に線形になります。xy
burnpanck

3

私は、Pythonを使用していないが、私が正しく理解すれば、その後による 次のようなものを考えている Fを = I N T E G R A T EYXF = [ F 1は、グリッドにわたる積分をサンプリングするベクトルである。

Fr=0ryバツdバツ
F=tegrateyバツ
F=[F1F]バツ

しかし、あなたはのサンプルはありませんyは、ではなく、あなたはのサンプル持つX = ログX Y = ログyとバツyバツ^=ログバツy^=ログy

もちろん、最も簡単な方法は次のようになり しかしため、これは、エラーが発生しやすいであろうY xはも、滑らかでありませんしかしYXです。

F=tegrateexpy^expバツ^
yバツy^バツ^

今、台形規則は、本質的に、あなたの入力を前提とし区分的に線形です。あなたがそれを前提とするため、単純な一般化は次のようになりますので、Yxは区分的に線形です。yバツy^バツ^

この場合には、定義、次のものが Δ F K = X K + 1つのx のk Y X D 、X = X K + 1つの、X k個のE yはX E 、X、D X = X K +ΔFk=Fk+1Fk

ΔFk=バツkバツk+1yバツdバツ=バツ^kバツ^k+1ey^バツ^eバツ^dバツ^=バツ^kバツ^k+1yバツ^dバツ^

次いで、規定は、次のものが Y、K + TY K + T Δ Y K 及びYT のE bはTと、A = E Y K + X K及びB = Δt=バツ^バツ^k/Δバツ^k

y^k+ty^k+tΔy^k
ytaebta=ey^k+バツ^kb=Δy^k+Δバツ^k

一体となるように

ΔFkaΔバツ^01ebtdt=aΔバツ^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バツy^バツ^バツ^Fバツ^1=0


あなたの(非常に明確な)応答に感謝しますが、@ DamascusSteelへの応答で述べたように、これは積分を線形-線形空間に戻し、対数空間の利点を失うだけだと思います。
DilithiumMatrix、2015年

1
@DilithiumMatrix:これは、DamascusSteelの回答と同じではありません。台形ルールをDamascusSteelの回答に適用すると、得られないことに注意してください。expb1b

3

バツyバツ+1y+1y=Cバツ=lny/y+1/lnバツ/バツ+1C=lnylnバツ

ΔF=バツバツ+1Cバツdバツ={C+1バツ+1+1バツ+11Clnバツ+1lnバツ=1
=1

3

以前の回答のいくつかの変数の変更といくつかのエラーには少し混乱があると思います。対数関数の積分は、積分の対数ではありません。一般に、ログの積分を知っている関数の積分を書き出すことは難しいと思います。誰かがその方法を知っているなら、私は興味があります。

一方、上記の@Stefanのソリューションは、ログログスペースでの関数の統合を回避する方法です。開始点は、処理する関数が十分に小さいセグメントのログ-ログスペースで線形であることです。

ここに画像の説明を入力してください

ログy1=メートル1ログバツ1+1
ログy2=メートル1ログバツ1+1

メートル11

2つを差し引くと、次のことがわかります。

メートル1=ログy1logy2ログバツ1logバツ2

1=ログy1メートル1ログバツ1

対数-対数空間でセグメントの方程式が直線に近い場合、通常の(線形)空間では、セグメントの方程式は指数関数に近くなります。

yバツバツメートルe

このセグメントの分析公式があれば、統合は簡単です。

バツ1バツ2yバツdバツ=e1メートル1+1バツ2メートル1+1バツ1メートル1+1ために メートル1

バツ1バツ2yバツdバツ=e1ログバツ2バツ1ために メートル=1

これはごまかしのように感じますが、これは対数ログスペースでサンプリングされているため、線形スペースの関数を対数ログスペースから派生したパラメーターを使用して指数関数に近似できます。


これは素晴らしい@elenapascalです。これは3年以上私を悩ませてきました。これが解決策(またはそれに非常に近い)だと思います。私はあなたの最後の関係を完全にはフォローしていません、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。それはログを与えます。私はあなたの2番目の投稿をフォローしているのかわかりません
Elena Pascal

私は同じことを理解しましたが、あなたの説明を読むまで完全には理解していませんでした
DilithiumMatrix

1

私が使用するソリューションは、基本的には台形ルールの実装であり、scipy.misc.logsumexp精度を維持するために関数を使用します。lnyの対数を返す関数がある場合、y次のようにできます。

scipy.miscからのインポートlogsumexp
npとしてnumpyをインポートする

xmin = 1e-15
xmax = 1e-5

#対数的にx間隔の値を取得
xvs = np.logspace(np.log10(xmin)、np.log10(xmax)、10000)

#xvsで関数を評価する
lys = lny(xvs)

#台形ルール統合を実施
deltas = np.log(np.diff(xvs))
logI = -np.log(2。)+ logsumexp([logsumexp(lys [:-1] + deltas)、logsumexp(lys [1:] + deltas)])

logIは、必要な積分の対数です。

明らかにこれを設定する必要がある場合、これは機能しませんxmin = 0。ただし、積分にゼロ以外の正の下限がある場合は、ポイントの数を試してxvs、積分が収束する数を見つけることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.