Ich habe die alten Plots upgedatet und das
Schwarzschild-Paraboloid für die Längenexpansion als Hintergrund hinzugefügt. In Bild 2 wo zum Vergleich nach Newton geplottet wurde sind die Abstände gleich lang (r1..r2=r2-r1), da Newton kein Paraboloid sondern eine Fläche über 2 Dimensionen spannt, während bei Einstein mehr Radius in einen Kreis passt als der Umfang durch 2π (r1..r2=∫{1/√[1-rs/r], r=r1..r2}). In allen drei Plots wird nach der selben Koordinatenzeit geplottet (at infinity ist es in jedem Szenario gleichzeitig gleich spät):

Wenn der Monitor zu klein oder der
Computer zu langsam ist einfach das Bild anklicken um den Rest der Seite auszublenden oder downloaden und mit QuickTime ansehen.
Code:
(* Schwarzschild Bewegungsgleichung || yukterez.net *)
G = 1; M = 1; c = 1; rs = 2 G M/c^2;
r0 = 15/10 rs; v0 = 999/1000c c; φ = 0; θ0 = 0; z = 1; tau = 30;
vr0 = v0 Sin[φ]/j*k; vθ0 = v0/r0 Cos[φ]/j;
d1 = z/5; d2 = d1; wp = 24;
j = Sqrt[1 - v0^2/c^2];
k = Sqrt[1 - rs/r0];
Needs["DifferentialEquations`NDSolveProblems`"];
Needs["DifferentialEquations`NDSolveUtilities`"];
sol = NDSolve[{
r''[t] == -((G M)/r[t]^2) + r[t] θ'[t]^2 - (3 G M)/c^2 θ'[t]^2,
r'[0] == vr0,
r[0] == r0,
θ''[t] == -((2 r'[t] θ'[t])/r[t]),
θ'[0] == vθ0,
θ[0] == θ0,
τ'[t] == Sqrt[c^2 r[t] + r[t] r'[t]^2 - c^2 rs + r[t]^3 θ'[t]^2 - r[t]^2 rs θ'[t]^2]/(c Sqrt[r[t] - rs] Sqrt[1 - rs/r[t]]),
τ[0] == 0
}, {r, θ, τ}, {t, 0, z},
MaxSteps -> Infinity, Method -> {"StiffnessSwitching",
Method -> {"ExplicitRungeKutta", Automatic}},
WorkingPrecision -> wp,
InterpolationOrder -> All];
t[ξ_] :=
Quiet[χ /.
FindRoot[
Evaluate[τ[χ] /. sol][[1]] - ξ, {χ, 0},
WorkingPrecision -> wp, Method -> Automatic]];
Τ := Quiet[t[ι]];
x[t_] := (Sin[Evaluate[θ[t] /. sol]] Evaluate[r[t] /. sol])[[1]]
y[t_] := (Cos[Evaluate[θ[t] /. sol]] Evaluate[r[t] /. sol])[[1]]
s[text_] := Style[text, FontSize -> font]; font = 11;
(* proper time *) Do[Print[
Rasterize[Grid[{{Show[Graphics[{
{Black, Circle[{0, 0}, rs]},
{Lighter[Gray], Dashed, Circle[{0, 0}, r0]}},
Frame -> True, ImageSize -> 400, PlotRange -> 2 r0],
Graphics[{PointSize[0.01], Red, Point[{x[т], y[т]}]}],
ParametricPlot[{x[η], y[η]}, {η, 0, т},
PlotStyle->{LightGray}],
ParametricPlot[{x[η], y[η]}, {η, 0, т},
ColorFunction -> Function[{x, y, η},
Hue[0, 1, 0.5, Max[Min[(-т + (η + d2))/d2, 1], 0]]],
ColorFunctionScaling -> False]]},
{Grid[{
{" ", s["proper time"], " = ", s[N[т, 8]], s["GM/c³"]},
{" ", s["coordinate time"], " = ", s[N[Evaluate[τ[т] /. sol][[1]], 8]], s["GM/c³"]},
{" ", s["time dilation"], " = ", s[N[Evaluate[τ'[т] /. sol][[1]], 8]], s["dτ/dt"]},
{" ", s["angle"], " = ", s[N[Evaluate[(θ[т] /. sol) 180/Pi][[1]], 8]], s["degree"]},
{" ", s["radial distance"], " = ", s[N[Evaluate[r[т] /. sol][[1]], 8]], s["GM/c²"]},
{" ", s["x-Axis"], " = ", s[N[x[т], 8]], s["GM/c²"]},
{" ", s["y-Axis"], " = ", s[N[y[т], 8]], s["GM/c²"]}
}, Alignment -> Left]}}, Alignment -> Left]]
], {т, T/300, T, T/300}]
(* coordinate time *) Do[Print[
Rasterize[Grid[{{Show[Graphics[{
{Black, Circle[{0, 0}, rs]},
{Lighter[Gray], Dashed, Circle[{0, 0}, r0]}},
Frame -> True, ImageSize -> 400, PlotRange -> 2 r0],
Graphics[{PointSize[0.01], Red, Point[{x[Τ], y[Τ]}]}],
ParametricPlot[{x[η], y[η]}, {η, 0, Τ},
PlotStyle->{LightGray}],
ParametricPlot[{x[η], y[η]}, {η, 0, Τ},
ColorFunction ->
Function[{x, y, η},
Hue[0, 1, 0.5, Max[Min[(-Τ + (η + d2))/d2, 1], 0]]],
ColorFunctionScaling -> False]]},
{Grid[{
{" ", s["proper time"], " = ", s[N[Τ, 8]], s["GM/c³"]},
{" ", s["coordinate time"], " = ", s[N[ι, 8]], s["GM/c³"]},
{" ", s["time dilation"], " = ", s[N[Evaluate[τ'[Τ] /. sol][[1]], 8]], s["dτ/dt"]},
{" ", s["angle"], " = ", s[N[Evaluate[(θ[Τ] /. sol) 180/Pi][[1]], 8]], s["degree"]},
{" ", s["radial distance"], " = ", s[N[Evaluate[r[Τ] /. sol][[1]], 8]], s["GM/c²"]},
{" ", s["x-Axis"], " = ", s[N[x[Τ], 8]], s["GM/c²"]},
{" ", s["y-Axis"], " = ", s[N[y[Τ], 8]], s["GM/c²"]}
}, Alignment -> Left]}}, Alignment -> Left]]
], {ι, tau/300, tau, tau/300
Der neue Code verwendet jetzt einen Stiffness Switcher mit Runge Kutta, was sich aber nur in der Nähe des EH auszahlt. Die weiteren Orbits können auch mit MachinePrecision und Method->Automatic in sehr viel kürzerer Zeit ausreichend genau berechnet werden.
Updatend,
