# 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() 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?

edit retag close merge delete

To my knowledge, there isn't a particularly robust way of doing this. We've discussed doing various things with the auto-generated variables of Maxima, but there hasn't been consensus on what the "right" thing to do is - we don't want them overwriting pre-existing user-defined variables, but we also want accessibility, and this is not easily resolvable.

I thought that might be the case... well, I'll just have to make do with what I've got. Could I isolate, do you think, the "non-parameter" variables using locals in some way?

Maxima should have a list of things like this - https://www.ma.utexas.edu/pipermail/maxima/2013/033850.html - but I had trouble accessing it. Also, you may find setting the nicedummies Maxima option useful here.

Sort by » oldest newest most voted A suggestion.

import re
var('x y z r')
eqns = [x+y==1, x-z==0]
sol=solve(eqns,[x,y,z])
S=str(sol)
eval(S.replace(re.search('r[0-9]+',S).group(),'r'))

more