Re: Substitute expressions with FullSimplify
- To: mathgroup at smc.vnet.net
- Subject: [mg108721] Re: Substitute expressions with FullSimplify
- From: Guido Walter Pettinari <coccoinomane at gmail.com>
- Date: Mon, 29 Mar 2010 05:21:58 -0500 (EST)
- References: <hoi2n9$qj7$1@smc.vnet.net> <hoklk6$snd$1@smc.vnet.net>
Thank you again Andrzey! I confirm that setting
SetAttributes[replacementFunction, Listable]
make replacementFunction work also for functions that accept lists as
arguments.
Cheers,
Guido
On Mar 28, 11:56 am, Andrzej Kozlowski <a... at mimuw.edu.pl> wrote:
> I think all you need to do is add :
>
> SetAttributes[replacementFunction, Listable]
>
> If you do that, you should get:
>
> replacementFunction[HypergeometricPFQ[{a + b}, {d, e}, x],
> a + b - c,
> {a}]
>
> {HypergeometricPFQ[{c}, {d, e}, x]}
>
> Of course it is quite likely that one can still find cases where the
> function does not work, but if and when they are found it should be easy
> tot modify it to include them too.
>
> Andrzej Kozlowski
>
> On 28 Mar 2010, at 11:06, Guido Walter Pettinari wrote:
>
>
>
> > Thank you all for the answers!
>
> > @Andrzej
> > Thank you for pointing me to replacementFunction! It works well in
> > most cases, however it seems to fail when the analyzed expression
> > contains lists.
>
> > For example, this works fine:
>
> > replacementFunction[HypergeometricPFQ [ a + b, d, x ], a + b - c, {a}]
> > -> HypergeometricPFQ[c, d, x]
>
> > however:
>
> > replacementFunction[HypergeometricPFQ[ {a + b}, {d, e}, x ], a=
+ b
> > - c, {a}]
>
> > returns this error:
> > Part::partw: Part 2 of {{{1},c}} does not exist. >>
> > HypergeometricPFQ::hdiv: HypergeometricPFQ[{{{1},c}}[[2]],{{0},e},x]
> > does not exist. Arguments are not consistent. >>
>
> > I cannot avoid using a list as an argument since I need to compute
> > 1F2. Moreover, I am afraid I have not the expertise to fix
> > replacementFunction by myself.
>
> > As a side note, the code for replacementFunction was messed up in you
> > post: the = symbol was always repeated twice. This is the corrected
> > version I am using:
>
> > replacementFunction[expr_, rep_, vars_] :=
> > Module[{num = Numerator[expr], den = Denominator[expr],
> > hed = Head[expr], base, expon},
> > If[PolynomialQ[num, vars] &&
> > PolynomialQ[den, vars] && ! NumberQ[den],
> > replacementFunction[num, rep, vars]/
> > replacementFunction[den, rep, vars],
> > If[hed === Power && Length[expr] == 2,
> > base = replacementFunction[expr[[1]], rep, vars];
> > expon = replacementFunction[expr[[2]], rep, vars];
> > PolynomialReduce[base^expon, rep, vars][[2]],
> > If[Head[Evaluate[hed]] === Symbol &&
> > MemberQ[Attributes[Evaluate[hed]], NumericFunction],
> > Map[replacementFunction[#, rep, vars] &, expr],
> > PolynomialReduce[expr, rep, vars][[2]]]]]]
>
> > Example:
> > expr = x/6 + y/6 - 1/2*(3 + x + y);
> > replacementFunction[expr, x + y - r, {x, y}] // Simplify
> > -> 1/6 (-9 - 2 r)
>
> > @Nasser
> > My example was probably too simple, as David Park noted. Let me
> > consider two more complex expressions:
>
> > expr1 = x^2/6 + y^2/6 - 1/2*(3 + x^2 + y^2)
> > expr2 = x/6 + y/6 - 1/2*(3 + x + y)
>
> > The simple use of ReplaceAll on both of them:
>
> > expr1 /. x^2 + y^2 -> r
> > expr2 /. x + y -> r
>
> > produces an unmodified output because, as far as I know, ReplaceAll
> > works synctatically i.e. it only looks for the exact expression to
> > substitute and will ignore something simply related to that like x^2/6
> > + y^2/6.
>
> > On the other hand, the use of FullSimplify:
>
> > FullSimplify[expr1, x^2 + y^2 == r]
> > FullSimplify[expr2, x + y == r]
>
> > works only in the first case, where I succesfully obtain as an output
> > the expression
>
> > 1/6 (-9 - 2 r) ,
>
> > while it is useless in the x+y == r case.
>
> > Using replacementFunction, I achieve what I am looking for:
>
> > replacementFunction[expr, x + y - r, {x, y}] // Simplify
> > -> 1/6 (-9 - 2 r)
>
> > Cheers,
>
> > Guido
>
> > On Mar 27, 10:11 am, "Nasser M. Abbasi" <n... at 12000.org> wrote:
> >> "Guido Walter Pettinari" <coccoinom... at gmail.com> wrote in =
> messagenews:ho=
> > i2n9$qj... at smc.vnet.net...
>
> >>> Hello world!
>
> >>> This is my first post in this group, but it has been a while since I
> >>> started reading it. I always found it quite useful, therefore I wish
> >>> to thank everibody for their contributions!
>
> >>> Here is my problem. Let's say I have an expression. I would like to
> >>> substitute all the occurences of a given subexpression in this
> >>> expression with a symbol. I want to do it in an intelligent way, =
> i.e.
> >>> by using FullSimplify instead of ReplaceAll.
>
> >>> If my expression is:
>
> >>> x^2 + y^2
>
> >>> I know that:
>
> >>> FullSimplify [ x^2 + y^2, x^2 + y^2 == r ]
>
> >>> will produce 'r' as a result, which is what I want.
>
> >>> However, if my expression is
>
> >>> x + y ,
>
> >>> then
>
> >>> FullSimplify [ x + y, x + y == r ]
>
> >>> produces 'x + y' and not 'r' ! I tried to use
>
> >>> FullSimplify [ x + y, x + y == r, ComplexityFunction -> =
> LeafCou=
> > nt ]
>
> >>> but I still get 'x+y' as a result.
>
> >>> Do you have any idea on how to substitute x+y with r in an =
> expression?
>
> >> Good question. I do not know myself, may be a Mathematica expert can =
=
> tell
> >> us. But I am just curious, why do you consider
>
> >> Simplify [ x + y, x + y == r ]
>
> >> more "intelligent" than
>
> >> In[39]:= x + y /. {x + y -> r}
> >> Out[39]= r
>
> >> ?
>
> >> --Nasser