I'm trying to get a matrix over SR to be callable, much like vectors
are. My code consists of the following:
"
(theta,beta,gamma)=var('theta,beta,gamma')
R_theta=matrix(SR,[[cos(theta),sin(theta),0],[-sin(theta),cos(theta),
0],[0,0,1]])
R_beta=matrix(SR,3,3,[cos(beta),0,-sin(beta),0,1,0,sin(beta),
0,cos(beta)])
"
Defining the matrices with a place for the variables yields an error
with mutiplication:
"
R_theta(theta)=matrix(SR,[[cos(theta),sin(theta),0],[-
sin(theta),cos(theta),0],[0,0,1]])
R_beta(beta)=matrix(SR,3,3,[cos(beta),0,-sin(beta),0,1,0,sin(beta),
0,cos(beta)])
R_theta*T_beta
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "_sage_input_89.py", line 10, in <module>
exec compile(u'open("___code___.py","w").write("# -*- coding:
utf-8 -*-\\n" +
_support_.preparse_worksheet_cell(base64.b64decode("Ul90aGV0YSpSX2JldGE="),globals())
+"\\n"); execfile(os.path.abspath("___code___.py"))
File "", line 1, in <module>
File "/private/var/folders/bM/bMOEaVgXE3CHfi1Ua6Udb++++TI/-Tmp-/
tmpNfeDiM/___code___.py", line 2, in <module>
exec compile(u'R_theta*R_beta
File "", line 1, in <module>
File "element.pyx", line 1459, in
sage.structure.element.RingElement.__mul__ (sage/structure/element.c:
12096)
File "coerce.pyx", line 714, in
sage.structure.coerce.CoercionModel_cache_maps.bin_op (sage/structure/
coerce.c:6436)
File "element.pyx", line 1454, in
sage.structure.element.RingElement.__mul__ (sage/structure/element.c:
12005)
File "expression.pyx", line 2216, in
sage.symbolic.expression.Expression._mul_ (sage/symbolic/
expression.cpp:11504)
ArithmeticError: Number_T::hash() python function (__hash__) raised
exception
"
In either case, I can't get sage to substitue the variable in the
matrix. (I can define the variables before defining the matrix, but
that is redundant) Any ideas?
Thanks a lot!
Thanks a lot!
sage:def R_theta(theta):
return matrix(SR,[[cos(theta),sin(theta),0],[-sin(theta),cos(theta),
0],[0,0,1]])
sage: R_theta(x)
[ cos(x) sin(x) 0]
[-sin(x) cos(x) 0]
[ 0 0 1]
sage: R_theta(1)
[ cos(1) sin(1) 0]
[-sin(1) cos(1) 0]
[ 0 0 1]
sage: R_theta
<function R_theta at 0x5e83848>
Andrzej Chrzeszczyk
def MatrixCallable(M):
N = Matrix(SR,M)
def m(*a,**k):
return Matrix([[e(*a,**k) for e in row] for row in N])
return m
sage: x = var('x')
sage: M = [[sin(x),cos(x),0],[cos(x),sin(x),x^3]]
sage: N = MatrixCallable(M)
sage: N(x=pi/4)
[1/2*sqrt(3) 1/2 0]
[ 1/2 1/2*sqrt(3) 1/27*pi^3]
> --
> To post to this group, send email to sage-s...@googlegroups.com
> To unsubscribe from this group, send email to sage-support...@googlegroups.com
> For more options, visit this group at http://groups.google.com/group/sage-support
> URL: http://www.sagemath.org
>
And it isn't quite the same as Callable symbolic expressions. I.e., if
you have two variables, you can't specify the order when you create the
matrix.
On the other hand, doing something like
sage: var('x,y')
(x, y)
sage:
M=matrix(CallableSymbolicExpressionRing((x,y)),[[x+2*y,sin(x),cos(y)],[x,y,x^2+y]])
sage: M(1,2)
[ 5 sin(1) cos(2)]
[ 1 2 3]
Really behaves like a callable expression. It prints sort of ugly, though:
sage: M
[(x, y) |--> x + 2*y (x, y) |--> sin(x) (x, y) |--> cos(y)]
[ (x, y) |--> x (x, y) |--> y (x, y) |--> x^2 + y]
That could be improved, e.g., see the printing for vectors over callable
symbolic rings, which print the arguments outside of the vector:
sage: M[0]
(x, y) |--> (x + 2*y, sin(x), cos(y))
Note that the syntax f(x,y)=... is preparsed as:
sage: preparse('f(x,y)=[[x^2,y],[x,y]]')
'__tmp__=var("x,y"); f =
symbolic_expression([[x**Integer(2),y],[x,y]]).function(x,y)'
so really all that is needed is changing the symbolic_expression
function to create a symbolic matrix if a list of lists (or tuples) is
given, and then adding a .function() method to a symbolic matrix to give
a matrix with base ring CallableSymbolicExpressionRing (as above).
Bonus points if you make those matrices print out with the arguments
first, instead of having the arguments inside of each element. I've
done this for vectors [1], so that could be a pattern for what to do here.
Thanks,
Jason
[1] See the symbolic_expression code, which has this case:
elif isinstance(x, (tuple,list)):
return vector(SR,x)
Thanks!
I think this would be a good project for a person wanting to learn more
about how to do Sage development. The modifications to
symbolic_expression should be easy (check for a nested list/tuple
structure). Then you would need to make a new function() method, in
$SAGE_ROOT/devel/sage/sage/matrix/matrix2.pyx probably, that would
create a corresponding matrix over the CallableSymbolicRing. You can
see an example for vectors in
$SAGE_ROOT/devel/sage/sage/modules/free_module.pyx (look for "def
function" in that file).
Then if you are ambitious, create a new matrix subclass for callable
symbolic expressions that mirrors what
$SAGE_ROOT/devel/sage/sage/modules/vector_callable_symbolic_dense.py
does for vectors (i.e., changes the printing).
Thanks,
Jason
On Nov 23, 11:38 am, Jason Grout <jason-s...@creativetrax.com> wrote: