Re: Grouping similar indices together in an expression
- To: mathgroup at smc.vnet.net
- Subject: [mg65277] Re: Grouping similar indices together in an expression
- From: "David Sanders" <dpsanders at gmail.com>
- Date: Thu, 23 Mar 2006 06:58:44 -0500 (EST)
- References: <dvosko$j5k$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Hi, Thanks very much to everyone for their replies. I've certainly learnt a lot about Mathematica by looking at them! I apologise for not explaining the problem clearly; I was trying to reduce it to its essentials, but went too far. The "indices" i, j etc. represent positions, and are integers. a[i] etc. are random variables associated to those positions. The random variables at different positions (with different indices) are independent, but those at the same position are not. The function which I wrote as "F" is an expectation; I will now write it as Ex. What I need to calculate is the expectation of terms such as a[i]^2 a[i+1] b[i] b[i+1]. This is a product of random variables which take real values. The terms can be raised to positive integer powers and the indices can be things like i+1, representing the position next to position i. I thus need Ex[ a[i]^2 a[i+1] b[i] b[i+1] ] = Ex[ a[i]^2 b[i] ] Ex[ a[i+1] b[i+1] ] Using everybody's suggestions, I have put together the following code to do this: ExtractIndex[term_] := If[Head[term]===Power, term[[1,1]], term[[1]]] ExtractIndices[expr_] := If[Head[expr] =!= Times, {ExtractIndex[expr]}, Union[Map[ExtractIndex, Apply[List, expr]]]] MakeList[expr_] := If[Head[expr] === Times, Apply[List, expr], {expr}] ExtractTerms[expr_, index_] := Ex[Apply[Times,Select[MakeList[expr], ExtractIndex[#] \[Equal] index&]]] Expec[expr_] := Apply[Times,MapThread[ExtractTerms[expr, #]&, {ExtractIndices[expr]}]] Expec[a_+b_] := Expec[a] + Expec[b] Then Expec[ a[i] a[j] b[i] b[j] + a[i+1] a[j] b[i+1] b[j] ] gives Ex[a[i]^2 b[i]] Ex[a[j] b[j]] + Ex[a[1+i] b[1+i]] Ex[a[j] b[j]] as desired. ------- Now what I need to do is tell Mathematica the rules for computing the expectations at a site. For simplicity let us suppose that they factorise, even though in my real application that is not the case. Then I want something like Ex[a[i_]^alpha_ b[i_]^beta_] = A^alpha B^beta But this does not capture e.g. Ex[a[i] b[i]]. How can I include these without giving them explicitly? Apologies for the length of this post, Best wishes, David.