Re: Collecting Positive and Negative Terms
- To: mathgroup at smc.vnet.net
- Subject: [mg111741] Re: Collecting Positive and Negative Terms
- From: TJR <tilminator at googlemail.com>
- Date: Thu, 12 Aug 2010 05:27:36 -0400 (EDT)
- References: <i3tnsg$s5l$1@smc.vnet.net>
On 11 Aug., 10:44, Michael Knudsen <micknud... at gmail.com> wrote:
> Hi,
>
> I'm currently doing calculations often involving very large
> expressions with a lot of unknown parameters. To investigate whether
> an expression is positive or negative, I usually expand it using the
> Expand command and manually copy and paste the positive and negative
> terms into new expressions and simplify them using FullSimplify. In my
> case it often turns out that comparing the two is much easier than
> looking at the entire expression as a whole.
>
> However, it's very cumbersome to do all this manually. Is there an
> easy way in Mathematica to pick out terms begging with + (or -) in a
> sum?
>
> Thanks,
> Michael Knudsen
It's a hard problem in general, but I suppose you know a lot about
stuff that occurs in your specific application. So use pattern
matching.
separatePositiveNegative::usage= "separatePositiveNegative[hugesum]
expands a hugesum, turns it into a list of summands, and then subsums
those summands deemend positive / negative by myPositiveQ. Returns
{...positive parital sum ..., ... negative partial sum...}.";
Clear[separatePositiveNegative];
separatePositiveNegative[hugesum_] := Module[{sowReapKey, f},
f[sowReapKey[_], list_] := Plus @@ list;
hugesum //
Expand //
If[Head[#] == Plus, List @@ #, {#}] & //
Reap[Map[
If[myPositiveQ[#], Sow[#, sowReapKey["+"]];,
Sow[#, sowReapKey["-"]];] &,
#], sowReapKey[_], f][[2]] &
];
myPositiveQ::usage="myPositiveQ[expr_] tests if expr is positive or
negative. Always returns True/False, but not always correctly. The
algorithm relies on pattern matching. expr is broken up recursively,
and the smallest bits are guessed positive/negative. Modify the
definition of myPositiveQHelper to tweak the patterns.";
Clear[myPositiveQ, myPositiveQHelper];
myPositiveQ[
expr_] := (expr //
myPositiveQHelper) /. {myPositiveQHelper -> ((Print[
"deemed positive by myPositiveQHelper: ", #]; 1) &)} //
Positive;
myPositiveQHelper[Times[exp1_, exp2__]] :=
Times @@ Map[myPositiveQHelper, {exp1, exp2}];
myPositiveQHelper[Power[base_, exponent_/;!OddQ[exponent]]] = 1;(*no
complex numbers*)
myPositiveQHelper[Power[base_, exponent_/;OddQ[exponent]]] :=
myPositiveQHelper[base];(*no complex numbers*)
myPositiveQHelper[exp_Symbol] = 1;
(*override as needed, e.g. myPositiveQHelper[alwaysNegative]=-1; *)
myPositiveQHelper[exp_ /; NumericQ[exp]] := Sign[exp];