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

That's not entirely true since the edit here was about another substitution, the other one was about solving for a variable which gave me an answer where the variable is not isolated.

wzawzdb gravatar imagewzawzdb ( 2014-08-29 17:12:33 +0200 )edit

Ok, it was not clear to me. Post-editing a question once it is answered creates a mess. Indeed, some other people could benefit from your question but may get lost in reading answers not connected to the newly edited question. If another case of the same question appears, perhaps could you add it after the current one, starting by an *EDIT* statement, so that it is clear that it is a new case, this will help readers to understand what is the current status of the question.

tmonteil gravatar imagetmonteil ( 2014-08-29 17:39:36 +0200 )edit

Or perhaps write "case 1" (the first one that actually worked), "case 2" (which i answered), and then "case 3" (your new substitution problem), with an *EDIT* between each stage. The thing is that your question is of interest to any one falling into such problem in the future and come into this page after searching on the web, ask.sagemath.org is not only about answering questions to individuals, but also maintaining a kind of FAQ. This helps avoiding duplicate questions.

tmonteil gravatar imagetmonteil ( 2014-08-29 17:43:15 +0200 )edit

Yeah, I understand, but I wanted to avoid making 1000 threads

wzawzdb gravatar imagewzawzdb ( 2014-08-29 17:50:42 +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: 504 times

Last updated: Aug 29 '14