| 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_sympysimplify 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_sympysimplify 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_sympysimplify 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.
Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.