Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagelib
Path: blob/master/sage/symbolic/operators.py
4069 views
1
import operator
2
from sage.symbolic.ring import is_SymbolicVariable, var
3
4
arithmetic_operators = {operator.add: '+',
5
operator.sub: '-',
6
operator.mul: '*',
7
operator.div: '/',
8
operator.pow: '^'}
9
10
relation_operators = {operator.eq:'==',
11
operator.lt:'<',
12
operator.gt:'>',
13
operator.ne:'!=',
14
operator.le:'<=',
15
operator.ge:'>='}
16
17
class FDerivativeOperator(object):
18
def __init__(self, function, parameter_set):
19
"""
20
EXAMPLES::
21
22
sage: from sage.symbolic.operators import FDerivativeOperator
23
sage: f = function('foo')
24
sage: op = FDerivativeOperator(f, [0,1])
25
sage: loads(dumps(op))
26
D[0, 1](foo)
27
"""
28
self._f = function
29
self._parameter_set = map(int, parameter_set)
30
31
def __call__(self, *args):
32
"""
33
EXAMPLES::
34
35
sage: from sage.symbolic.operators import FDerivativeOperator
36
sage: x,y = var('x,y')
37
sage: f = function('foo')
38
sage: op = FDerivativeOperator(f, [0,1])
39
sage: op(x,y)
40
D[0, 1](foo)(x, y)
41
sage: op(x,x^2)
42
D[0, 1](foo)(x, x^2)
43
44
TESTS:
45
46
We should be able to operate on functions evaluated at a
47
point, not just a symbolic variable, :trac:`12796`::
48
49
sage: from sage.symbolic.operators import FDerivativeOperator
50
sage: f = function('f')
51
sage: op = FDerivativeOperator(f, [0])
52
sage: op(1)
53
D[0](f)(1)
54
55
"""
56
if (not all(is_SymbolicVariable(x) for x in args) or
57
len(args) != len(set(args))):
58
# An evaluated derivative of the form f'(1) is not a
59
# symbolic variable, yet we would like to treat it
60
# like one. So, we replace the argument `1` with a
61
# temporary variable e.g. `t0` and then evaluate the
62
# derivative f'(t0) symbolically at t0=1. See trac
63
# #12796.
64
temp_args=[var("t%s"%i) for i in range(len(args))]
65
vars=[temp_args[i] for i in self._parameter_set]
66
return self._f(*temp_args).diff(*vars).function(*temp_args)(*args)
67
vars = [args[i] for i in self._parameter_set]
68
return self._f(*args).diff(*vars)
69
70
def __repr__(self):
71
"""
72
EXAMPLES::
73
74
sage: from sage.symbolic.operators import FDerivativeOperator
75
sage: f = function('foo')
76
sage: op = FDerivativeOperator(f, [0,1]); op
77
D[0, 1](foo)
78
"""
79
return "D[%s](%s)"%(", ".join(map(repr, self._parameter_set)), self._f)
80
81
def function(self):
82
"""
83
EXAMPLES::
84
85
sage: from sage.symbolic.operators import FDerivativeOperator
86
sage: f = function('foo')
87
sage: op = FDerivativeOperator(f, [0,1])
88
sage: op.function()
89
foo
90
"""
91
return self._f
92
93
def change_function(self, new):
94
"""
95
Returns a new FDerivativeOperator with the same parameter set
96
for a new function.
97
98
sage: from sage.symbolic.operators import FDerivativeOperator
99
sage: f = function('foo')
100
sage: b = function('bar')
101
sage: op = FDerivativeOperator(f, [0,1])
102
sage: op.change_function(bar)
103
D[0, 1](bar)
104
"""
105
return FDerivativeOperator(new, self._parameter_set)
106
107
def parameter_set(self):
108
"""
109
EXAMPLES::
110
111
sage: from sage.symbolic.operators import FDerivativeOperator
112
sage: f = function('foo')
113
sage: op = FDerivativeOperator(f, [0,1])
114
sage: op.parameter_set()
115
[0, 1]
116
"""
117
return self._parameter_set
118
119