ROOTS
A Graphical Investigation of the Complex
by Mark Hampton

Pre-requisites

This lesson assumes that the student is familiar with the basics of function notation, basic graphs, complex numbers, and terminology.

Student Instructions

When you see text printed like this, you need to read the explanation.

When you see text printed like this,  
    these are programs that generate the plots in Mathematica.

When you see text printed like this, you are being asked a question that requires a typed response in the yellow blank.

When you see a box like this, you will type your answer in here.

What are Roots?

Roots are sometimes called Zeros, x-Intercepts, or Solutions.

Why are they called Zeros?
      Because they consist of those values of x where f[x]=0.

Why are they called x-Intercepts?
      Since our graphs on a two dimensional plane use the value of f[x] as the y-coordinate, then the values for x where f[x]=0 correspond to the points (x,0) on the x-axis. These are the points where the graph intercepts the x-axis.

Why are they called x-Solutions?
     If we were using the function f[x] = (x^(2 )) - 6  x  + 9, then the values of x for which f[x] = 0 would represent
     the solutions to the equation 0 = (x^(2 )) - 6  x  + 9.

For our purposes,we will refer to these points as the Roots of the function with the understanding that we are also referring to the x-Intercept of the function.

The Number of Roots in Polynomials

The Fundamental Theorem of Algebra (FTA) states
Every polynomial equation of degree n with complex coefficients has n roots in the complex numbers.

So a polynomial with the highest exponent of x as 2 should have two roots in the complex numbers. A polynomial with the highest exponent of x as 3 should have three roots in the complex numbers. Since the Real numbers are a subset of the complex numbers (a + bi) we will then look at all of the following explanations in terms of these real numbers in complex form.

Roots of 1st Degree Polynomials

First degree polynomials are of the form y = f[x] = a(x^1)+ b 
where a and b are some complex numbers and a≠0.

Example 1:  y =1x + 0

In this example, a is the complex number 1 + 0i, and b is the complex number 0 + 0i
First we begin by graphing the function on a standard 2 dimensional plane.

<< "Graphics`Colors`"
Clear[
        a, b, f, t, x, xmin, xmax, ymin, 
        ymax];
xmin = -10;
xmax = 
        10;
ymin = -10;
ymax = 10;
a = 
        1;
b = 
        0;
f[x_] = 
        a*x  + b;
linePlot = 
        Plot[f[x], {x, xmin, xmax}, PlotStyle -> {Red, Thickness[ .01]}, 
          PlotRange -> {{xmin, xmax}, {ymin, ymax}}, 
          AxesLabel -> {"x", "f[x]"}, 
          DisplayFunction -> Identity, 
          ImageSize -> 500];
Show[linePlot,DisplayFunction -> $DisplayFunction];

By inspection, how many roots does this function have?

Type your answer here

Double click on the cell bracket to the right to check your answer!

One

According to the Fundamental Theorem of Algebra, how many roots should it have?

Type your answer here

Double click on the cell bracket to the right to check your answer!

One

For what value of x does f[x] have a root?

Type your answer here

Double click on the cell bracket to the right to check your answer!

x = 0

Now let's do it again with a = 2 + 0i and b = -4 + 0i

Clear[a, b, f, t, x, xmin, xmax, ymin, 
        ymax];
xmin = -10;
xmax = 
        10;
ymin = -10;
ymax = 10;
a = 
        2;
b = -4;
f[x_] = a*x  + b;
linePlot = 
        Plot[f[x], {x, xmin, xmax}, PlotStyle -> {Red, Thickness[ .01]}, 
          PlotRange -> {{xmin, xmax}, {ymin, ymax}}, 
          AxesLabel -> {"x", "f[x]"}, 
          DisplayFunction -> Identity, 
          ImageSize -> 500];
Show[linePlot,DisplayFunction -> $DisplayFunction];

By inspection, how many roots does this function have?

Type your answer here

Double click on the cell bracket to the right to check your answer!

One

For what value of x does f[x] appear to have a root?

Type your answer here

Double click on the cell bracket to the right to check your answer!

x = 2

Let's check your guess, double click on the bracket with the arrow just below this cell:

Solve[f[x] == 0, x]

Mathematica says the root (or x-intercept) is at x = 2.

Using your incredible deductive powers,think of all the lines that you could draw (not including horizontal lines) and type in the number of roots that they would each have.

Type your answer here

Let's have Mathematica show us a general solution to the roots of the equation f[x]=ax + b

Clear[f, a, x, b];
f[x_] = a*x + b;
Solve[f[x] == 0, x]

So Mathematica says that we will always see one root for any linear equation y = ax + b and that it will be at x = -(b/a) which corresponds to the complex number -(b/a)+ 0i. So this continues to support the Fundamental Theorem of Algebra.

Roots of 2nd Degree Polynomials

Second degree polynomials are of the form y = f[x] = a(x^2)+ bx + c 
where a, b, and c are some complex numbers and a≠0.

Example 1:  y =1(x^2)+ 0x + 0

In this example, a is the complex number 1 + 0i, and b and c are the complex numbers 0 + 0i
First we begin by graphing the function on a standard 2 dimensional plane.

<< "Graphics`Colors`"
Clear[
        a, b, f, t, x, xmin, xmax, ymin, 
        ymax];
xmin = -10;
xmax = 
        10;
ymin = -10;
ymax = 10;
a = 
        1;
b = 0;
c = 
        0;
f[x_] = 
        a*(x^2)  + b*x  + c;
linePlot = 
        Plot[f[x], {x, xmin, xmax}, 
          PlotStyle -> {Red, Thickness[ .001]}, 
          PlotRange -> {{xmin, xmax}, {ymin, ymax}}, 
          AxesLabel -> {"x", "f[x]"}, 
          DisplayFunction -> Identity, 
          ImageSize -> 500];
Show[linePlot,DisplayFunction -> $DisplayFunction];

According to the Fundamental Theorem of Algebra, how many roots should this function have?

Type your answer here

Double click on the cell bracket to the right to check your answer!

Two

Now it is difficult to see exactly what happens very near the origin so we will let Mathematica find the roots for us.
Double click on the cell bracket to the right to check your answer!

Solve[f[x] == 0, x]

Mathematica says that there are two roots and that they are both x = 0. This is consistent with the FTA but seems a little odd to list the same number twice. Let's try again with a = 1 + 0i, b = 0 + 0i, and c = -4 + 0i.

<< "Graphics`Colors`"
Clear[
        a, b, f, t, x, xmin, xmax, ymin, 
        ymax];
xmin = -10;
xmax = 
        10;
ymin = -10;
ymax = 10;
a = 
        1;
b = 
        0;
c = -4;
f[x_] = a*(x^2)  + b*x  + c;
linePlot = 
        Plot[f[x], {x, xmin, xmax}, 
          PlotStyle -> {Red, Thickness[ .001]}, 
          PlotRange -> {{xmin, xmax}, {ymin, ymax}}, 
          AxesLabel -> {"x", "f[x]"}, 
          DisplayFunction -> Identity, 
          ImageSize -> 500];
Show[linePlot,DisplayFunction -> $DisplayFunction];

The FTA says that we should have two complex roots for this function, and we see from the graph that it does indeed cross the x-axis in two places. Let's see where they are.

Solve[f[x] == 0, x]

Mathematica says that our two roots happen at x = -2 and x = +2. Keep in mind that these correspond to x = -2 + 0i and x = 2 + 0i.
Let's try a few others with different values of a, b, and c. The equations will be printed out for each graph.

<< "Graphics`Colors`"
Clear[
        a, b, f, t, x, xmin, xmax, ymin, 
        ymax];
xmin = -10;
xmax = 
        10;
ymin = -10;
ymax = 
        10;
a = -2;
b = 3;
c = 
        4;
f[x_] = 
        a*(x^2)  + b*x  + c;
linePlot = 
        Plot[f[x], {x, xmin, xmax}, 
          PlotStyle -> {Red, Thickness[ .001]}, 
          PlotRange -> {{xmin, xmax}, {ymin, ymax}}, 
          AxesLabel -> {"x", "f[x]"}, 
          DisplayFunction -> Identity, 
          ImageSize -> 500];
\(plottext1 = 
        Graphics[
          Text[\*""f[x]=-2\!\(x\^2\)+3x+4"", {3, 
              6}]];\)
plottext2 = 
        Graphics[
          Text["Look! Another two complex roots!", {1, -5}, {-1, 
              0}]];
Show[linePlot,plottext1,plottext2,DisplayFunction -> $DisplayFunction];

<< "Graphics`Colors`"
Clear[
        a, b, f, t, x, xmin, xmax, ymin, 
        ymax];
xmin = -10;
xmax = 
        10;
ymin = -10;
ymax = 10;
a = 
        5;
b = -2;
c = -3;
f[x_] = 
        a*(x^2)  + b*x  + c;
linePlot = 
        Plot[f[x], {x, xmin, xmax}, 
          PlotStyle -> {Red, Thickness[ .001]}, 
          PlotRange -> {{xmin, xmax}, {ymin, ymax}}, 
          AxesLabel -> {"x", "f[x]"}, 
          DisplayFunction -> Identity, 
          ImageSize -> 500];
\(plottext1 = 
        Graphics[
          Text[\*""f[x]=5\!\(x\^2\)-2x-3"", {3, 
              6}]];\)
plottext2 = 
        Graphics[
          Text["And another two complex roots!", {1, -5}, {-1, 
              0}]];
Show[linePlot,plottext1,plottext2,DisplayFunction -> $DisplayFunction];

Now,you may be wondering if we are being completely up-front about what is happening behind the scenes.Assuming that you are familiar with complex numbers already,you might wonder why we are not graphing these functions over the complex numbers since we are spending so much time referring to the complex numbers.That is an excellent observation! Let's switch graph views so that we can indeed see these graphed over the complex numbers.

Plots of 2nd degree polynomials over the Complex Numbers

For this purpose, we will be changing the usage of the y-axis. Our x-coordinate will represent the a value of the complex number a + bi, while the y-coordinate will represent the b value of a + bi. As we evaluate f[a + bi], Mathematica will return a complex number in the form of a + bi. We will not be able to graph this solution in a complex plane because that would require four dimensions, however, we can do a sidestep of that limitation by graphing the Absolute Value of f[a + bi]. While this will not give us a perfect graph, it will show where the function roots are in the complex numbers graphically. When the |f[a +bi]| = 0 then we will be looking at a complex number that represents a root. As an added bonus, when we look at a cross section of the graph parallel to the x-axis (for instance, y = 0) we will see the graph of y = (ax^2) + bx  +  c that we are accustomed to, a parabola.

Let's take a look at our original equation of f[x]= 1  (x^2) +  0  x  +  0 plotted in three dimensions. For this graph, I will be limiting the imaginary numbers to 0 so we will see the cross section of the parabola. The height of the graph represents the distance the value of f[a + bi] is from the root plane, not the typical value of y = (x^2). Take a look:

<< "Graphics`Colors`"
Clear[
        a, b, c, f, t, x, xmin, xmax, ymin, ymax, axval, 
        spacer];
realMin = -4;
realMax = 
        4;
imagMin = -4;
imagMax = 4;
a = 
        1;
b = 0;
c = 
        0;
f[x_] = 
        a*(x^2)  + b*x  + 
          c;
sideview = {0.000,  -1.250,  -0.180};
topsideview = {-0.015,  -3.764,  
          1.750};
topsideview2 = {-3.988,  
          0.000,  
          1.303};
sideview2 = {-4.487,  
          0.000,  -0.050};
thisview = 
        sideview;
axval = 5;
spacer = 
        axval/10;
threeaxes = 
        Graphics3D[{{Line[{{-axval, 0, 0}, {axval, 0, 
                    0}}]}, {Line[{{0, -axval, 0}, {0, axval, 
                    0}}]}, {Line[{{0, 0, -axval}, {0, 0, 
                    axval}}]}}];
slicePlot1 = 
        ParametricPlot3D[{x, y, Abs[f[x + I*y]]},  {x,  realMin, 
            realMax},  {y,  0,  0.0001}, PlotPoints -> {70, 70}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
rootPlane = 
        ParametricPlot3D[{x, y, 0}, {x,  realMin, realMax},  {y,  
            imagMin,  imagMax}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, Shading -> True, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
Show[slicePlot1,rootPlane,threeaxes,DisplayFunction -> $DisplayFunction];

And there it is. Note that whenever the graph hits the blue plane that we have a complex root. In this case, that occurs at x = 0 + 0i.
While this is interesting, it really only shows us the same information that we have already seen in two dimensions. What about the rest of the complex numbers? The following graph shows this. Remember, the height of the graph from the root plane is what we are observing, when that reaches 0, then we have seen a root. Check it out:

<< "Graphics`Colors`"
Clear[
        a, b, c, f, t, x, xmin, xmax, ymin, ymax, axval, 
        spacer];
realMin = -4;
realMax = 
        4;
imagMin = -4;
imagMax = 4;
a = 
        1;
b = 0;
c = 
        0;
f[x_] = 
        a*(x^2)  + b*x  + 
          c;
sideview = {0.000,  -1.250,  -0.180};
topsideview = {-0.015,  -3.764,  
          1.750};
topsideview2 = {-3.988,  
          0.000,  
          1.303};
sideview2 = {-4.487,  
          0.000,  -0.050};
thisview = 
        sideview;
axval = 5;
spacer = 
        axval/10;
threeaxes = 
        Graphics3D[{{Line[{{-axval, 0, 0}, {axval, 0, 
                    0}}]}, {Line[{{0, -axval, 0}, {0, axval, 
                    0}}]}, {Line[{{0, 0, -axval}, {0, 0, 
                    axval}}]}}];
slicePlot1 = 
        ParametricPlot3D[{x, y, Abs[f[x + I*y]]},  {x,  realMin, 
            realMax},  {y,  imagMin,  imagMax}, 
          PlotPoints -> {70, 70}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
rootPlane = 
        ParametricPlot3D[{x, y, 0}, {x,  realMin, realMax},  {y,  
            imagMin,  imagMax}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, Shading -> True, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
Show[slicePlot1,rootPlane,threeaxes,DisplayFunction -> $DisplayFunction];

See how no matter what complex number is input into the function that the distance from the root plane increases?

The next graph represents the 3-D representation of f[x] = 1  (x^2) + 0  x  -  4 as a cross-sectioned slice covering only the solutions where the complex portion (b) is effectively zero. Please keep in mind as you view this, that we are seeing the absolute value of f[x].

<< "Graphics`Colors`"
Clear[
        a, b, c, f, t, x, xmin, xmax, ymin, ymax, axval, 
        spacer];
realMin = -4;
realMax = 
        4;
imagMin = -4;
imagMax = 4;
a = 
        1;
b = 
        0;
c = -4;
f[x_] = 
        a*(x^2)  + b*x  + 
          c;
sideview = {0.000,  -1.250,  -0.180};
topsideview = {-0.015,  -3.764,  
          1.750};
topsideview2 = {-3.988,  
          0.000,  
          1.303};
sideview2 = {-4.487,  
          0.000,  -0.050};
thisview = 
        sideview;
axval = 5;
spacer = 
        axval/10;
threeaxes = 
        Graphics3D[{{Line[{{-axval, 0, 0}, {axval, 0, 
                    0}}]}, {Line[{{0, -axval, 0}, {0, axval, 
                    0}}]}, {Line[{{0, 0, -axval}, {0, 0, 
                    axval}}]}}];
slicePlot1 = 
        ParametricPlot3D[{x, y, Abs[f[x + I*y]]},  {x,  realMin, 
            realMax},  {y,  0,  0.0001}, PlotPoints -> {70, 70}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
rootPlane = 
        ParametricPlot3D[{x, y, 0}, {x,  realMin, realMax},  {y,  
            imagMin,  imagMax}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, Shading -> True, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
Show[slicePlot1,rootPlane,threeaxes,DisplayFunction -> $DisplayFunction];

But this doesn't look like the parabola that we expected! 
In the space below, speculate about why this parabola (which we have already graphed in two dimensions a few problems ago) seems to "bounce" off the x-axis at around x = 2 + 0i and x = -2 + 0i

Type your answer here

Double click on the cell bracket to the right to check your answer!

The part of the graph from x = -2 to x = +2 is actually below the root plane in the real plot! Absolute Value is always positive, therefore the plot will never go below the root plane. You can still see the parabola shape even though it got bounced off the root plane.
The roots for f[x] = 1  (x^2) +  0  x  -  4 are still at x = -2 + 0i and x = 2 + 0i !

Let's see what this looks like in three dimensions.

<< "Graphics`Colors`"
Clear[
        a, b, c, f, t, x, xmin, xmax, ymin, ymax, axval, 
        spacer];
realMin = -4;
realMax = 
        4;
imagMin = -4;
imagMax = 4;
a = 
        1;
b = 
        0;
c = -4;
f[x_] = 
        a*(x^2)  + b*x  + 
          c;
sideview = {0.000,  -1.250,  -0.180};
topsideview = {-0.015,  -3.764,  
          1.750};
topsideview2 = {-3.988,  
          0.000,  
          1.303};
sideview2 = {-4.487,  
          0.000,  -0.050};
thisview = 
        sideview;
axval = 5;
spacer = 
        axval/10;
threeaxes = 
        Graphics3D[{{Line[{{-axval, 0, 0}, {axval, 0, 
                    0}}]}, {Line[{{0, -axval, 0}, {0, axval, 
                    0}}]}, {Line[{{0, 0, -axval}, {0, 0, 
                    axval}}]}}];
slicePlot1 = 
        ParametricPlot3D[{x, y, Abs[f[x + I*y]]},  {x,  realMin, 
            realMax},  {y,  imagMin,  imagMax}, 
          PlotPoints -> {70, 70}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
rootPlane = 
        ParametricPlot3D[{x, y, 0}, {x,  realMin, realMax},  {y,  
            imagMin,  imagMax}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, Shading -> True, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
Show[slicePlot1,rootPlane,threeaxes,DisplayFunction -> $DisplayFunction];

Interesting, see how the distance from the root plane plummets to zero at the complex roots (x = -2 + 0i and x = 2 + 0i) we have already found, and everywhere else it moves away from the root plane!

Now let's take a look at the plot of f[x] = (x^2)  +  0  x  +  1 in two dimensions:

<< "Graphics`Colors`"
Clear[
        a, b, f, t, x, xmin, xmax, ymin, 
        ymax];
xmin = -10;
xmax = 
        10;
ymin = -10;
ymax = 10;
a = 
        1;
b = 0;
c = 
        1;
f[x_] = 
        a*(x^2)  + b*x  + c;
linePlot = 
        Plot[f[x], {x, xmin, xmax}, 
          PlotStyle -> {Red, Thickness[ .001]}, 
          PlotRange -> {{xmin, xmax}, {ymin, ymax}}, 
          AxesLabel -> {"x", "f[x]"}, 
          DisplayFunction -> Identity, 
          ImageSize -> 500];
Show[linePlot,DisplayFunction -> $DisplayFunction];

Here we have a seeming problem! The FTA says that every second degree polynomial with complex coefficients must have two complex roots. This apparently doesn't! But remember now, we are only looking at the real number subset of the complex numbers. If we expand our view into the previous small slice of the 3D plot, we will still see this parabola as follows.

<< "Graphics`Colors`"
Clear[
        a, b, c, f, t, x, xmin, xmax, ymin, ymax, axval, 
        spacer];
realMin = -4;
realMax = 
        4;
imagMin = -4;
imagMax = 4;
a = 
        1;
b = 0;
c = 
        1;
f[x_] = 
        a*(x^2)  + b*x  + 
          c;
sideview = {0.000,  -1.250,  -0.180};
topsideview = {-0.015,  -3.764,  
          1.750};
topsideview2 = {-3.988,  
          0.000,  
          1.303};
sideview2 = {-4.487,  
          0.000,  -0.050};
thisview = 
        sideview;
axval = 5;
spacer = 
        axval/10;
threeaxes = 
        Graphics3D[{{Line[{{-axval, 0, 0}, {axval, 0, 
                    0}}]}, {Line[{{0, -axval, 0}, {0, axval, 
                    0}}]}, {Line[{{0, 0, -axval}, {0, 0, 
                    axval}}]}}];
slicePlot1 = 
        ParametricPlot3D[{x, y, Abs[f[x + I*y]]},  {x,  realMin, 
            realMax},  {y,  0,  0.0001}, PlotPoints -> {70, 70}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
rootPlane = 
        ParametricPlot3D[{x, y, 0}, {x,  realMin, realMax},  {y,  
            imagMin,  imagMax}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, Shading -> True, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
Show[slicePlot1,rootPlane,threeaxes,DisplayFunction -> $DisplayFunction];

A reasonable conclusion would be that since there must be two roots, and there aren't any shown on this plot, then the roots must be complex! To see where they are, move on to the next section.

The Case of the Missing Roots

First, the exact same side view of "The Polynomial With The Missing Roots" graphed over all the complex numbers.

<< "Graphics`Colors`"
Clear[
        a, b, c, f, t, x, xmin, xmax, ymin, ymax, axval, 
        spacer];
realMin = -4. ;
realMax = 
        4;
imagMin = -4;
imagMax = 4;
a = 
        1;
b = 0;
c = 
        1;
f[x_] = 
        a*(x^2)  + b*x  + 
          c;
sideview = {0.000,  -1.250,  -0.180};
topsideview = {-0.015,  -3.764,  
          1.750};
topsideview2 = {-3.988,  
          0.000,  
          1.303};
sideview2 = {-4.487,  
          0.000,  -0.050};
thisview = 
        sideview;
axval = 5;
spacer = 
        axval/10;
threeaxes = 
        Graphics3D[{{Line[{{-axval, 0, 0}, {axval, 0, 
                    0}}]}, {Line[{{0, -axval, 0}, {0, axval, 
                    0}}]}, {Line[{{0, 0, -axval}, {0, 0, 
                    axval}}]}}];
slicePlot1 = 
        ParametricPlot3D[{x, y, Abs[f[x + I*y]]},  {x,  realMin, 
            realMax},  {y,  imagMin,  imagMax}, 
          PlotPoints -> {70, 70}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
rootPlane = 
        ParametricPlot3D[{x, y, 0}, {x,  realMin, realMax},  {y,  
            imagMin,  imagMax}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, Shading -> True, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
Show[slicePlot1,rootPlane,threeaxes,DisplayFunction -> $DisplayFunction];

How odd, it certainly looks from this direction like the graph does intersect the root plane and we know from previous work where those places are (x = 0 + 1i and x = 0 -1i), yet it only looks like there is one root instead of two. 
Speculate in the space below what the problem with our view might be.

Type your answer here

Double click on the cell bracket to the right to check your answer!

Hint: Think about what the x-axis and y-axis represent in our graph. 
Double click again for more.

Answer: Since the imaginary part of our numbers are coming towards us and away from our view, we can't clearly see what is happening in the imaginary plane, only the real portion of our roots is easy to see. We need to rotate our viewpoint in order to see better!

Now lets look at our graph again. Pay attention to the viewpoint.

<< "Graphics`Colors`"
Clear[
        a, b, c, f, t, x, xmin, xmax, ymin, ymax, axval, 
        spacer];
realMin = -4. ;
realMax = 
        4;
imagMin = -4;
imagMax = 4;
a = 
        1;
b = 0;
c = 
        1;
f[x_] = 
        a*(x^2)  + b*x  + 
          c;
sideview = {0.000,  -1.250,  -0.180};
topsideview = {-0.015,  -3.764,  
          1.750};
topsideview2 = {-3.988,  
          0.000,  
          1.303};
sideview2 = {-4.487,  
          0.000,  -0.050};
thisview = 
        sideview2;
axval = 5;
spacer = 
        axval/10;
threeaxes = 
        Graphics3D[{{Line[{{-axval, 0, 0}, {axval, 0, 
                    0}}]}, {Line[{{0, -axval, 0}, {0, axval, 
                    0}}]}, {Line[{{0, 0, -axval}, {0, 0, 
                    axval}}]}}];
slicePlot1 = 
        ParametricPlot3D[{x, y, Abs[f[x + I*y]]},  {x,  realMin, 
            realMax},  {y,  imagMin,  imagMax}, 
          PlotPoints -> {70, 70}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
rootPlane = 
        ParametricPlot3D[{x, y, 0}, {x,  realMin, realMax},  {y,  
            imagMin,  imagMax}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, Shading -> True, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
Show[slicePlot1,rootPlane,threeaxes,DisplayFunction -> $DisplayFunction];

Now that's a bit better. Note that our y-axis is running across the screen and the x-axis moves back into the distance. So we do indeed see the roots in the complex plane, specifically x = 0 + 1i and x = 0 -1i. The Fundamental Theorem of Algebra continues to strut its stuff.

Roots of 3rd Degree Polynomials

Third degree polynomials are of the form y = f[x] = a(x^3)+ b(x^2) + cx + d 
where a, b, c, and d are some complex numbers and a≠0.

Example 1:  y =1(x^3)+ 0  (x^2)+0x + 1

First speculate how many complex roots we should see.

Type your answer here

Double click on the cell bracket to the right to check your answer!

Three complex roots

Second, look at an ordinary 2D plot to refresh your memory of the function.

<< "Graphics`Colors`"
Clear[
        a, b, f, t, x, xmin, xmax, ymin, 
        ymax];
xmin = -10;
xmax = 
        10;
ymin = -10;
ymax = 10;
a = 
        1;
b = 0;
c = 
        0;
d = 
        1;
f[x_] = 
        a*(x^3) + b*(x^2)  + c*x  + d;
linePlot = 
        Plot[f[x], {x, xmin, xmax}, 
          PlotStyle -> {Red, Thickness[ .001]}, 
          PlotRange -> {{xmin, xmax}, {ymin, ymax}}, 
          AxesLabel -> {"x", "f[x]"}, 
          DisplayFunction -> Identity, 
          ImageSize -> 500];
Show[linePlot,DisplayFunction -> $DisplayFunction];

We see only one real root, so where are the other two?

Type your answer here

Double click on the cell bracket to the right to check your answer!

Hiding in the complex roots of course!

Let's see the "real number" slice of this graph in 3D!

<< "Graphics`Colors`"
Clear[
        a, b, c, f, t, x, xmin, xmax, ymin, ymax, axval, 
        spacer];
realMin = -4;
realMax = 
        4;
imagMin = -4;
imagMax = 4;
a = 
        1;
b = 0;
c = 
        0;
d = 
        1;
f[x_] = 
        a*(x^3) + b*(x^2)  + c*x  + 
          d;
sideview = {0.000,  -1.250,  -0.180};
topsideview = {-0.015,  -3.764,  
          1.750};
topsideview2 = {-3.988,  
          0.000,  
          1.303};
sideview2 = {-4.487,  
          0.000,  -0.050};
thisview = 
        sideview;
axval = 5;
spacer = 
        axval/10;
threeaxes = 
        Graphics3D[{{Line[{{-axval, 0, 0}, {axval, 0, 
                    0}}]}, {Line[{{0, -axval, 0}, {0, axval, 
                    0}}]}, {Line[{{0, 0, -axval}, {0, 0, 
                    axval}}]}}];
slicePlot1 = 
        ParametricPlot3D[{x, y, Abs[f[x + I*y]]},  {x,  realMin, 
            realMax},  {y,  0,  0.0001}, PlotPoints -> {70, 70}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
rootPlane = 
        ParametricPlot3D[{x, y, 0}, {x,  realMin, realMax},  {y,  
            imagMin,  imagMax}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, Shading -> True, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
Show[slicePlot1,rootPlane,threeaxes,DisplayFunction -> $DisplayFunction];

See once again how the graph "bounces" off the root plane? If that portion were reflected across the root plane, we would indeed see the f[x] = (x^3) + 1 graph that we just saw in 2-D. Now for the 3D plot over all the complex numbers.

<< "Graphics`Colors`"
Clear[
        a, b, c, d, f, t, x, xmin, xmax, ymin, ymax, axval, 
        spacer];
realMin = -4. ;
realMax = 
        4;
imagMin = -4;
imagMax = 4;
a = 
        1;
b = 0;
c = 
        0;
d = 
        1;
f[x_] = 
        a*(x^3) + b*(x^2)  + c*x  + 
          d;
sideview = {0.000,  -1.250,  -0.180};
topsideview = {-0.015,  -3.764,  
          1.750};
topsideview2 = {-3.988,  
          0.000,  
          1.303};
sideview2 = {-4.487,  
          0.000,  -0.050};
thisview = 
        sideview2;
axval = 5;
spacer = 
        axval/10;
threeaxes = 
        Graphics3D[{{Line[{{-axval, 0, 0}, {axval, 0, 
                    0}}]}, {Line[{{0, -axval, 0}, {0, axval, 
                    0}}]}, {Line[{{0, 0, -axval}, {0, 0, 
                    axval}}]}}];
slicePlot1 = 
        ParametricPlot3D[{x, y, Abs[f[x + I*y]]},  {x,  realMin, 
            realMax},  {y,  imagMin,  imagMax}, 
          PlotPoints -> {70, 70}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
rootPlane = 
        ParametricPlot3D[{x, y, 0}, {x,  realMin, realMax},  {y,  
            imagMin,  imagMax}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, Shading -> True, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
Show[slicePlot1,rootPlane,threeaxes,DisplayFunction -> $DisplayFunction];

So it appears that the FTA continues to be correct as we can see from one side view that there are indeed three points where the plot touches the root plane. Let's have Mathematica calculate those roots.

NSolve[f[x] == 0, x]

Sure enough, one real solution and two complex roots. Fascinating.

Student Play Time

In the following program, play with the values of b, c, and d to generate different cubic polynomial plots. 

Also try seeing it from different views.

Instructions: Where you see the command thisview = sideview2; try using one of the other view names printed in red. Finally, you may have trouble with the graph going out of the plot box. You can change the range of numbers viewed by changing the values or realMin, realMax, imagMin, imagMax, and htMax. When you are ready to plot, click the mouse anywhere in the program and hit the 'enter' key on the numeric keypad. You may need to scroll down to see the final graph. If you are really brave, you can change the function f[x] that is highlighted in blue, but don't forget to add a new variable and define it in the program. Have some fun with this.

<< "Graphics`Colors`"
Clear[a, b, c, d, f, t, x, xmin, xmax, ymin, ymax, axval, 
          spacer];

realMin = -4. ;
realMax = 4;
imagMin = -4;
imagMax = 4;
htMax = 5;

f[x_] = a*(x^3) + b*(x^2)  + c*x  + d;

sideview={0.000,  -1.250,  -0.180};
topsideview={-0.015,  -3.764,  1.750};
topsideview2={-3.988,  0.000,  1.303};
sideview2={-4.487,  0.000,  -0.050};

a = 
        1;
b = 0;
c = 0;
d = 1;
thisview = sideview2;

axval = 5;
spacer = 
        axval/10;
threeaxes = 
        Graphics3D[{{Line[{{-axval, 0, 0}, {axval, 0, 
                    0}}]}, {Line[{{0, -axval, 0}, {0, axval, 
                    0}}]}, {Line[{{0, 0, -axval}, {0, 0, 
                    axval}}]}}];
slicePlot1 = 
        ParametricPlot3D[{x, y, Abs[f[x + I*y]]},  {x,  realMin, 
            realMax},  {y,  imagMin,  imagMax}, 
          PlotPoints -> {70, 70}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, htMax}}, 
          DisplayFunction -> Identity, 
          ImageSize -> 600];
rootPlane = 
        ParametricPlot3D[{x, y, 0}, {x,  realMin, realMax},  {y,  
            imagMin,  imagMax}, 
          AxesLabel  ->  {"x",  "y",  "z"}, 
          ViewPoint -> thisview, Shading -> True, 
          PlotRange -> {{realMin, realMax}, {imagMin, 
                imagMax}, {- .5, 5}}, DisplayFunction -> Identity, 
          ImageSize -> 600];
Show[slicePlot1,rootPlane,threeaxes,DisplayFunction -> $DisplayFunction];