MathGroup Archive 2010

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Re: Substitute expressions with FullSimplify

  • To: mathgroup at smc.vnet.net
  • Subject: [mg108712] Re: [mg108696] Re: Substitute expressions with FullSimplify
  • From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
  • Date: Sun, 28 Mar 2010 06:55:52 -0500 (EST)
  • References: <hoi2n9$qj7$1@smc.vnet.net> <hoklk6$snd$1@smc.vnet.net> <201003280906.EAA26444@smc.vnet.net>

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$qj7$1 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
>
>



  • Prev by Date: Re: Running Mathematica code using DOS
  • Next by Date: Histogram
  • Previous by thread: Re: Substitute expressions with FullSimplify
  • Next by thread: Re: Substitute expressions with FullSimplify