1 | initial version |
Using SageMath 8.7, I confirm that the command grad(Phi)
runs for ever...
Actually, this is not the computation of the gradient by itself that takes time but its simplification. The quantity phi_ges
from which the scalar field Phi
is formed is a quite lengthy symbolic expression. Sage evaluates
diff(phi_ges, z)
quite fast but then the command
diff(phi_ges, z).simplify_full()
runs for ages...
It turns out that grad(Phi)
is using a simplification sequence pretty similar to simplify_full()
(the details are here) to simplify its output. Hence the observed behavior.
Maybe this is an issue of the simplification of long symbolic expressions involving Heaviside functions in Sage...
2 | No.2 Revision |
Using SageMath 8.7, I confirm that the command grad(Phi)
runs for ever...
Actually, this is not the computation of the gradient by itself that takes time but its simplification. The quantity phi_ges
from which the scalar field Phi
is formed is a quite lengthy symbolic expression. Sage evaluates
diff(phi_ges, z)
quite fast but then the command
diff(phi_ges, z).simplify_full()
runs for ages...
It turns out that grad(Phi)
is using a simplification sequence pretty similar to simplify_full()
(the details are here) to simplify its output. Hence the observed behavior.
Maybe this is an issue of the simplification of long symbolic expressions involving Heaviside functions in Sage...
EDIT: a possible workaround is to replace simplify_chain_real
by the mere simplify
function as the simplifying function associated to the default chart (x,z)
of the Euclidean space S
; to do this, it suffices to insert the line
S.default_chart()._calc_method._simplify_dict['SR'] = simplify
just after the definition S.<x,z> = EuclideanSpace(2)
.
3 | No.3 Revision |
Using SageMath 8.7, I confirm that the command grad(Phi)
runs for ever...
Actually, this is not the computation of the gradient by itself that takes time but its simplification. The quantity phi_ges
from which the scalar field Phi
is formed is a quite lengthy symbolic expression. Sage evaluates
diff(phi_ges, z)
quite fast but then the command
diff(phi_ges, z).simplify_full()
runs for ages...
It turns out that grad(Phi)
is using a simplification sequence pretty similar to simplify_full()
(the details are here) to simplify its output. Hence the observed behavior.
Maybe this is an issue of the simplification of long symbolic expressions involving Heaviside functions in Sage...
EDIT: a possible workaround is to replace simplify_chain_real
by the mere simplify
function as the simplifying function associated to the default chart (x,z)
of the Euclidean space S
; to do this, it suffices to insert the line
S.default_chart()._calc_method._simplify_dict['SR'] = simplify
just after the definition S.<x,z> = EuclideanSpace(2)
.
Explanations:
S.default_chart()
is the chart of
Cartesian coordinates $(x,z)$ on the
Euclidean plane $S$ _calc_method
is the calculus method, i.e. the tool managing the symbolic backend that is used when perfoming calculations with the chart $(x,z)$: either the symbolic ring SR
(SageMath's default) or SymPy
_simplify_dict
is the dictionary of simplifying functions associated to each symbolic backend: by default, _simplify_dict['SR'] = simplify_chain_real
and _simplify_dict['sympy'] = simplify_chain_real_sympy
simplify
in the right-hand side of the suggested command is SageMath's minimal simplifying function: it is fast, but it does not do much. You can replace it by any function that maps a symbolic expression to another symbolic expression.4 | No.4 Revision |
Using SageMath 8.7, I confirm that the command grad(Phi)
runs for ever...
Actually, this is not the computation of the gradient by itself that takes time but its simplification. The quantity phi_ges
from which the scalar field Phi
is formed is a quite lengthy symbolic expression. Sage evaluates
diff(phi_ges, z)
quite fast but then the command
diff(phi_ges, z).simplify_full()
runs for ages...
It turns out that grad(Phi)
is using a simplification sequence pretty similar to simplify_full()
(the details are here) to simplify its output. Hence the observed behavior.
Maybe this is an issue of the simplification of long symbolic expressions involving Heaviside functions in Sage...
EDIT: a possible workaround is to replace simplify_chain_real
by the mere simplify
function as the simplifying function associated to the default chart (x,z)
of the Euclidean space S
; to do this, it suffices to insert the line
S.default_chart()._calc_method._simplify_dict['SR'] = simplify
just after the definition S.<x,z> = EuclideanSpace(2)
.
Explanations:
S.default_chart()
is the chart of
Cartesian coordinates $(x,z)$ on the
Euclidean plane $S$ _calc_method
is the calculus method, i.e. the tool managing the symbolic backend that is used when perfoming calculations with the chart $(x,z)$: either the symbolic ring SR
(SageMath's default) or SymPy
_simplify_dict
is the dictionary of simplifying functions associated to each symbolic backend: by default, _simplify_dict['SR'] = simplify_chain_real
and _simplify_dict['sympy'] = simplify_chain_real_sympy
simplify
in the right-hand side of the suggested command is SageMath's minimal simplifying function: it is fast, but it does not do much. You can replace it by any function that maps a symbolic expression to another symbolic expression.With the above command,
%time print((-grad(Phi)).display())
returns
CPU times: user 498 ms, sys: 18.6 ms, total: 517 ms
Wall time: 396 ms
5 | No.5 Revision |
Using SageMath 8.7, I confirm that the command grad(Phi)
runs for ever...
Actually, this is not the computation of the gradient by itself that takes time but its simplification. The quantity phi_ges
from which the scalar field Phi
is formed is a quite lengthy symbolic expression. Sage evaluates
diff(phi_ges, z)
quite fast but then the command
diff(phi_ges, z).simplify_full()
runs for ages...
It turns out that grad(Phi)
is using a simplification sequence pretty similar to simplify_full()
(the details are here) to simplify its output. Hence the observed behavior.
Maybe this is an issue of the simplification of long symbolic expressions involving Heaviside functions in Sage...
EDIT: a possible workaround is to replace simplify_chain_real
by the mere simplify
function as the simplifying function associated to the default chart (x,z)
of the Euclidean space S
; to do this, it suffices to insert the line
S.default_chart()._calc_method._simplify_dict['SR'] = simplify
just after the definition S.<x,z> = EuclideanSpace(2)
.
Explanations:
S.default_chart()
is the chart of
Cartesian coordinates $(x,z)$ on the
Euclidean plane $S$ _calc_method
is the calculus method, i.e. the tool managing the symbolic backend that is used when perfoming calculations with the chart $(x,z)$: either the symbolic ring SR
(SageMath's default) or SymPy
_simplify_dict
is the dictionary of simplifying functions associated to each symbolic backend: by default, _simplify_dict['SR'] = simplify_chain_real
and _simplify_dict['sympy'] = simplify_chain_real_sympy
simplify
in the right-hand side of the suggested command is SageMath's minimal simplifying function: it is fast, but it does not do much. You can replace it by any function that maps a symbolic expression to another symbolic expression.With the above command,
%time print((-grad(Phi)).display())
returns
CPU times: user 498 ms, sys: 18.6 ms, total: 517 ms
Wall time: 396 ms
EDIT (3 April 2019): motivated by your question, I've opened the Trac ticket #27601 to allow for an easy modification of the simplifying function.