2019-08-30 15:19:00 +0200 commented answer Changing chart multiple times in sagemanifolds @eric_g: Thanks for the further update, and I'm glad to learn this will be fixed in the next release. 2019-08-29 23:39:32 +0200 commented answer Changing chart multiple times in sagemanifolds eric_g: Thanks for the answer. I assume it is correct, but it seems a surprising situation. Since $\psi_3\circ\psi_1^{-1} = (\psi_3\circ\psi_2^{-1})\circ(\psi_2\circ\psi_1^{-1})$, I don't see why the inverse maps should need to be defined. In particular, in the example I'm thinking of (converting standard Schwarzschild coordinates to Regge-Wheeler tortoise coordinates, then Eddington-Finkelstein null coordinates, and then Kruskal), it is impossible to invert the first coordinate transform. Does this mean that, while I can directly define a transition map from the first coordinate system to the third, I can't define it by going from the first to the second and then the second to the third? This seems like an unnecessary restriction. rburing: I would also like clearer error message. 2019-08-29 19:28:21 +0200 asked a question Changing chart multiple times in sagemanifolds In sagemanifolds, I would like to change from an initial chart to a second and then, from the second to the third. My attempts fail. Is this my fault or a sagemanifolds problem? (Apologies if I already asked this.) Here is a minimal (not) working example. I run the following file: theManifold = Manifold(1, 'M', r'\mathcal{M}') theOpenSet = theManifold.open_subset('U') theFirstChart. = theOpenSet.chart(r'x') g = theManifold.riemannian_metric('g') g[0,0] = 1 show(g.display()) theSecondChart. = theOpenSet.chart(r'y') ChangeFirst_to_Second = theFirstChart.transition_map(theSecondChart,[x]) show(g.display(theSecondChart.frame())) theThirdChart. = theOpenSet.chart(r'z') ChangeSecond_to_Third = theSecondChart.transition_map(theThirdChart,[y]) show(g.display(theThirdChart.frame()))  The output is g=dx⊗dx g=dy⊗dy  and then a few screens of error messages, of which the most clear is "no common chart for the multiplication". 2019-07-29 10:47:32 +0200 received badge ● Enlightened (source) 2019-07-29 10:47:32 +0200 received badge ● Good Answer (source) 2019-06-03 14:06:23 +0200 asked a question Trouble with spherical coordinates in sagemanifolds I'm probably doing something obviously wrong, but I'd appreciate help with the following. I load the following file theManifold = Manifold(3, 'M', r'\mathcal{M}') theOpenSet = theManifold.open_subset('theOpenSet') CartesianChart. = theOpenSet.chart(r'x y z') g = theManifold.lorentzian_metric('g') g[0,0] = 1 g[1,1] = 1 g[2,2] = 1 show(g.display()) sphericalChart. = theOpenSet.chart(r'r th:(0,pi):\theta ph:(0,2*pi):\phi') spherical_to_Cartesian = sphericalChart.transition_map(CartesianChart,[r*sin(th)*sin(ph),r*sin(th)*cos(ph),r*cos(th)]) Cartesian_to_spherical = spherical_to_Cartesian.inverse()  Sage then gives the error message "ValueError: no solution found; use set_inverse() to set the inverse manually". If I replace the final two lines with  Cartesian_to_spherical = CartesianChart.transition_map(sphericalChart[sqrt(x^2+y^2+z^2),arctan(z/sqrt(x^2+y^2)),arctan(y/x)]) spherical_to_Cartesian = Cartesian_to_spherical.inverse()  then Sage gives the following unable to make sense of Maxima expression '[if((-pi/2e^(2I_SAGE_VAR_xxxx1))/(e^(4I*_SA ... [dozens of lines of similar] ... tan(_SAGE_VAR_xxxx1)^2+1)],union())]' in Sage. I am aware that Sagemanifolds has native commands for using spherical coordinates. I'm attempting to work on a more complicated manifold, and this is is a minimal working example to demonstrate my problems. 2019-06-03 13:44:40 +0200 commented answer Bel decomposition I think what you want is e0 = M.one_form() e0[0] = sqrt(1-2*m/r)  This gives a unit timelike one-form. Of course, relativity being relativity, there are infinitely many other choices of unit timelike vector. This becomes a more serious issue when working in Kerr. 2019-05-22 11:42:30 +0200 received badge ● Scholar (source) 2019-05-22 11:40:04 +0200 commented answer set_default_chart seems to fail When I set the defaults based for theOpenSet, I get (1/2) y dx⊗dx. If I use theManifold.set_default_frame(secondChart.frame() theOpenSet.set_default_chart(secondChart)  then I do get (1/8) y dy ⊗ dy, as desired. I don't see the logic, but thanks for getting this to work. 2019-05-22 11:37:02 +0200 received badge ● Supporter (source) 2019-05-22 00:01:32 +0200 received badge ● Nice Answer (source) 2019-05-22 00:00:24 +0200 received badge ● Student (source) 2019-05-21 23:47:04 +0200 received badge ● Teacher (source) 2019-05-21 20:56:03 +0200 answered a question Bel decomposition The Bel decomposition does not appear in the sagemanifolds reference document, so I assume it is a default command. Nonetheless, it is fairly easy to implement. Assuming that one already has a metric g and a 1-form e0 (perhaps from the 0th element of the coordinate coframe) theVolumeForm = g.volume_form() theStarForTwoForms = theVolumeForm.up(g,0).up(g,1) theRiemann = g.riemann() theRiemannAllDown = theRiemann.down(g,0) theStarRiemann = theStarForTwoForms['^{ef}_{ab}']*theRiemannAllDown['_{efcd}'] theStarRiemannStar = theStarForTwoForms['^{ef}_{cd}']*theStarRiemann['_{abef}'] theElectrograviticTensor = (theRiemannAllDown['_{abcd}']*(e0.up(g))['^d'])['_{abc}']*(e0.up(g))['^b'] theMagnetograviticTensor = (theStarRiemann['_{abcd}']*(e0.up(g))['^d'])['_{abc}']*(e0.up(g))['^b'] theTopograviticTensor = (theStarRiemannStar['_{abcd}']*(e0.up(g))['^d'])['_{abc}']*(e0.up(g))['^b']  I have probably mangled some signs in the choice of order of raising and contracting indices on the volume form. (Some tricks to be aware of: When using up and down, since sagemanifolds stores all contravariant indices first, for a fully contravariant tensor, raising index 1 and then lowering index 1 gives an error since the raised index is automatically moved to index 0. The * operation on tensor only works on a pair of tensors. The latex notation for indices (e.g. ['^{ab}']) can be used to take products and contract tensors, but the latex indexing is lost once the * operation is complete. Thus for a product of three indices, one needs to open a parenthesis, apply the indices to get the correct contraction and product for the first two tensors, close the parenthesis, apply a new set of indices, and then multiply by the third tensor.) 2019-05-21 13:34:53 +0200 commented question tangent space vector mapping Regarding (2), I couldn't reproduce this. In particular, when I create a manifold (and define some coordinates on it) and then run p = theManifold.point(name='p') TpM = theManifold.tangent_space(p) v = TpM.an_element() v.dipslay(), I get the error message ValueError: no basis could be found for computing the components in the None 2019-05-21 13:16:05 +0200 asked a question set_default_chart seems to fail I load the following file theManifold = Manifold(1,'M',r'\mathcal{M}') theManifold = Manifold(1,'M',r'\mathcal{M}') theOpenSet = theManifold.open_subset('U') firstChart. = theOpenSet.chart(r'x') g=theManifold.riemannian_metric('g') g[0,0] = x show("g with first chart") show(g.display()) secondChart. = theOpenSet.chart('y') first_to_second = firstChart.transition_map(secondChart,[2*x]) second_to_first = first_to_second.inverse() show("g with secondChart.frame() and secondChart as arguments to display") show(g.display(secondChart.frame(),secondChart)) theManifold.set_default_frame(secondChart.frame()) theManifold.set_default_chart(secondChart) show("g with secondChart.frame() and secondChart as defaults") show(g.display())  The output is 𝚐 𝚠𝚒𝚝𝚑 𝚏𝚒𝚛𝚜𝚝 𝚌𝚑𝚊𝚛𝚝 g=x dx⊗dx 𝚐 𝚠𝚒𝚝𝚑 𝚜𝚎𝚌𝚘𝚗𝚍𝙲𝚑𝚊𝚛𝚝.𝚏𝚛𝚊𝚖𝚎() 𝚊𝚗𝚍 𝚜𝚎𝚌𝚘𝚗𝚍𝙲𝚑𝚊𝚛𝚝 𝚊𝚜 𝚊𝚛𝚐𝚞𝚖𝚎𝚗𝚝𝚜 𝚝𝚘 𝚍𝚒𝚜𝚙𝚕𝚊𝚢 g=1/8 y dy⊗dy 𝚐 𝚠𝚒𝚝𝚑 𝚜𝚎𝚌𝚘𝚗𝚍𝙲𝚑𝚊𝚛𝚝.𝚏𝚛𝚊𝚖𝚎() 𝚊𝚗𝚍 𝚜𝚎𝚌𝚘𝚗𝚍𝙲𝚑𝚊𝚛𝚝 𝚊𝚜 𝚍𝚎𝚏𝚊𝚞𝚕𝚝𝚜 g=1/4 x dy⊗dy  In particular, when the secondChart and secondChart.frame() have been set as defaults, the metric g is expanded with respect to the second frame, but the components are still expressed in the first coordinates. Is there a way to set defaults so that g appears as 1/8 y dy ⊗dy? 2019-03-25 23:51:51 +0200 commented answer simplify_trig and sorting, for example in fractions I upgraded to sagemath 8.6 (the latest version with binaries available for my system), and this now works. Thanks for pointing out to use newer versions. 2019-03-24 12:58:15 +0200 asked a question simplify_trig and sorting, for example in fractions The output of show((1-cos(x)^2.simplify_trig()) show((cos(x)^2-1).simplify_trig())  is sin(x)^2 cos(x)^2-1.  Even worse, the result of  (sin(x)^2/(1-cos(x)^2)).simplify().simplify_trig()  is  -(sin(x)^2/(cos(x)^2-1)  when it should be 1. Is there anyway to get sagemath to simplify trigonometric expressions more intelligently?