Re: help on Rewrite rules
- To: mathgroup at smc.vnet.net
- Subject: [mg50890] Re: [mg50875] help on Rewrite rules
- From: Andrzej Kozlowski <andrzej at akikoz.net>
- Date: Sun, 26 Sep 2004 05:31:54 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
On 25 Sep 2004, at 14:55, Jon Palmer wrote: > *This message was transferred with a trial version of CommuniGate(tm) > Pro* > I am having trouble simplifying expressions in mathematica. My > epxerissions > involve two parameters x & y that parameterise a unit circle so that > > x^2 + y^2 =1 > > Without chosing a particular parameterization for x and y I want to > simplify > epxpertions of the form: > > > 3x^2 + 2y^2 -----> 2 + x^2 > or > (x^2 + y^2)^(1/2) -----> 1 > > and more importantly for should perform the simplification > > A[x^2] + B [y^2] + C[x^2+y^2] -----> A[ x^2] + B[ y^2] + C[1] > > where A,B&C are functions. > > I assume that this can me achieved with a relatively simple rewrite > rule but > I have had very limited success making this work. Can anyone suggest a > solution, > > Many thanks > Jon Palmer > > P.S. I also want to expand the problem to that of three variables x,y&z > parameterizing a unit sphere but I suspect that this will be obvious > form > the solution of the unit circle problem. > > First of all, your question is rather ambiguous. You say you want 3x^2 + 2y^2 to be "simplified" to 2 + x^2, why not Simplify[3*x^2 + 2*y^2, x^2 + y^2 == 1] 3 - y^2 ? What is exactly the criterion that should be used to choose one rather than another of the various possible expressions? In this case it looks like you want to eliminate y, but then you say that the expression A[x^2] + B [y^2] + C[x^2+y^2] should be converted to A[x^2] + B [y^2] + C[1]. Why not to A[x^2] + B [1-x^2] + C[1]? You seem to be using human judgement here of the kind that can't be programmed. In fact Mathematica's Simplify is trying to simulate something similar and will return: Simplify[A[x^2] + B[y^2] + C[x^2 + y^2], x^2 + y^2 == 1] A[x^2] + B[y^2] + C[1] But there is no way to guarantee that in general Simplify will return the output you want. If you want simply to eliminate y^2, that could be achieved by using ReplaceAll with the local rule y^2->1-x^2 as in Simplify[3*x^2 + 2*y^2 /. y^2 -> 1 - x^2] 2 + x^2 For simple situations this is enough but it will not work if explicit y^2 does not appear in your expression, e.g.: y*(y + 1) + x^2 /. y^2 -> 1 - x^2 x^2 + y*(1 + y) Mathematica of course can't do "semantic" pattern matching, so it has to see an explicit "syntactic" pattern in order to perform a replacement. In this case you could deal with this problem by first applying ExpandAll to your expression. ExpandAll[y*(y + 1) + x^2] /. y^2 -> 1 - x^2 1 + y ExpandAll want help however in this case: y^3 + y*x^2 /. y^2 -> 1 - x^2 x^2*y + y^3 This time what you want is Factor: Factor[y^3 + y*x^2] /. y^2 -> 1 - x^2 y You can in fact define a function that will deal with all the above cases: f[expr_] := expr /. (z_)?(PolynomialQ[#1, {x, y}] && !FreeQ[#1, x | y] & ) :> Last[PolynomialReduce[z, x^2 + y^2 - 1,{y,x}]] Now: f[3*x^2 + 2*y^2] 2 + x^2 f[A[x^2] + B[y^2] + C[x^2 + y^2]] A[x^2] + B[1 - x^2] + C[1] f[y*(y + 1) + x^2] 1 + y and f[y^3 + y*x^2] y While this is not true "semantic pattern matching" it comes as close to it as anything in symbolic algebra, though of course it only works for polynomial relationships between x and y. Andrzej Kozlowski Chiba, Japan http://www.akikoz.net/~andrzej/ http://www.mimuw.edu.pl/~akoz/