Re: Simplifying constants
- To: mathgroup at smc.vnet.net
- Subject: [mg18586] Re: [mg18489] Simplifying constants
- From: BobHanlon at aol.com
- Date: Tue, 13 Jul 1999 01:01:23 -0400
- Sender: owner-wri-mathgroup at wolfram.com
Morten, equiv = (A == b + c + d + e); The possible substitutions are subst = (Solve[equiv, #][[1]] & /@ Cases[equiv[[2]], _Symbol]) {{b -> A - c - d - e}, {c -> A - b - d - e}, {d -> A - b - c - e}, {e -> A - b - c - d}} Given an expression f f = 2b + 6c + 5d + 3e + (b + c + d + e)*Sin[x]; soln = Simplify[Prepend[(f /. subst), f]] {2 b + 6 c + 5 d + 3 e + (b + c + d + e) Sin[x], 2 A + 4 c + 3 d + e + A Sin[x], 6 A - 4 b - d - 3 e + A Sin[x], 5 A - 3 b + c - 2 e + A Sin[x], 3 A - b + 3 c + 2 d + A Sin[x]} You then need some criterion to decide which form of the expression is preferred. LeafCount might be a common criteria. Sort[soln, LeafCount[#1] < LeafCount[#2] &] {5 A - 3 b + c - 2 e + A Sin[x], 2 A + 4 c + 3 d + e + A Sin[x], 3 A - b + 3 c + 2 d + A Sin[x], 6 A - 4 b - d - 3 e + A Sin[x], 2 b + 6 c + 5 d + 3 e + (b + c + d + e) Sin[x]} % // First 5 A - 3 b + c - 2 e + A Sin[x] Automating this process for at least simple cases: simplifyWith[expr_, lhs_Symbol == rhs_] := Module[{varList, subst}, varList = Cases[rhs, _Symbol, Infinity]; subst = (Solve[lhs == rhs, #][[1]] & /@ varList); First[ Sort[Simplify[Prepend[expr /. subst, expr]], LeafCount[#1] < LeafCount[#2] &]]]; simplifyWith[f, equiv] 5 A - 3 b + c - 2 e + A Sin[x] Bob Hanlon In a message dated 7/8/99 3:40:39 AM, mgd at com.dtu.dk writes: >I am working with some annoyingly long equations that I want to simplify >by including one set of parameters in a constant (or function) A, and >another in B and so on. > >You can easily do: > >A = b+c+d+e > >but what I want to do is the reverse: > >b+c+d+e = A > >and use this information to reduce the equations. Does anybody know how >to do this? >