The symbolic ring#
- class sage.symbolic.ring.NumpyToSRMorphism#
Bases:
Morphism
A morphism from numpy types to the symbolic ring.
- class sage.symbolic.ring.SymbolicRing#
Bases:
SymbolicRing
Symbolic Ring, parent object for all symbolic expressions.
- I()#
The imaginary unit, viewed as an element of the symbolic ring.
EXAMPLES:
sage: SR.I()^2 -1 sage: SR.I().parent() Symbolic Ring
- characteristic()#
Return the characteristic of the symbolic ring, which is 0.
OUTPUT:
a Sage integer
EXAMPLES:
sage: c = SR.characteristic(); c 0 sage: type(c) <class 'sage.rings.integer.Integer'>
- cleanup_var(symbol)#
Cleans up a variable, removing assumptions about the variable and allowing for it to be garbage collected
INPUT:
symbol
– a variable or a list of variables
- is_exact()#
Return False, because there are approximate elements in the symbolic ring.
EXAMPLES:
sage: SR.is_exact() False
Here is an inexact element.
sage: SR(1.9393) 1.93930000000000
- is_field(proof=True)#
Returns True, since the symbolic expression ring is (for the most part) a field.
EXAMPLES:
sage: SR.is_field() True
- is_finite()#
Return False, since the Symbolic Ring is infinite.
EXAMPLES:
sage: SR.is_finite() False
- pi()#
EXAMPLES:
sage: SR.pi() is pi True
- subring(*args, **kwds)#
Create a subring of this symbolic ring.
INPUT:
Choose one of the following keywords to create a subring.
accepting_variables
(default:None
) – a tuple or other iterable of variables. If specified, then a symbolic subring of expressions in only these variables is created.rejecting_variables
(default:None
) – a tuple or other iterable of variables. If specified, then a symbolic subring of expressions in variables distinct to these variables is created.no_variables
(default:False
) – a boolean. If set, then a symbolic subring of constant expressions (i.e., expressions without a variable) is created.
OUTPUT:
A ring.
EXAMPLES:
Let us create a couple of symbolic variables first:
sage: V = var('a, b, r, s, x, y')
Now we create a symbolic subring only accepting expressions in the variables \(a\) and \(b\):
sage: A = SR.subring(accepting_variables=(a, b)); A Symbolic Subring accepting the variables a, b
An element is
sage: A.an_element() a
From our variables in \(V\) the following are valid in \(A\):
sage: tuple(v for v in V if v in A) (a, b)
Next, we create a symbolic subring rejecting expressions with given variables:
sage: R = SR.subring(rejecting_variables=(r, s)); R Symbolic Subring rejecting the variables r, s
An element is
sage: R.an_element() some_variable
From our variables in \(V\) the following are valid in \(R\):
sage: tuple(v for v in V if v in R) (a, b, x, y)
We have a third kind of subring, namely the subring of symbolic constants:
sage: C = SR.subring(no_variables=True); C Symbolic Constants Subring
Note that this subring can be considered as a special accepting subring; one without any variables.
An element is
sage: C.an_element() I*pi*e
None of our variables in \(V\) is valid in \(C\):
sage: tuple(v for v in V if v in C) ()
See also
- symbol(name=None, latex_name=None, domain=None)#
EXAMPLES:
sage: t0 = SR.symbol("t0") sage: t0.conjugate() conjugate(t0) sage: t1 = SR.symbol("t1", domain='real') sage: t1.conjugate() t1 sage: t0.abs() abs(t0) sage: t0_2 = SR.symbol("t0", domain='positive') sage: t0_2.abs() t0 sage: bool(t0_2 == t0) True sage: t0.conjugate() t0 sage: SR.symbol() # temporary variable symbol...
We propagate the domain to the assumptions database:
sage: n = var('n', domain='integer') sage: solve([n^2 == 3],n) []
- symbols#
- temp_var(n=None, domain=None)#
Return one or multiple new unique symbolic variables as an element of the symbolic ring. Use this instead of SR.var() if there is a possibility of name clashes occuring. Call SR.cleanup_var() once the variables are no longer needed or use a \(with SR.temp_var() as ...\) construct.
INPUT:
n
– (optional) positive integer; number of symbolic variablesdomain
– (optional) specify the domain of the variable(s);
EXAMPLES:
Simple definition of a functional derivative:
sage: def functional_derivative(expr,f,x): ....: with SR.temp_var() as a: ....: return expr.subs({f(x):a}).diff(a).subs({a:f(x)}) sage: f = function('f') sage: a = var('a') sage: functional_derivative(f(a)^2+a,f,a) 2*f(a)
Contrast this to a similar implementation using SR.var(), which gives a wrong result in our example:
sage: def functional_derivative(expr,f,x): ....: a = SR.var('a') ....: return expr.subs({f(x):a}).diff(a).subs({a:f(x)}) sage: f = function('f') sage: a = var('a') sage: functional_derivative(f(a)^2+a,f,a) 2*f(a) + 1
- var(name, latex_name=None, n=None, domain=None)#
Return a symbolic variable as an element of the symbolic ring.
INPUT:
name
– string or list of strings with the name(s) of the symbolic variable(s)latex_name
– (optional) string used when printing in latex mode, if not specified use'name'
n
– (optional) positive integer; number of symbolic variables, indexed from \(0\) to \(n-1\)domain
– (optional) specify the domain of the variable(s); it is the complex plane by default, and possible options are (non-exhaustive list, see note below):'real'
,'complex'
,'positive'
,'integer'
and'noninteger'
OUTPUT:
Symbolic expression or tuple of symbolic expressions.
See also
This function does not inject the variable(s) into the global namespace. For that purpose see
var()
.Note
For a comprehensive list of acceptable features type
'maxima('features')'
, and see also the documentation of Assumptions.EXAMPLES:
Create a variable \(zz\) (complex by default):
sage: zz = SR.var('zz'); zz zz
The return type is a symbolic expression:
sage: type(zz) <class 'sage.symbolic.expression.Expression'>
We can specify the domain as well:
sage: zz = SR.var('zz', domain='real') sage: zz.is_real() True
The real domain is also set with the integer domain:
sage: SR.var('x', domain='integer').is_real() True
The
name
argument does not have to match the left-hand side variable:sage: t = SR.var('theta2'); t theta2
Automatic indexing is available as well:
sage: x = SR.var('x', 4) sage: x[0], x[3] (x0, x3) sage: sum(x) x0 + x1 + x2 + x3
- wild(n=0)#
Return the n-th wild-card for pattern matching and substitution.
INPUT:
n
- a nonnegative integer
OUTPUT:
n
-th wildcard expression
EXAMPLES:
sage: x,y = var('x,y') sage: w0 = SR.wild(0); w1 = SR.wild(1) sage: pattern = sin(x)*w0*w1^2; pattern $1^2*$0*sin(x) sage: f = atan(sin(x)*3*x^2); f arctan(3*x^2*sin(x)) sage: f.has(pattern) True sage: f.subs(pattern == x^2) arctan(x^2)
- class sage.symbolic.ring.TemporaryVariables(iterable=(), /)#
Bases:
tuple
Instances of this class can be used with Python \(with\) to automatically clean up after themselves.
- class sage.symbolic.ring.UnderscoreSageMorphism#
Bases:
Morphism
A Morphism which constructs Expressions from an arbitrary Python object by calling the
_sage_()
method on the object.EXAMPLES:
sage: import sympy sage: from sage.symbolic.ring import UnderscoreSageMorphism sage: b = sympy.var('b') sage: f = UnderscoreSageMorphism(type(b), SR) sage: f(b) b sage: _.parent() Symbolic Ring
- sage.symbolic.ring.is_SymbolicExpressionRing(R)#
Return True if
R
is the symbolic expression ring.This function is deprecated. Instead, either use
R is SR
(to test whetherR
is the unique symbolic ringSR
); orisinstance
withSymbolicRing
(when also symbolic subrings and callable symbolic rings should be accepted).EXAMPLES:
sage: from sage.symbolic.ring import is_SymbolicExpressionRing sage: is_SymbolicExpressionRing(ZZ) doctest:warning... DeprecationWarning: is_SymbolicExpressionRing is deprecated; use "... is SR" or isinstance(..., sage.rings.abc.SymbolicRing instead See https://trac.sagemath.org/32665 for details. False sage: is_SymbolicExpressionRing(SR) True
- sage.symbolic.ring.isidentifier(x)#
Return whether
x
is a valid identifier.INPUT:
x
– a string
OUTPUT:
Boolean. Whether the string
x
can be used as a variable name.This function should return
False
for keywords, so we can not just use theisidentifier
method of strings, because, for example, it returnsTrue
for “def” and for “None”.EXAMPLES:
sage: from sage.symbolic.ring import isidentifier sage: isidentifier('x') True sage: isidentifier(' x') # can't start with space False sage: isidentifier('ceci_n_est_pas_une_pipe') True sage: isidentifier('1 + x') False sage: isidentifier('2good') False sage: isidentifier('good2') True sage: isidentifier('lambda s:s+1') False sage: isidentifier('None') False sage: isidentifier('lambda') False sage: isidentifier('def') False
- sage.symbolic.ring.the_SymbolicRing()#
Return the unique symbolic ring object.
(This is mainly used for unpickling.)
EXAMPLES:
sage: sage.symbolic.ring.the_SymbolicRing() Symbolic Ring sage: sage.symbolic.ring.the_SymbolicRing() is sage.symbolic.ring.the_SymbolicRing() True sage: sage.symbolic.ring.the_SymbolicRing() is SR True
- sage.symbolic.ring.var(name, **kwds)#
EXAMPLES:
sage: from sage.symbolic.ring import var sage: var("x y z") (x, y, z) sage: var("x,y,z") (x, y, z) sage: var("x , y , z") (x, y, z) sage: var("z") z