• ベストアンサー

Maximaが積分を行ってくれません

Maximaで関数f(x)をxで不定積分しました。 するとf(x)の前に積分記号が付いただけの結果が出ます。(定積分の場合も同じで記号の上下に数値があるだけです) 単純な関数だと計算してくれます。 しかし、今回用いる関数が非常に複雑(指数eの肩に対数log、対数の中身も指数の分数・・など)(必要な場合はお教えします)なのですがそのような結果が出力されました。 積分能力が低いため複雑な関数は出来ないのでしょうか?積分する際の留意点などあるのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • info22
  • ベストアンサー率55% (2225/4034)
回答No.4

#2,#3です。 少し工夫すると数式処理ソフトMaple(有料ライセンス)と無料の計算サイト WolframAlphaで積分 ∫[0→∞]f(x)dxの数値積分が出来ました。 f(x)の計算式が長すぎてパソコン等の計算パワー不足で 計算できなかったようです。 定数項 b=exp((1/(1-exp(-1)))*log(a/(1-exp(-1))) を予め括りだして計算しておけば f(t)=exp((-exp(-1)+exp(-2))*x)*exp(1/(1-exp(-1))*log(α/((1-exp(-1)) *(((exp((-exp(-1)+exp(-2))*x)-exp(x))/(-exp(-1)+exp(-2)-1)) +exp((-exp(-1)+exp(-2))*x)/(exp(-1)-exp(-2))))))) =b*exp((-exp(-1)+exp(-2))*x)*exp(-log(((exp((-exp(-1)+exp(-2))*x)-exp(x))/(-exp(-1)+exp(-2)-1))+exp((-exp(-1)+exp(-2))*x)/(exp(-1)-exp(-2)))/(1-exp(-1))) と変形出来て、bを定数として与えてやれば数値積分できます。 α=1の時、b=2.065997986, ∫[0→∞]f(x)dx=0.2879173714 α=2の時、b=6.185179888, ∫[0→∞]f(x)dx=0.8619663461 α=3の時、b=11.74693607, ∫[0→∞]f(x)dx=1.637052397 などと計算結果が得られました。 WolframAlphaサイトで積分の前の定数bに予め上のbの式で計算した数値を 掛けておいて後は残りの[0→∞]の積分の式を書き込んで実行するだけで 数値積分をしてくれます。 ↓の例はα=2の場合で積分の前の定数はαに対するbの数値です。 http://www.wolframalpha.com/input/?i=6.185179888*integrate%28exp%28%28-exp%28-1%29%2Bexp%28-2%29%29*x%29*exp%28-ln%28%28exp%28%28-exp%28-1%29%2Bexp%28-2%29%29*x%29-exp%28x%29%29%2F%28-exp%28-1%29%2Bexp%28-2%29-1%29%2Bexp%28%28-exp%28-1%29%2Bexp%28-2%29%29*x%29%2F%28exp%28-1%29-exp%28-2%29%29%29%2F%281-exp%28-1%29%29%29%2C%5Bx%2C0%2Cinfinity%5D%29 αを変えてbを計算しておいて積分の前の定数をbの値に置き換えて やってみてください。 便利なサイトや数式処理ソフトも工夫次第で積分をしてくれます。 元のf(x)をそのまま積分させても積分してくれません。 積分の式を表示してくれるだけです。 なお、こういったやり方で数値積分できない場合は A#3で紹介した「ガウス-ラゲール(Gauss-Laguerre)積分公式」を使って 数値積分するしか方法がないでしょうね。 Maximaではやはり、まだ計算パワー不足なのか計算できませんでした。

vks5k
質問者

お礼

ありがとうございます!! ここまで調べていただけるとは思いませんでした。 やはりパワー不足ということがありえるんですね。 すぐに確かめてみたいと思います。 ありがとうございます!

vks5k
質問者

補足

0から無限大は無事積分できました! ありがとうございます。 しかし、0でなく4等のほかの数値から無限大で積分すると数値を出力されませんでした。 このような場合はできないのでしょうか? Wolfram Alphaの使い方が良く分からないのでまだ使いこなせていません。 何度もすみません。

その他の回答 (3)

  • info22
  • ベストアンサー率55% (2225/4034)
回答No.3

#2です。 お書きのf(x)の括弧の数(右括弧「)」が1つ足りない)が合わないですね。 >exp((-exp(-1)+exp(-2))*x)*exp(-((-1)/(1-exp(-1)))*log(α/((1-exp(-1))*(((exp((-exp(-1)+exp(-2))*x)-exp(x))/(-exp(-1)+exp(-2)-1))+exp((-exp(-1)+exp(-2))*x)/(exp(-1)-exp(-2))))) 何処に補えば良いのでしょうか? 他の有料ライセンス数式処理ソフトでもお書きのf(x)の積分は解析的な積分は不可能でしょう。 原因はlog(α/(...))の「...」の式が長くて複雑なために積分不可能のなっていると思われます。 αは文字定数のまま積分しないといけない定数ですか? αが既知の定数なら、数値として与えて、[0,∞]区間の積分を厳密式で計算できなくても、積分区間[0,∞]のガウス積分「ガウス-ラゲール(Gauss-Laguerre)積分」を使って数値積分すれば解決しませんか? http://home.hiroshima-u.ac.jp/atanaka/CmpPhys/EX-1/TEXT1.pdf

vks5k
質問者

補足

ありがとうございます。 ご指摘通り、右括弧は最後に付け加えるのを忘れていました。 αは既知の定数です。 ガウス-ラゲール積分?初めて耳にしました。勉強してみます。

  • info22
  • ベストアンサー率55% (2225/4034)
回答No.2

どんな関数でも積分してくれるわけではありません(積分不可能な関数もあります)。 積分できない関数も存在しますし、非常に長い式になる場合も積分してくれない場合もあります。積分のパワー不足で積分してくれない場合もあります。 被積分関数を適当に変数変換したり、書き換えたり、工夫次第では積分してくれる場合もあります。 従って、実際の被積分関数、あるいはMaxima表現の積分の式を 具体的に書いていただかないとチェックもできません。

vks5k
質問者

補足

返信ありがとうございます。 f(x)を載せました。 そうですね、変換して積分してくれるよう試みるべきでした。 ありがとうございます。

  • Ginzang
  • ベストアンサー率66% (136/206)
回答No.1

どんな関数を積分しようとしたのかが分からなくては、回答しようがないが…。 是非、教えて欲しい。 一般論として、複雑な関数の積分はMathematicaでも計算できないだろう。 積分は微分と違い、常に計算できるとは限らない。いつでもこのことを念頭においておくべきだろう。

vks5k
質問者

補足

ありがとうございます。 f(x)を載せます。 exp((-exp(-1)+exp(-2))*x)*exp(-((-1)/(1-exp(-1)))*log(α/((1-exp(-1))*(((exp((-exp(-1)+exp(-2))*x)-exp(x))/(-exp(-1)+exp(-2)-1))+exp((-exp(-1)+exp(-2))*x)/(exp(-1)-exp(-2))))) これをmaximaやgnuplotでグラフ表示を行うとxの正の極限は0に収束している様子が分かります。 最終的にf(x)を0から∞で積分して数値を算出したいのですが、上記のように積分を行ってくれませんでした。 よろしくお願いします。

関連するQ&A

専門家に質問してみよう