Closed jasongrout closed 9 years ago
(After some discussion on IRC) It seems that Sage is really lacking in the differential geometry area. If some good work is done there, this request will likely automatically be satisfied.
A short term solution would be to write a vector field class.
# a possible implementation of div, for irc user hedgehog
var('x, y, z')
(x, y, z)
f1 = x^2 + 2*y; f2 = x^3 + sin(z); f3 = y*z + 2
F = vector([f1, f2, f3])
print F(x=0, y=2, z=3)
def _variables(F):
# this is a little funky -- we're finding all the variables that occur
# in the components of F, and somehow choosing an ordering. There are
# other (better ways) but I'm not sure what the correct interface is.
# For now, the user can specify the variables if they choose, just
# like the gradient method.
variables = list(set(flatten([ list(f.variables()) for f in F ])))
variables.sort()
return variables
def div(F, variables=None):
assert len(F) == 3
if variables is None:
variables = _variables(F)
s = 0
for i in range(len(F)):
s += F[i].derivative(variables[i])
return s
print F
print div(F)
print div(F, variables=(y, x, z))
def curl(F, variables=None):
assert len(F) == 3
if variables is None:
variables = _variables(F)
assert len(variables) == 3
x, y, z = variables
Fx, Fy, Fz = F
i = Fz.derivative(y) - Fy.derivative(z)
j = Fz.derivative(z) - Fx.derivative(x)
k = Fy.derivative(x) - Fz.derivative(y)
return vector([i, j, k])
print curl(F)
print curl(F, variables=(y, x, z))
# let's assert that div(curl) == 0
# we need the variables because the ordering is suspect otherwise: for me,
# sage: _variables(F)
# [x, y, z]
# sage: _variables(curl(F))
# [z, x, y]
assert div(curl(F, variables=(x, y, z)), variables=(x, y, z)) == 0
See #5506 for a collection of things to add to a symbolic vectors class
There is a 7-dim curl. Why doesn't the generic vector one work?
What generic curl (I don't think it's in Sage right now)? Or are you saying we should just add curl to generic vectors? I agree; no reason to add this to just the callable symbolic vectors class (what was I thinking?).
Also
j = Fx.derivative(z) - Fz.derivative(x)
Branch: u/robertwb/ticket/3021
I was just going to work on this today!
I haven't tested the code, but looks good. Just a few things:
._variables()
?Expression.gradient
is called variables
; I think it would be good to switch vars
to variables
for consistency..curl()
with the variables parameter.raise TypeError, "curl only defined for 3 dimensions"
syntax is deprecated, and that the string should be passed as an argument.Nitpicking on the error message in div
: I would change it from "variable list must be equal to the dimension of self"
to "number of variables must equal dimension of self"
.
About point 4 in eviatarbach's comment:
ValueError
in div
on follows the new syntax. By contrast, both the TypeError
and ValueError
in curl
follow the old syntax.More nitpicking:
Use "Return" instead of "Returns" in docstrings, see PEP 0257:
The docstring is a phrase ending in a period. It prescribes the function or method's effect as a command ("Do this", "Return that"), not as a description; e.g. don't write "Returns the pathname ...".
Should there be a docstring and tests for the _variables
function?
In examples for div
, remove extra space before w
in R.<x,y,z, w> = QQ[]
Another thought:
The extracting of variables from each element and then sorting by name looks scary, and can give unexpected results (if your vector is (x1, x10, x2)
, I believe you would get 3 for the divergence instead of 1 as you might expect, since '10'
comes before '2'
in the alphanumeric sort). Unless there's a better solution, I think we should have it so that the variables list has to always be given explicitly.
If your vectors are callable symbolic vectors, you should be able to get the list of arguments from the base ring (since you've already explicitly given an order to the variables):
sage: f(x,y,z)=(x*y,y*z,z^2)
sage: f
(x, y, z) |--> (x*y, y*z, z^2)
sage: type(f)
<class 'sage.modules.vector_callable_symbolic_dense.Vector_callable_symbolic_dense'>
sage: f.base_ring().arguments()
(x, y, z)
That's a great idea. I think we should have that for callable vectors.
For the record, Mathematica and Maple both have default coordinate systems, which is how they deal with this issue.
Branch pushed to git repo; I updated commit sha1. New commits:
f353c94 | Missing doctest. |
I've addressed all the comments.
I was going to look at this, but looks like Eviatar and Samuel are on top, so just think of this as a ping :)
Replying to @kcrisman:
I was going to look at this, but looks like Eviatar and Samuel are on top, so just think of this as a ping :)
Feel free to look at this yourself :)
My 2 cents, I'd have curl also take 2-dim inputs and return a vector. It might also be a good idea for a way (likely another method) which takes a 2-dim input and return a scalar as a shorthand (a la Green's theorem).
+1 to getting these (fundamental) methods into Sage.
Are there any enhancements to this with-patch, 7-year-old ticket that simply can't be deferred 'till later so we can finally get this in?
Changed branch from u/robertwb/ticket/3021 to u/tscrim/curl_divergence-3021
Author: Robert Bradshaw
Reviewer: Eviatar Bach, Samuel Lelièvre, Travis Scrimshaw
Changed branch from u/tscrim/curl_divergence-3021 to 7b49240
Make curl work if the vector has 2 or 3 components. Is there a higher-dimensional analogue for curl?
CC: @eviatarbach
Component: calculus
Author: Robert Bradshaw
Branch/Commit:
7b49240
Reviewer: Eviatar Bach, Samuel Lelièvre, Travis Scrimshaw
Issue created by migration from https://trac.sagemath.org/ticket/3021