RE: Simplification of vector and scalar products
- To: mathgroup at smc.vnet.net
- Subject: [mg39647] RE: [mg39613] Simplification of vector and scalar products
- From: "David Park" <djmp at earthlink.net>
- Date: Thu, 27 Feb 2003 00:28:34 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
John, Here is a routine I posted last week that is helpful for such calculations. LinearBreakout::"usage" = "LinearBreakout[f1, f2,...][v1, v2,...][expr] will \ break out the linear terms of any expressions within expr that have heads \ matching the patterns fi over variables matching the patterns vj. Example:\n \ f[a x + b y]//LinearBreakout[f][x,y] -> a f[x] + b f[y]"; LinearBreakout[f__][vars__][expr_] := expr //.\[InvisibleSpace]{(g : (Alternatives @@ {f}))[p1___, a_ + b__, p2___] :> g[p1, a, p2] + g[p1, +b, p2], (g : (Alternatives @@ {f}))[p1___, a_ b : (Alternatives @@ {vars}), p2___] :> a g[p1, b, p2]} Here are some examples. If we want our expression to be Linear in Cross with respect to vectors a and b: (I'm pasting in Mathematica's InputForm but with StandardForm these would display with the cross symbol and look better.) 6*Cross[a/2, b] LinearBreakout[Cross][a, b][%] giving 6*Cross[a/2, b] 3*Cross[a, b] For a dot product... 6 (a/2).b % // LinearBreakout[Dot][a, b] giving 6*(a/2) . b 3 a.b Here is an example with a cross product where x and y are the vectors. I have added some other rules to simplify the expression. Cross[a*x + b*y, c*x + d*y] LinearBreakout[Cross][x, y][%] % /. Cross[x_, x_] -> 0 Simplify[% /. Cross[x_, y_] /; !OrderedQ[{x, y}] :> -Cross[y, x]] giving Cross[a*x + b*y, c*x + d*y] a*c*Cross[x, x] + a*d*Cross[x, y] + b*c*Cross[y, x] + b*d*Cross[y, y] a*d*Cross[x, y] + b*c*Cross[y, x] ((-b)*c + a*d)*Cross[x, y] David Park djmp at earthlink.net http://home.earthlink.net/~djmp/ From: John Stokes [mailto:john at geomatics.kth.se] To: mathgroup at smc.vnet.net I want to simplify vector and scalar products as for instance 6 (a / 2) x b //Simplify where a and b are assumed to be vectors and "x" is the vector product.. Simplify and FullSimplify do nothing, nor does the following command change anything: 6 (a / 2) x b /. p_ Cross[a_ / q_ , b_] => p Cross[a, b] / q The simplification is only performed when explicit numbers are introduced: 6 (a / 2) x b /. 6 Cross[a_ / 2 , b_] => 6 Cross[a, b] / 2 thus giving the result 3 a x b How do I proceed? John Stokes