重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【6/2終了】教えて!gooアプリ版

f(x) > 0 が分かっている関数に関しまして [-π, π]の区間の積分をしていたのですが、これをlog(f(x))の形の積分に変形できないかと考えています。

int_[-pi]^[pi] (f(x)) dx = int_[?]^[?] (log(f(x)) dt

t = log(x)とおいた場合、x=-πの時に log(-π)となり計算ができなく行き詰まりました。

上記のような変形は可能でしょうか?
可能な場合、どのような変数変換をするのがいいでしょうか?

A 回答 (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 となって,
小さい値に変換はできますが,この場合掛け算になるので桁落ちするでしょうね。

こんな感じで解決できませんか?
    • good
    • 0
この回答へのお礼

詳細な回答ありがとうございます。

数値計算についてはまだまだ学習が足りないのですが、上記の方法参考になります。

総和における情報落ち回避方法とprod exp(g(x))での計算、非常に参考になりました。

ありがとうございます。

お礼日時:2014/10/07 16:42

なぜ 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) の形によって,その都度,都合のいい変換を考えた方がいいかなと思います。

私は数学が専門ではないので,そういった分野の方でしたら,
何か特殊な解法を持っているのかもしれませんが…。
    • good
    • 0
この回答へのお礼

色々調べていただきありがとうございます。

一般的に変換できるということでもなさそうなのですね。

実際にやりたかったことは、ある複雑な数値計算の出力を積分する必要があるのですが、出力値が5桁くらいの幅を持っています。log(y)としたら桁の変化が小さく抑えられて、その時に積分精度があがるのだろうか、という疑問を持ってこのような質問をしました。

integ{f(x)}dxの値を再現する時にinteg{log(f(x))}dxのexpを取るといい、ということでもないのでしょうね。

解析的な関数で自分で式変形を試みたのですが、積分がどうもうまく導出できませんでした。

お礼日時:2014/10/07 12:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!