plots - Maple Programming Help

Home : Support : Online Help : Graphics : Packages : plots : plots/plotcompare

plots

 plotcompare
 compare formulae graphically

 Calling Sequence plotcompare(f(z), g(z), z = a+c*I..b+d*I, options); plotcompare(f(z) = g(z), z = a+c*I..b+d*I , options); plotcompare(f, g, a+c*I..b+d*I, options); plotcompare(f = g, a+c*I..b+d*I, options);

Parameters

 f, g - functions or expressions to be plotted z - variable name a, b, c, d - real constants options - expression_plot, same_box = true, scale_range = positive number, shift_range = complex number, colors=[c1, c2], and any of the optional arguments accepted by plot, plot3d and plots[display]

Description

 • The plotcompare command generates plots of the real and imaginary parts of two expressions, so that you can see where, if anywhere, they differ on a given domain. plotcompare can also generate plots for the real and imaginary parts of a single expression just for visualization purposes (see optional argument expression_plot explained below). When comparing two expressions f(z) and g(z), the output of plotcompare consists of four related plots as follows

$\mathrm{Re}\left(f\left(z\right)\right)\mathrm{Re}\left(g\left(z\right)\right)$

$\mathrm{Im}\left(f\left(z\right)\right)\mathrm{Im}\left(g\left(z\right)\right)$

 • If the domain specified, z = a+c*I..b+d*I, is real, that is, $c=d=0$, the plotcompare command generates four 2-D plots of $\mathrm{Re}\left(f\left(z\right)\right)$, $\mathrm{Re}\left(g\left(z\right)\right)$, $\mathrm{Im}\left(f\left(z\right)\right)$, and $\mathrm{Im}\left(g\left(z\right)\right)$ on $z=a..b$. If the domain specified is imaginary, that is, $a=b=0$, plotcompare generates these four 2-D plots on $z=Ic..Id$.
 • If the domain specified z = a+c*I..b+d*I is complex, the plotcompare command generates four 3-D plots of $\mathrm{Re}\left(f\left(z\right)\right)$, $\mathrm{Re}\left(g\left(z\right)\right)$, $\mathrm{Im}\left(f\left(z\right)\right)$, and $\mathrm{Im}\left(g\left(z\right)\right)$, where $z=x+Iy$ and $a and $c.
 • If the domain is not given, it defaults to be the complex unit box $-1-I..1+I$.
 • The third or its equivalent fourth calling sequence corresponds to the first one. They allow the expressions to be input as procedures of one argument instead of formulae in a variable.  In these cases the domain argument must be a range (real or complex), not an equation with a variable on the left-hand side.
 • The global variable _P is assigned to a 2 by 2 array of the four plots $\mathrm{Re}\left(f\left(z\right)\right)$, $\mathrm{Re}\left(g\left(z\right)\right)$, $\mathrm{Im}\left(f\left(z\right)\right)$, and $\mathrm{Im}\left(g\left(z\right)\right)$. This array can be accessed by the user as desired for subsequent manipulation.
 • The plotcompare command generates the four plots by first performing four calls to either the plot command or the plot3d command, then creating an array with these plots and assigning it to the variable $\mathrm{_P}$, finally sending this array $\mathrm{_P}$ to the plots[display] command.
 • CAVEAT: Sometimes, the two expressions or functions being compared are equal over the complex plane but differ only in the value at a point or line (for example, a branch cut). Consider the functions $f\left(x\right)=\frac{1}{\sqrt{x}}$ and $g\left(x\right)=\sqrt{\frac{1}{x}}$. In these cases the 3-D plots will appear visually identical. To make the difference on the values visible use plotcompare to generate 2-D plots, for instance, giving a real (or purely imaginary) range, or directly using the assuming facility as shown in the examples.
 • This command is part of the plots package, so it can be used in the form plotcompare(..) only after executing the command with(plots). However, it can always be accessed through the long from of the command by using plots[plotcompare](..).

Optional arguments

 expression_plot
 This optional argument is used to generate the plots of the real and imaginary parts of a single expression passed as first argument; it is useful to visualize a given mathematical function or expression without making any comparison.
 same_box=true
 Using this optional argument results in the plots of the real parts of both functions being superimposed on the same plot, and the graphs of the imaginary parts of both functions being superimposed on the same plot.  The real and imaginary parts of the first function are given the color red and the second function blue. In this case the variable $\mathrm{_P}$ is assigned an array of only two plots.
 scale_range=c
 If the optional argument scale_range=c is given, the range of the plot is scaled by a factor of c where c must be a positive real constant. Note this factor can be less than one.
 shift_range= r + s I
 When this optional argument is given, the range of the plot is shifted from its value, say $\left(a+bI\right)\mathrm{..}\left(c+dI\right)$ to $\left(a+r+\left(b+s\right)I\right)\mathrm{..}\left(c+r+\left(d+s\right)I\right)$. This is useful when the difference between the expressions being plotted is visible only after shifting the plotting range (for example, when comparing some functions with their series representation. See Examples section).
 colors=[c1,c2]
 If the optional argument colors=[c1,c2] or colours=[c1,c2] is given, the real and imaginary parts of the first function are given the color c1 and the real and imaginary parts of the second function c2.
 • The following standard options are used by default by the plotcompare command when displaying the plots.

 orientation = [-18,75] axes = FRAMED, axesfont = [TIME,ROMAN,10] shading = ZHUE grid = [10,10]

 To override these defaults, you can specify different options as is usually done with the plot, plot3d, or plots[display] commands.

Examples

 > with(plots):

A comparison of $\mathrm{sin}\left(x\right)$ with its cubic Taylor polynomial. (Note that if there is no imaginary part, as in this example, the graphs of $\mathrm{Im}\left(f\right)$ and $\mathrm{Im}\left(g\right)$ will be empty.)

 > plotcompare( sin(x), x-x^3/6, x=-3..3 );

If you shift the range, for example to the right by 10, the function and its cubic approximation do not look alike anymore.

 > plotcompare( sin(x), x-x^3/6, x=-3..3, shift_range=10 );

Is the cube root of -8 equal to -2? In Maple, the function ${x}^{1/3}$ means the principal root, which is not real for $x<0$.  Hence the following are not the same for negative real x.

 > plotcompare( x^(1/3), signum(x)*abs(x)^(1/3), x=-2..2 );

Comparing the same expressions but using the same_box option and optional arguments of plot for thickness and coloring: ${x}^{1/3}$ appears in blue and and $\mathrm{signum}\left(x\right){\left|x\right|}^{1/3}$ in green.

 > plotcompare( x^(1/3), signum(x)*abs(x)^(1/3), x=-2..2, same_box=true, thickness=3, colors=[blue,green] );

In the above plots, for positive values of $x$ both the real and imaginary parts of the expressions being compared are the same while for negative values of $x$ they are different. A 3-D plot can make the regions where these expressions are equal or different more evident. (Try rotating this plot with the mouse and using the same_box option).

 > plotcompare( x^(1/3), signum(x)*abs(x)^(1/3), scale_range = 2 );

The following example shows two expressions which differ in value only over a line, so that the 3-D plots are visually the same.

 > plotcompare( 1/sqrt(x) = sqrt(1/x), grid=[20,20]  ); # use grid for a more accurate plot

Though not visible, the difference is in the value of the imaginary parts, $\mathrm{Im}\left(f\right)$ and $\mathrm{Im}\left(g\right)$, when taken over real and positive values of $x$. Note the branch cut. To examine the cut, you can rotate the plots above with the mouse.

The procedure recommended to turn the difference (if any) visible in cases like this, that is, whenever there are branch cuts in the 3-D plots, is to use plotcompare to generate 2-D plots, for instance giving a real range or using the assuming facility together with the optional argument same_box.

 > plotcompare( 1/sqrt(x) = sqrt(1/x), same_box) assuming real;  # equivalent to passing x = -1..1

In the example above, the expressions are not valid for real (Im(x) = 0) and negative values of x. For any other point in the complex plane not in RealRange(-infinity, 0) these expressions have the same value as suggested by the 3-D plots. For instance, the following two pairs of curves show that for purely imaginary values of $x$ the two functions agree.

 > plotcompare( 1/sqrt(x) = sqrt(1/x), same_box) assuming imaginary;  # equivalent to passing x=-I..I

In the two input lines above you can also use the option scale_range = N together with assuming, so that the range for the plots will respectively be x = -N..N and x = -N*I..N*I.

The following suggests that $\mathrm{ln}\left(z\left(1-z\right)\right)=\mathrm{ln}\left(z\right)+\mathrm{ln}\left(1-z\right)$

 > plotcompare( ln(z*(1-z)) = ln(z)+ln(1-z), z=-10-10*I..10+10*I );

while this other plot shows that $\mathrm{ln}\left(z\left(1+z\right)\right)\ne \mathrm{ln}\left(z\right)+\mathrm{ln}\left(1+z\right)$:

 > plotcompare( ln(z*(1+z)) = ln(z)+ln(1+z), scale_range=10 ); # equivalent to passing z = -10-10*I .. 10+10*I

This is the plot of the "expression" (in this case a function) BesselK(1/2,z), illustrating the branch cut of BesselK for Re(z) < 0

 $\left[{\mathrm{BesselK}}{}\left({a}{,}{z}\right){,}{z}{<}{0}\right]$ (1)
 > plotcompare(BesselK(1/2,z), expression_plot, 3); # the number 3 is a shortcut for grid = [30, 30]

The branch cut is visible in the second plot box for the imaginary part of the function and is located on the real axis, negative side. To manipulate each of the plots further enter ${\mathrm{_P}}_{1}$ for the real box plot or ${\mathrm{_P}}_{2}$ for the imaginary box plot, like in:

 > _P[2];

The following example illustrates the use of a procedure to input the expressions being plotted. The real and imaginary parts of $f$ and $g$ are equal only for $0<\mathrm{Re}\left(z\right)$.

 > f := z ->  sqrt(z^2*(1-z));
 ${f}{≔}{z}{→}\sqrt{{{z}}^{{2}}{}\left({1}{-}{z}\right)}$ (2)
 > g := z ->  z*sqrt(1-z);
 ${g}{≔}{z}{→}{z}{}\sqrt{{1}{-}{z}}$ (3)
 > plotcompare( f, g, -1-I..1+I );

To see where $f\left(z\right)$ differs from $g\left(z\right)$ input:

 > plot3d( abs(f(x+I*y) - g(x+I*y)), x=-1..1, y=-1..1, axes=FRAMED );

By constructing a piecewise function $h$, the plots become the same. This uses the same_box option to superimpose the plots for $f$ and $h$.

The default range of the plots below is -1-I..1+I.

 > h := z -> piecewise(Re(z)>0, g(z), Re(z)<=0, f(z));
 ${h}{≔}{z}{→}{\mathrm{piecewise}}{}\left({0}{<}{\mathrm{ℜ}}{}\left({z}\right){,}{g}{}\left({z}\right){,}{\mathrm{ℜ}}{}\left({z}\right){\le }{0}{,}{f}{}\left({z}\right)\right)$ (4)
 > plotcompare( f, h, same_box );

Consider the following identity relating the Airy and Bessel functions, taken from the Handbook of Mathematical Functions by Abramowitz and Stegun. The following plots show that this identity is, in fact, not valid over the whole complex plane.  This is the command to create the plot from the Plotting Guide.

 > id := AiryAi(z) = sqrt(3*z)*BesselK(1/3,2/3*z^(3/2))/3/Pi;
 ${\mathrm{id}}{≔}{\mathrm{AiryAi}}{}\left({z}\right){=}\frac{{1}}{{3}}{}\frac{\sqrt{{3}}{}\sqrt{{z}}{}{\mathrm{BesselK}}{}\left(\frac{{1}}{{3}}{,}\frac{{2}}{{3}}{}{{z}}^{{3}{/}{2}}\right)}{{\mathrm{π}}}$ (5)
 > plotcompare( id, grid=[15,15] );

The region of validity can be explored visually by superimposing the plots of the real parts and then the imaginary parts of the two functions. You can do this using the same_box option or without recomputing the plots taking advantage of the $\mathrm{_P}$ variable to which the array of plots was assigned when calling plotcompare.

 > display([ _P[1,1], _P[1,2] ], orientation=[-60,75]);
 > display([ _P[2,1], _P[2,2] ], orientation=[-60,75]);

The region of validity of the identity can also be explored by plotting for z real or imaginary.

 > plotcompare(id) assuming real;    # not equal for real z

 > plotcompare(id) assuming imaginary;    # equal for imaginary z

Consider the following identity.

 > id := hypergeom([a],[1/2],1/2*z^2) =       2^(a-1)*exp(1/4*z^2)*GAMMA(a+1/2)/Pi^(1/2)*       (CylinderU(2*a-1/2,z)+CylinderU(2*a-1/2,-z));
 ${\mathrm{id}}{≔}{\mathrm{hypergeom}}{}\left(\left[{a}\right]{,}\left[\frac{{1}}{{2}}\right]{,}\frac{{1}}{{2}}{}{{z}}^{{2}}\right){=}\frac{{{2}}^{{a}{-}{1}}{}{{ⅇ}}^{\frac{{1}}{{4}}{}{{z}}^{{2}}}{}{\mathrm{Γ}}{}\left({a}{+}\frac{{1}}{{2}}\right){}\left({\mathrm{CylinderU}}{}\left({2}{}{a}{-}\frac{{1}}{{2}}{,}{z}\right){+}{\mathrm{CylinderU}}{}\left({2}{}{a}{-}\frac{{1}}{{2}}{,}{-}{z}\right)\right)}{\sqrt{{\mathrm{π}}}}$ (6)

The Maple simplify command is not able to prove that this identity is valid for arbitrary values of a.

 > simplify( (lhs-rhs)(id) );
 ${-}\frac{{-}{\mathrm{hypergeom}}{}\left(\left[{a}\right]{,}\left[\frac{{1}}{{2}}\right]{,}\frac{{1}}{{2}}{}{{z}}^{{2}}\right){}\sqrt{{\mathrm{π}}}{+}{{2}}^{{a}{-}{1}}{}{{ⅇ}}^{\frac{{1}}{{4}}{}{{z}}^{{2}}}{}{\mathrm{Γ}}{}\left({a}{+}\frac{{1}}{{2}}\right){}\left({\mathrm{CylinderU}}{}\left({2}{}{a}{-}\frac{{1}}{{2}}{,}{z}\right){+}{\mathrm{CylinderU}}{}\left({2}{}{a}{-}\frac{{1}}{{2}}{,}{-}{z}\right)\right)}{\sqrt{{\mathrm{π}}}}$ (7)

Although you cannot prove this identity using plotcompare, it does provide a quick indication that the identity is true for different values of the parameter $a$.

 > for a in [-2,-1/3,1] do  __________________________________;  'a'=a;  plotcompare(id,grid=[5,5]);  # use of a small grid to speed-up end do;
 ${\mathrm{______________________________}}$
 ${a}{=}{-}{2}$

 ${\mathrm{______________________________}}$
 ${a}{=}{-}\frac{{1}}{{3}}$

 ${\mathrm{______________________________}}$
 ${a}{=}{1}$

This identity can in fact be verified exactly for arbitrary values of $a$, if you first convert to hypergeom.

 > simplify( (lhs-rhs)(convert(id,hypergeom)) );
 ${0}$ (8)

The command to create the 2-D plot from the Plotting Guide is

 > plotcompare( -sin(x)^2 - 2 + 2*I, -sin(2*x)^2 - 2 + 2*I, x=-Pi..Pi);

 >