Ask Your Question

Revision history [back]

Iterating on @FrédéricC's answer...

In the following we

  • increase the number of plot points to improve the resolution of the image,
  • use RDF and CDF: "real double field", "complex double field" -- floating-point real and complex numbers,
  • avoid Sage's "symbolic variables" and "symbolic ring" throughout.

Doing this, the spike however reaches higher and higher values, so it becomes necessary to truncate the z values.

Pick a colormap and define $\tau = 2\pi$.

sage: cm = colormaps.jet
sage: tau = 2 * RDF.pi()

Define f:

sage: def f(x, y):
....:     z = CDF(x, y)
....:     return (z - 2) / (z + 3)**2

Define f_abs (modulus of f):

sage: f_abs = lambda x, y: f(x, y).abs()

Define truncation:

sage: trunc = lambda x, t: x if x.abs() < t else RDF.nan()

Pick a bound to truncate:

sage: zbound = 8

Define f_abs_trunc as f_abs truncated to the chosen bound.

sage: f_abs_trunc = lambda x, y: trunc(f_abs(x, y), zbound)

Define f_arg_color as the coloring for the argument of f:

sage: f_arg_color = lambda x, y: f(x, y).arg() / tau + RDF(0.5)

Compute the plot:

sage: p = plot3d(f_abs_trunc, (-4, 4), (-4, 4), color=(f_arg_color, cm), plot_points=200)

Show the plot (choose viewer='threejs' or viewer='jmol' or viewer='tachyon'):

sage: p.show(viewer='threejs')

Increasing plot_points further makes a nicer plot while also increasing the time to show the plot. Try for example plot_points=400 or even plot_points=800.

One can also increase zbound to see more of the spike (try for example zbound=1e2 or zbound=2e5). Or plot f_abs instead of f_abs_trunc to avoid truncation altogether.