- ベストアンサー
f(x)の積分をlog(f(x))に変形
f(x) > 0 が分かっている関数に関しまして [-π, π]の区間の積分をしていたのですが、これをlog(f(x))の形の積分に変形できないかと考えています。 int_[-pi]^[pi] (f(x)) dx = int_[?]^[?] (log(f(x)) dt t = log(x)とおいた場合、x=-πの時に log(-π)となり計算ができなく行き詰まりました。 上記のような変形は可能でしょうか? 可能な場合、どのような変数変換をするのがいいでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>> integ{f(x)}dxの値を再現する時にinteg{log(f(x))}dxのexpを取るといい これは求める値が変わってしまいますからね。 >> ある複雑な数値計算の出力を積分する必要があるのですが、出力値が5桁くらいの幅 えっと,数値積分する際に,情報落ちするのではないかということですかね。 5桁くらいの足し算なら誤差はそれほど出ないと思いますよ。 どうしても心配なら,ソートして小さい順に足していったらいいのではないですかね。 -pi -- pi を 2n 等分して,h = pi / n, x_i = -pi + i * h (i = 0 -- 2n) とすれば, 例えばシンプソン法で求めるなら, int_{-pi}^{pi} = (h / 3) * ( (y_0 + y_{2n}) + 4 * sum_{i = 1}^{n} y_{2i - 1} + 2 * sum_{i = 1}^{n - 1} y_{2i} ) となるので,あらかじめ y[i] に値を読み込んでおいて, 1. y[2i - 1] で昇順ソート,y[1] -- y[2n - 1] で総和を出す => S1 2. y[2i] で昇順ソート,y[2] -- y[2n - 2] で総和を出す => S2 3. S = (y[0] + y[2n] + 4 * S1 + 2 * S2) * (h / 3) で求めれば,より誤差は小さくなると思いますよ。 y[0] と y[2n] も S2 に足しておいて, あとで y[0] + y[2n] を引いたほうが安全ですかね。 あるいは,int を sum にして,S = sum f(x) (係数は無視)という発想でいくなら, g(x) = -f(x) として,S' = sum g(x) = -S とできます。 この exp を取れば, exp S' = exp (sum g(x)) = prod exp(g(x)) となるので,exp(g(x)) の積を取って,log を取っても求められますよ。 f(x) > 0 なら g(x) < 0 が保証されるので,exp(g(x)) < 1 となって, 小さい値に変換はできますが,この場合掛け算になるので桁落ちするでしょうね。 こんな感じで解決できませんか?
その他の回答 (1)
- tsuda16
- ベストアンサー率85% (6/7)
なぜ t = log(x) とおいたのかよくわからないのですが…。 f(x) = x のときで,x と t を入れ替えたのですかね? 何も考えずに,一般解を出そうと思うと,f(x) = g(t) とおく。両辺微分して, f'(x) dx = g'(t) dt したがって, f(x) dx = g(t) * g'(t) / f'(x) dt (x は f(x) = g(t) を満たす) 右辺が log(f(t)) dt になってほしいので, g(t) * g'(t) / f'(x) = log(f(t)) となる g(t) を見つけることができれば,変換可能だと思います。 f(x) > 0 が保障されているのなら, この変換の下では質問にあったような座標変換のエラーは起きないと思います。 で,しばらく考えたんですが,残念ながら g(t) が決定できるような f(x) は思いつきませんでした。 f(x) の形によって,その都度,都合のいい変換を考えた方がいいかなと思います。 私は数学が専門ではないので,そういった分野の方でしたら, 何か特殊な解法を持っているのかもしれませんが…。
お礼
色々調べていただきありがとうございます。 一般的に変換できるということでもなさそうなのですね。 実際にやりたかったことは、ある複雑な数値計算の出力を積分する必要があるのですが、出力値が5桁くらいの幅を持っています。log(y)としたら桁の変化が小さく抑えられて、その時に積分精度があがるのだろうか、という疑問を持ってこのような質問をしました。 integ{f(x)}dxの値を再現する時にinteg{log(f(x))}dxのexpを取るといい、ということでもないのでしょうね。 解析的な関数で自分で式変形を試みたのですが、積分がどうもうまく導出できませんでした。
お礼
詳細な回答ありがとうございます。 数値計算についてはまだまだ学習が足りないのですが、上記の方法参考になります。 総和における情報落ち回避方法とprod exp(g(x))での計算、非常に参考になりました。 ありがとうございます。