• 締切済み

mathematicaで積の順序を保存したまま計算したい

K[i] w=F[i,w]と定義されていて、K[i]は数列で出せるようになっていて、Fも定義されています。 すると、例えばK[4]はK[1],K2].K[3]で書かれています。 そこで、そいつをwに演算したいのですが、 K[i_] w ->F[i,w]等としてやってみようと思っていました。 ところが、勝手にw K[i]とかにされてしまってうまく行きませんでした。 順序をかえないで、少しずつ K[i_] w ->F[i,w] をしようと思っていたのですが。 また、下のような場合があるので、 (K[1]^2+k[2]+k[3]) w K[1]^3=K[1] K[1] K[1] とするコマンドも分かると助かるのですが。 ちなみに演算子**もつかってみましたが、 ExpandAll[(a+b)**w]=(a+b)**w となり、順序は保存するものの、今度は展開ができません。 (a+b)**w=a**w+b**b となってほしいのです。 どなたか知恵をお貸しください。

みんなの回答

  • nakaizu
  • ベストアンサー率48% (203/415)
回答No.1

K[i_]->F[i,w]/w と代入すればよいと思いますが、これではダメなのでしょうか。 Mathematicaの内部のデータ構造と表示とは異なっているので、複合的な代入はうまくいかないことが多くなります。バージョンで違うかもしれませんが、掛け算の順序の違いは影響していないようです。 データ構造が多重になるとパターンマッチングがうまく働かないのが原因のように思われます。 実例 k[2] w + 2k[3] w /. k[i_]w -> k[i, w] k[2, w] + 2 k[3, w] 上の例は大丈夫 k[2]w( 2 k[3] w + 1) /. k[i_] w -> k[i, w] (1 + 2 w k[3]) k[2, w] 式が括弧により多重になっているので失敗したものと思われる k[2]w( 2 k[3] w + 1) /. k[3] w -> k[3, w] w k[2] (1 + 2 k[3, w]) パターン検索_を使っていないので一応成功 k[2]w( 2 k[3] w + 1) /. k[i_] -> k[i, w]/w k[2, w] (1 + 2 k[3, w]) 成功 べき乗を積の形にしてもすぐ元に戻ってしまうので、そのようなコマンドがあっても役に立たないと思います。

monohon
質問者

補足

お知恵を貸してくださりありがとうございます。 K[i_]w->F[i,w]でなくて K[i_]->F[i,w]/wを用いるのは面白いなと思いました。 ただ、説明不足だったと思いますが、 (K[1]K[1]+k[2]) w not equal K[1]w K[1] w + K[2] w であり、 (K[1]K[1]+k[2]) w = K[1]K[1]w +K[2]w =F[1,K[1]w] + F[2,w] =F[1,F[1,w]] + F[2,w] というように汎関数的に適用するようなルールになっていて 難しいのです。 線形汎関数ですので、 F[i,a*p(w)]=a*F[i,p(w)] などとしたいのですが、いちいちa*の後のパターンp(w)を指定して あげて変形しています。もっといい方法がないのかなあと思っています。

関連するQ&A