The following works:
sage: y=var('y')
sage: z=var('z')
sage: solns = solve( [x+y+z==5, y+z==3, x+z==1], x,y,z)
sage: print solns
sage: solution = solns[0]
sage: print solution
sage: ( x + y + z ).subs_expr(*solution)
[
[x == 2, y == 4, z == -1]
]
[x == 2, y == 4, z == -1]
5
There are two points to notice:
1) The ouput of solve is a list of the solutions found, where each
solution itself is a list of expressions. So, we have to "pick" the
one we want. In this case there is only one solution, so solution =
solns[0] gets the solution we want.
2) In Python, the special notation
f(*some_list)
where some_list is a list, is used to "unpack" the list and pass its
elements to the function f.
For example, here is a function that returns the sum of its arguments:
sage: def f(*args):
... return sum(args)
...
sage: f(2,3,5,7)
17
Now suppose the elements you want to add are in a list. The function
expects a bunch of arguments that can be added, so that if you simply
give it the list, it fails:
sage: lst = [2,3,5,7]
sage: f(lst)
Traceback (most recent call last):
...
TypeError: unsupported operand type(s) for +: 'int' and 'list'
To "unwrap" the elements of the list, put an asterisk in front of it:
sage: f(*lst)
17
sage: ( x + y + z ).subs_expr(*solns)
5
Sage is based on Python, and the * notation with list arguments is a
common Python idiom. It may take a while to get used too, but is
actually a great convenience that is not present in other languages.
Part of the learning curve in learning Sage is that one must learn
some Python to use it efficiently. The advantage is that using a
"real" computer language like Python, Sage is more consistent than the
scripting language in other CASes. For example, now you know you can
use the * trick with any function that requires a variable number of
inputs :-)
On Sun, Feb 15, 2009 at 2:26 PM, [email protected]
<[email protected]> wrote:
>
> Greetings,
>
> I am a completely new to SAGE as of a few days ago. I have used Maple
> and Mathematica for years, and it is easy to do what I am describing
> below in those systems. I assume it is also easy to do in sage, but I
> have not been able to find it in the documentation.
>
> Here's the story:
>
> I am attempting to write a sage function where I need to solve a
> system of equations, and then plug these solutions into an expression,
> and then process the result further.
>
> Since the solutions to the system come wrapped in brackets, and
> subs_expr expects the substitution equations without any brackets
> around them I do not see how to do this.
>
> Here is a toy example in interactive mode:
> ***********************************************************************
> sage: y=var('y')
> sage: z=var('z')
> sage: solns = solve( [x+y+z==5, y+z==3, x+z==1], [x,y,z])
> sage: solns
> [[x == 2, y == 4, z == -1]]
> sage: ( x + y + z ).subs_expr(solns)
> ---------------------------------------------------------------------------
> TypeError Traceback (most recent call
> last)
>
> /Users/andrewsills/.sage/<ipython console> in <module>()
>
> /Applications/sage/local/lib/python2.5/site-packages/sage/calculus/
> calculus.pyc in subs_expr(self, *equations)
> 3922 for x in equations:
> 3923 if not isinstance(x, SymbolicEquation):
> -> 3924 raise TypeError, "each expression must be an
> equation"
> 3925 R = self.parent()
> 3926 v = ','.join(['%s=%s'%(x.lhs()._maxima_init_(), x.rhs
> ()._maxima_init_()) \
>
> TypeError: each expression must be an equation
> *****************************************************************************
> However, if I manually cut and paste my solutions into the expression,
> I get the desired result:
>
> *******************************************************************
> sage: ( x + y + z ).subs_expr(x == 2, y == 4, z == -1)
> 5
> *******************************************************************
>
> Of course, I cannot manually cut and paste in the middle of a
> function.
> So, it would seem that I either need to find a way to, in effect,
> remove the brackets that naturally occur in [[ x == 2, y == 4, z ==
> -1 ]], or alternatively, find another way to substitute into ( x + y +
> z ) where it is acceptable to have the brackets there.
>
> I am sure this is extremely simplistic, and I appreciate your
> patience.
>
> Thanks,
> Drew
>
> >
>
--
"The main things which seem to me important on their own account, and
not merely as means to other things, are knowledge, art, instinctive
happiness, and relations of friendship or affection."
-Bertrand Russell
L. Felipe Martins
Department of Mathematics
Cleveland State University
[email protected]
--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/sage-support
URLs: http://www.sagemath.org
-~----------~----~----~----~------~----~------~--~---