Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Substituting a particular value for a parameter

This question is a follow-on to this one I asked earlier. Suppose I have a return value (a list called sols) to a solve command which includes an extra parameter, like

[2+r1,2-r1,2*r1]

If I want to substitute a value for r1, I need to, for example:

var('r1')
[xx.subs(r1=2/3) for xx in sols]

However, if I happen to run the solve command again, the new parameter changes to r2, and then I have to change the above commands to work with r2 instead of r1. And of course if other parameters have been created in the course of my Sage session, the r1 above could be anything.

What I need is some way of both isolating that extra parameter, and substituting for it. One way seems to be something like:

params = [xx.variables()[0] for xx in sols]
[xx.subs_expr(p==2/3) for xx,p in zip(sols,params)]

which works if the extra parameter is listed first in each variable list. The command

solvars = reduce(lambda x,y:union(x,y),[xx.variables() for xx in svals])

produces a list in which the extra parameter is last. So I could use

[xx.subs_expr(solvars[-1]==2/3) for xx in sols]

But none of these particularly automatic, in terms of isolating the extra parameter. They seem to require some extra knowledge of where the parameter is in the variables list.

So what is the best way of doing this, which is robust and automatic?