MathGroup Archive 2006

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

Search the Archive

Re: Question regarding replacement

  • To: mathgroup at smc.vnet.net
  • Subject: [mg63876] Re: [mg63860] Question regarding replacement
  • From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
  • Date: Fri, 20 Jan 2006 04:32:30 -0500 (EST)
  • References: <200601190503.AAA21333@smc.vnet.net> <A2FA3133-4CB6-4A11-B939-3F948151C025@mimuw.edu.pl>
  • Sender: owner-wri-mathgroup at wolfram.com

On 19 Jan 2006, at 11:22, Andrzej Kozlowski wrote:

>
> On 19 Jan 2006, at 06:03, michael_chang86 at hotmail.com wrote:
>
>> Hi,
>>
>> Often, when manipulating symbolic results, one might want to replace
>> some symbols with "simpler" expressions, and typically, I've managed
>> this with "/.".  However, suppose that
>>
>> In[1]:  a = b c/d
>>
>> and I know that d/(b c) = theta.  Unfortunately,
>>
>> In[2]:  params={d/(b c)->theta}; a/.params
>> does *not* yield 1/theta.  How can I achieve this simply *without*
>> redefining params?
>>
>> (This (too) simple example is meant to demonstrate some difficulties
>> that I typically encounter when trying to replace symbols in *much*
>> more complicated expressions, where, sometimes, the symbols that I am
>> trying to replace are inverted ... :(  )
>>
>> My apologies in advance, since this seems embarassingly simple,  
>> but any
>> help or suggestions would be greatly appreciated!
>>
>> Regards,
>>
>> Michael
>>
>
>
> There is actually in Mathematica an obsolete and no longer  
> documented function that makes this sort of thing very easy:
>
>
> b*(c/d) /. AlgebraicRules[{d/(b*c) == theta}, {d, b, c}]
>
>
> 1/theta
>
>
> AlgebraicRules has been deprecated because the other functionality  
> for manipulating algebraic expressions is more powerful and  
> reliable, but unfortunately it is also harder to use. I can see two  
> ways to do this, both not entirely obvious. One is using  
> GroebnerBasis:
>
>
> GroebnerBasis[{a - b*(c/d), d/(b*c) - theta}, {theta},
>   {b, c, d}]
>
> {a*theta - 1}
>
> effectively this is saying a*theta == 1 so a == 1/theta. The other  
> way is by using PolynomialReduce:
>
>
> Last[PolynomialReduce[b*(c/d), {d - theta*b*c},
>    {b, c, d}]]
>
>
> 1/theta
>
> To sue these methods effectively unfortunately requires some  
> understanding of what GroebnerBasis and PolynomialReduce do, which  
> actually is non trivial. I still think that it would be a good idea  
> to bring back to life ALgebraicRUles (deprecated in version 3, I  
> think), whose syntax is at least much more understandable by users  
> without much knowledge of modern computational polynomial algebra.
>
> Andrzej Kozlowski


Of course in this particular case there is at least one other way  
that is  almost as simple to use as AlgebraicRules:

a /. First[Solve[{a == b*(c/d), d/(b*c) == theta}, {a},
     {b, c, d}]]

Out[33]=
1/theta

Andrzej


  • Prev by Date: Re: NIntegrate and Plot
  • Next by Date: Re: NDSolve useless?
  • Previous by thread: Re: Question regarding replacement
  • Next by thread: Re: Question regarding replacement