Ask Your Question
1

complex substitution

asked 2014-08-26 21:42:31 +0200

wzawzdb gravatar image

updated 2014-08-29 17:54:34 +0200

Im working on a loooooooooooooong formula. I want to replace (substitute?) certain combination of variables for another simpeler combination of variables (like for example F=m*a), anywhere in the formula where this combination exists.

Case 1 (Works): I have a formula let say

sage: eq1=m*a==(b+c)*k
sage: eq2=d==a*m+f
sage: eq3=eq2.subs(eq1)/g

(doesnt work with the multiplication? just gives me the same answer as i had without the substitution)

Edit: Case 2 (solved): so it does some kind of operation on equation 2 but I want to replace the a in equation 2 for equation 1 my code:

sage: A1, A2, A3, P1, P3, u1, u2, u3, r1, r2, r3 = var('A1 A2 A3 P1 P3 u1 u2 u3 r1 r2 r3')
sage: eq7a = P1 - P3 == -(A1*r1*u1^2 + A2*r2*u2^2 - A3*r3*u3^2)/A3
sage: eq7a.subs_expr(A3*r3*u3^2 == (A2*u2*r2 + A1*r1*u1)*u3)
sage: A1, A2, A3, P1, P3, u1, u2, u3, r1, r2, r3 = var('A1 A2 A3 P1 P3 u1 u2 u3 r1 r2 r3')
sage: eq7a = P1 - P3 == -(A1*r1*u1^2 - A2*r2*u2^2 + A3*r3*u3^2)/A3
sage: eq7a.subs_expr(A3*r3*u3^2 == (A2*u2*r2 + A1*r1*u1)*u3)

The last one i want to turn the a3r3u3 into the longer one, but it just gives me back a3r3u3

edit retag flag offensive close merge delete

Comments

When I use the .subs_expr it doesn't give me back anything

wzawzdb gravatar imagewzawzdb ( 2014-08-26 23:00:15 +0200 )edit

It is not clear to me which expression do you want to substitute in which. It seems to work for me, for ``eq3`` i got : ``d/g == ((b + c)*k + f)/g``. Which result did you expect ?

tmonteil gravatar imagetmonteil ( 2014-08-26 23:13:09 +0200 )edit

I expected that result, but if i try this with my own formula it gives me back (a*m+f)/g And im doing it the exact same way except that there are more variables involved. Does sage see that if something is squared or multiplied with something else it can be taken apart?

wzawzdb gravatar imagewzawzdb ( 2014-08-27 15:28:19 +0200 )edit

Since this example works well, how can we understand your problem. Could you please provide the exact formulas that lead to an actual problem ?

tmonteil gravatar imagetmonteil ( 2014-08-27 18:22:23 +0200 )edit

I reverted your question to the state it was before you added new questions, since those additional questions are asked in http://ask.sagemath.org/question/23967/solve-for-variable-but-variable-is-still-in-answer/

tmonteil gravatar imagetmonteil ( 2014-08-29 16:58:18 +0200 )edit

1 Answer

Sort by ยป oldest newest most voted
2

answered 2014-08-27 23:49:52 +0200

tmonteil gravatar image

updated 2014-08-28 00:06:31 +0200

I first thought you found a bug, but here is the reason of your problem, and a workaround:

Your problem summarizes as follows:

sage: A1, A2, A3, P1, P3, u1, u2, u3, r1, r2, r3 = var('A1 A2 A3 P1 P3 u1 u2 u3 r1 r2 r3')
sage: eq7a = P1 - P3 == -(A1*r1*u1^2 + A2*r2*u2^2 - A3*r3*u3^2)/A3
sage: eq7a.subs_expr(A3*r3*u3^2 == (A2*u2*r2 + A1*r1*u1)*u3)
P1 - P3 == -(A1*r1*u1^2 + A2*r2*u2^2 - A3*r3*u3^2)/A3

While you expect (as we got with d/g == ((b + c)*k + f)/g in your smaller example):

P1 - P3 == -(A1*r1*u1^2 + A2*r2*u2^2 - (A2*u2*r2 + A1*r1*u1)*u3)/A3

The fun thing is that, if we reverse two signs, it works as expected:

sage: A1, A2, A3, P1, P3, u1, u2, u3, r1, r2, r3 = var('A1 A2 A3 P1 P3 u1 u2 u3 r1 r2 r3')
sage: eq7a = P1 - P3 == -(A1*r1*u1^2 - A2*r2*u2^2 + A3*r3*u3^2)/A3
sage: eq7a.subs_expr(A3*r3*u3^2 == (A2*u2*r2 + A1*r1*u1)*u3)
P1 - P3 == -(A1*r1*u1^2 - A2*r2*u2^2 + (A1*r1*u1 + A2*r2*u2)*u3)/A3

The problem is not in the product, but in the subtraction, or more precisely the interplay between both. Let us understand this:

When you write:

sage: a, b = var('a b')
sage: y = a - b

You do not have the operator sub with operands a and b:

sage: y.operator()
<function operator.add>
sage: y.operands()
[a, -b]

Also:

sage: (-b).operator()
<function operator.mul>
sage: (-b).operands()
[b, -1]

As you can see, the symbolic ring understands a - b as the sum of a and -b and -b as the product of b and -1. So a-b is like sum([a,mul[b,-1]]), which you can vizualize as a tree:

  a
 /
-
 \
  b

versus

  a
 /
+   b
 \ /
  *
   \
    -1

In your problem:

sage: (-A3*r3*u3^2).operator()
<function operator.mul>
sage: (-A3*r3*u3^2).operands()
[A3, r3, u3^2, -1]

If you imagine symbolic expressions as trees, it is now easy to understand why Sage is not able to do your substitution, you want to substitute mul([A3, r3, u3^2]) which is not a subtree of your expression (while mul([A3, r3, u3^2, -1]) is).

So, the workaround is now easy guess: you should not substitute A3*r3*u3^2 in your expression, but -A3*r3*u3^2:

sage: sage: A1, A2, A3, P1, P3, u1, u2, u3, r1, r2, r3 = var('A1 A2 A3 P1 P3 u1 u2 u3 r1 r2 r3')
sage: sage: eq7a = P1 - P3 == -(A1*r1*u1^2 + A2*r2*u2^2 - A3*r3*u3^2)/A3
sage: sage: eq7a.subs_expr(-A3*r3*u3^2 == -(A2*u2*r2 + A1*r1*u1)*u3)
P1 - P3 == -(A1*r1*u1^2 + A2*r2*u2^2 - (A1*r1*u1 + A2*r2 ...
(more)
edit flag offensive delete link more

Comments

Ah okay I think I get it! Great thanks for the elaborate answer! What is the difference between .subs and .subs_expr?

wzawzdb gravatar imagewzawzdb ( 2014-08-28 16:18:53 +0200 )edit

Excellent and thorough explanation! +1

dazedANDconfused gravatar imagedazedANDconfused ( 2014-08-29 21:19:06 +0200 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 2014-08-26 21:42:31 +0200

Seen: 503 times

Last updated: Aug 29 '14