Jump to content

Cubic function

From Wikiversity

It is not the purpose of this page to repeat good information available elsewhere. However, it seems to the author that other descriptions of the cubic function are more complicated than they need to be. This page attempts to demystify elementary but essential information concerning the cubic function.

Objective

[edit | edit source]
  • Present cubic function and cubic equation.
  • Introduce the concept of roots of equal absolute value.
  • Show how to predict and calculate equal roots, techniques that will be useful when applied to higher order functions.
  • Simplify the depressed cubic.
  • Simplify Vieta's substitution.
  • Review complex numbers as they apply to a complex cube root.
  • Present cubic formula simplified.
  • Show that the cubic equation is effectively solved when at least one real root is known.
  • Use Newton's Method to calculate one real root.
  • Show that the cubic equation can be solved with high-school math.

Lesson

[edit | edit source]

Introduction

[edit | edit source]

The cubic function is the sum of powers of from through :

usually written as:

If the function becomes

Within this page we'll say that:

  • both coefficients must be non-zero,
  • coefficient must be positive (simply for our convenience),
  • all coefficients must be real numbers, accepting that the function may contain complex roots.

The cubic equation is the cubic function equated to zero:

.

Roots of the function are values of that satisfy the cubic equation.

Because all coefficients must be real numbers, the cubic function must have 3 real roots or exactly 1 real root.

Other combinations of real and complex roots are possible, but they produce complex coefficients.

Characteristics of cubic functions

[edit | edit source]

Coefficient c missing

[edit | edit source]

If coefficient is missing, the cubic function becomes and

For a stationary point

When coefficient is missing, there is always a stationary point at

x = f(y)

[edit | edit source]

The cubic function may be expressed as

Unless otherwise noted, references to "cubic function" on this page refer to function of form

Coefficient a negative

[edit | edit source]
Graph of cubic function with coefficient a negative.
There is no absolute maximum or absolute minimum.

Coefficient may be negative as shown in diagram.


As increases, the value of is dominated by the term

When has a very large negative value, is always positive.

When has a very large positive value, is always negative.


Unless stated otherwise, any reference to "cubic function" on this page will assume coefficient positive.

Sum of roots 0

[edit | edit source]
Graph of cubic function with coefficient b missing.
Sum of roots is
axis compressed for clarity.

When sum of roots is coefficient


In the diagram, roots of are

Sum of roots

Therefore coefficient

Ratio of stationary points to roots

[edit | edit source]
Graph of cubic function with 2 stationary points.
Ratio of to
Ratio of to

Stationary points relative to roots:


Consider cubic function:

Roots of function are:

Derivative of function:

Stationary points of function are roots of or

Ratio of to

Ratio of to

s = 2r

[edit | edit source]
Graph of cubic function with 2 stationary points.
are stationary points.

Therefore,

Equation of red curve in diagram: where

Aim of this section is to calculate so that

Associated quadratic when

is a root of this function. Divide by

Quotient is

Remainder is which equals

Therefore:

Therefore

Function as product of 3 linear functions

[edit | edit source]

The function may be expressed as:

where are roots of the function, in which case

where:

Solving the cubic equation means that, given , at least one of must be calculated.

Given , I found that can be calculated as:

This approach was not helpful.

Function as product of linear function and quadratic

[edit | edit source]

When is a root of the function, the function may be expressed as:

where

When one real root is known, the other two roots may be calculated as roots of the quadratic function .

When is a root of the function, or

Therefore the expansion of

Generally, if point is any point on the curve and it is desired to calculate the other values of that produce then:

or and

When and

Let

where

If point is any point on the curve of then the solution of provides the other values of that produce

Graph of cubic function and associated quadratic function.
All values of that produce

An example:

Let

It is known that point satisfies

Let associated quadratic function

Roots of show that when or

General case

[edit | edit source]

For function allequal(), see isclose().

The following python code implements the functionality of this section:

# python code.

TwoRootsOfCubicDebug = 0

def TwoRootsOfCubic (abcd, x1) :
    '''
x2,x3 = TwoRootsOfCubic (abcd, x1)
f(x2) = f(x3) = f(x1)
If x1 is a root, then f(x2) = f(x3) = f(x1) = 0, and x2,x3 are roots.
x1 may be complex.
'''
    a,b,c,d = abcd
    B = a*x1 + b
    C = B*x1 + c
    disc = B*B - 4*a*C
    almostZero = 1e-15
    if abs(disc) <  almostZero :
        x2 = x3 = -B/(2*a)
    else :
        if isinstance (disc, complex) or (disc > 0) :
            root = disc ** .5
        else :
            root = ((-disc) ** .5)*1j
        x2 = (-B - root)/(2*a)
        x3 = (-B + root)/(2*a)

    if not TwoRootsOfCubicDebug : return x2,x3

    sum1,sum2,sum3 = [ (a*x*x*x + b*x*x + c*x + d) for x in (x1,x2,x3) ]
    print ('TwoRootsOfCubic ():')
    print ('    y = (',a,')xx + (',B, ')x + (', C, ')')
    print ('    for x1 =',x1,', sum1 =',sum1)
    print ('    for x2 =',x2,', sum2 =',sum2)
    print ('    for x3 =',x3,', sum3 =',sum3)
# sum1,sum2,sum3 should all be equal.
# In practice there may be small rounding errors.
# The following check allows for small errors, but flags
# errors that are not "small".
    allEqualDebug = 1
    allEqual((sum1,sum2,sum3))

    return x2,x3

The example above:

# python code.
print ( TwoRootsOfCubic ((3,-6,-3,22), 1) )
print ( TwoRootsOfCubic ((3,-6,-3,22), -1) )
print ( TwoRootsOfCubic ((3,-6,-3,22), 2) )
(-1.0, 2.0)
(1.0, 2.0)
(-1.0, 1.0)

When 1 root is known:

# python code.
print ( TwoRootsOfCubic ((1,-2,-5,6), 1) )
print ( TwoRootsOfCubic ((1,-3,-9,-5), 5) )
(-2.0, 3.0)
(-1.0, -1.0)

The method works with complex values:

# python code.
TwoRootsOfCubicDebug = 1
print ( TwoRootsOfCubic ((1,0,0,27), -3) )
print ( TwoRootsOfCubic ((1,9,31,39), -3+2j) )
TwoRootsOfCubic ():
    y = ( 1 )xx + ( -3 )x + ( 9 )
    for x1 = -3 , sum1 = 0
    for x2 = (1.5-2.598076211353316j) , sum2 = 0j
    for x3 = (1.5+2.598076211353316j) , sum3 = 0j
((1.5-2.598076211353316j), (1.5+2.598076211353316j))

TwoRootsOfCubic ():
    y = ( 1 )xx + ( (6+2j) )x + ( (9+6j) )
    for x1 = (-3+2j) , sum1 = 0j
    for x2 = (-3-2j) , sum2 = 0j
    for x3 = (-3+0j) , sum3 = 0j
((-3-2j), (-3+0j))

Notice complex coefficients:


Reporting an error:

print(TwoRootsOfCubic ((3,-6,-3,22), -4+3j))
TwoRootsOfCubic ():
    y = ( 3 )xx + ( (-18+9j) )x + ( (42-90j) )
    for x1 = (-4+3j) , sum1 = (124+486j)
    for x2 = (0.264468373145825-5.338376386119454j) , sum2 = (124.00000000000007+485.9999999999998j)
    for x3 = (5.735531626854176+2.338376386119455j) , sum3 = (124.00000000000017+486.0000000000003j)
allEqual()6: 2 values not close. (124.00000000000007+485.9999999999998j) , (124.00000000000017+486.0000000000003j)
    abs(a-b)   = 5.211723197616109e-13
    comparison = 5.015695365550026e-13
((0.264468373145825-5.338376386119454j), (5.735531626854176+2.338376386119455j))

Notice complex coefficients:

Function defined by 4 points

[edit | edit source]
Figure 1. Cubic function defined by 4 points

Any 4 points on the curve may be used to define the function.

Because the cubic function contains 4 coefficients, 4 simultaneous equations are needed to define the function.

See Figure 1. The cubic function may be defined by any 4 unique points on the curve.

For example, let us choose the four points:

Rearrange the standard cubic function to prepare for the calculation of

For function solveMbyN see "Solving simultaneous equations" .

# python code

points = ((-4,-2), (-3,3), (2,3), (8,8))

L11 = []

for point in points :
    x,y = point
    L11 += [[x*x*x, x*x, x, 1, -y]]

print (L11)
[[-27,  9, -3, 1, -3],     #
 [-64, 16, -4, 1,  2],     # matrix supplied to function solveMbyN() below.
 [  8,  4,  2, 1, -3],     # 4 rows by 5 columns.
 [512, 64,  8, 1, -8]]     #

# python code

output = solveMbyN(L11)
print (output)
# 4 coefficients a, b, c, d:
(0.07575757575757577, -0.4545454545454544, -0.9848484848484848, 6.181818181818182)

The 4 coefficients above are in fact the values

Cubic function defined by the 4 points is

Function defined by 3 points and 1 slope

[edit | edit source]

The cubic function may be defined by any 3 unique points on the curve and the slope at any 1 of these points.

For example, let us choose the three points:

It is known that the slope at point is

Rearrange the standard cubic function to prepare for the calculation of

Equation of slope:

Rearrange the equation of slope to prepare for the calculation of

For function solveMbyN see "Solving simultaneous equations" .

# python code

points = ((-4,-2), (2,3), (8,8))

L11 = []

for point in points :
    x,y = point
    L11 += [[x*x*x, x*x, x, 1, -y]]

(x,y) = (8,8)
L11 += [[3*x*x, 2*x, 1, 0, -(6 + 19/66)]]

print (L11)
[[-64, 16, -4, 1,  2],     
 [  8,  4,  2, 1, -3],                 # matrix supplied to function solveMbyN() below.
 [512, 64,  8, 1, -8],                 # 4 rows by 5 columns.
 [192, 16,  1, 0, -6.287878787878788]]

# python code

output = solveMbyN(L11)
print (output)
# 4 coefficients a, b, c, d:
(0.07575757575757572, -0.4545454545454543, -0.9848484848484839, 6.181818181818179)

The 4 coefficients above are in fact the values (same as above.)

Graphs of 2 different cubic functions that satisfy the same 4 criteria.

If these 4 criteria (3 points and 1 slope) are used to define the cubic in which is the independent variable, result is:

Both curves satisfy the points and have the same slope at point

(In fact )

The simplest cubic function

[edit | edit source]
Figure 1.

The simplest cubic function has coefficients

The simplest cubic function has coefficients , for example:

.

To solve the equation:

The function also contains two complex roots that may be found as solutions of the associated quadratic:


Curve is useful for finding the cube root of a real number.


Solve:

This is equivalent to finding a root of function


If you use Newton's method to solve it may be advantageous to put in form where

Then Remember to preserve correct sign of result.

Roots of equal absolute value

[edit | edit source]

The cubic function

Let one value of be and another be .

Substitute these values into the original function in and expand.

Reduce and and substitute for :

Combine and to eliminate and produce a function in :

From

If is a solution and function becomes:

and two roots of are .

An example

[edit | edit source]
Figure 2.

The roots of equal absolute value are

See Figure 2.


The function has roots of equal absolute value.

The roots of equal absolute value are .

This method works with complex roots of equal absolute value.


Consider function:

has roots of equal absolute value.

Roots of equal absolute value are:

Equal Roots

[edit | edit source]

Combine and from above to eliminate and produce a function in :



From above:


If , then is a solution , and become:

If because , there is a stationary point where .

Note:

  • is a factor of discriminant of cubic formula below. If because the discriminant is , function contains at least 2 roots equal to when both functions are .
  • are functions of the curve and the slope of the curve. In other words, equal roots occur where the curve and the slope of the curve are both zero.

and can be combined to produce:


and can be combined to produce:


If the original function contains 3 unique roots, then are numerically different.


If the original function contains exactly 2 equal roots, then are numerically identical, and the 2 roots have the value in .


If the original function contains 3 equal roots, then are both null, are numerically identical and .


From equations (4g) and (5g):

Examples

[edit | edit source]

No equal roots

[edit | edit source]
Figure 3a.

Cubic function with 3 unique, real roots at .

Consider function

from

from

are numerically different.

Exactly 2 equal roots

[edit | edit source]
Figure 3b.

Cubic function with 2 equal, real roots at .

Consider function

from

from

There are 2 equal roots at

See Function_as_product_of_linear_function_and_quadratic above.

To calculate all roots:

# python code.
a,b,c,d = 1,-3,-9,-5

# Associated quadratic:
p = -1
A = a
B = A*p + b
C = B*p + c

# Associated linear function:
a1 = A
b1 = a1*p + B

print ('x3 =', -b1/a1)
x3 = 5.0

Roots of cubic function are

3 equal roots

[edit | edit source]
Figure 3c.

Cubic function with 3 equal, real roots at .

Consider function

from

from

from

are numerically identical, the discriminant of each is and

Depressed cubic

[edit | edit source]

The depressed cubic may be used to solve the cubic equation.

In the cubic function: let , substitute for and expand:

When the function is equated to , the depressed equation is:

where

and

In the depressed equation the coefficient of is and the coefficient of is .

The depressed function is a specific case of the general function in which coefficient is missing.

Let

Then point of inflection has coordinates and

When

If coefficient is missing, the cubic function becomes and

  • point of inflection has coordinates and
  • slope at point of inflection

Be prepared for the possibility that one or both of may be zero.

6 examples

[edit | edit source]

Six simple depressed cubic functions illustrate all the possible shapes of all cubic functions:

When A = 0

[edit | edit source]
Figure 4a.

Cubic function with slope 0 at point of inflection .

This condition occurs when the cubic function in has exactly one stationary point or when slope at point of inflection is zero.

The other roots may be derived from the associated quadratic:

When B = 0

[edit | edit source]
Figure 4b.

Cubic function with point of inflection on axis.

This condition occurs when the cubic function in is of format or when point of inflection is on the axis.

When A = B = 0

[edit | edit source]
Figure 4c (same as 3c above).

Cubic function with:
* point of inflection on axis,
* slope at point of inflection.

This condition occurs when:

  • slope at point of inflection is , and
  • point of inflection is on axis.


Consider function

Vieta's substitution

[edit | edit source]

See Vieta's Substitution.

Let the depressed cubic be written as: where and

Let

Substitute for in the depressed function:

where and .

From the quadratic formula:

The discriminant . Substitute for and expand:

This discriminant =

The factor is a factor of under "Equal Roots" above.

Discriminant (B² - 4C³) == 0

[edit | edit source]
Figure 5a.

Cubic function with 2 equal, real roots at .

If discriminant , the function contains at least 2 equal, real roots.

Consider function

Associated quadratic

The 2 equal roots are: .


Discriminant (B² - 4C³) positive

[edit | edit source]
Figure 5b.

Cubic function with discriminant positive
and 1 real root at .

If discriminant is positive, the function contains exactly 1 real root.

Consider function

discriminant

or:


The associated quadratic is:

and the two complex roots are:

Discriminant (B² - 4C³) negative

[edit | edit source]

If discriminant is negative, the function contains 3 real roots and becomes the complex number .


Let be the modulus of .

Let be the real part of .

Let be the imaginary part of .

Then

Let be the phase of .

Then and .

. Therefore:

An example

[edit | edit source]
Figure 5c.

Cubic function with 3 unique, real roots at .

in which

radians.

radians.

Using Cosine (A/3)

[edit | edit source]

For function cosAfrom_cos3A see "Cosine(A/3)" .

# python code
from decimal import *
getcontext().prec = 40

a,b,c,d = [ Decimal(v) for v in (1,-2,-5,6) ]

A = 9*a*c - 3*b*b
B = 27*a*a*d - 9*a*b*c + 2*b*b*b
C = A/-3

Wreal = -B/2
wmod = C.sqrt()
Wmod = wmod * wmod * wmod
cosWφ = Wreal/Wmod

data = cosAfrom_cos3A(cosWφ)

for coswφ in data :
    wreal = wmod * coswφ
    t = 2*wreal
    x = (-b+t)/(3*a)
    print ('x =', float(x))

Results are:

x = 3.0
x = -2.0
x = 1.0

Review of complex math

[edit | edit source]
Figure 6a: Components of complex number Z.

Origin at point .
parallel to axis.
parallel to axis.
= modulus of
Angle is the phase of


Figure 6b: Complex numbers and .

Origin at point .
(off image to left.)


A complex number contains a real part and an imaginary part, eg:

In theoretical math the value is usually written as . In the field of electrical engineering and computer language Python it is usually written as .


The value is a complex number expressed in rectangular format.

The value is a complex number expressed in polar format where is the modulus of or and is the phase of or

Multiplication of complex numbers

[edit | edit source]

To multiply complex numbers, multiply the moduli and add the phases.

Complex number cubed

[edit | edit source]


Generally

For the cube of a complex number in polar format,

Cube root of complex number W

[edit | edit source]

Let and

If then:

and

Complex number w + C/w

[edit | edit source]

Let where

If

In the case of 3 real roots,

Cubic formula

[edit | edit source]

The substitutions made above can be used to produce a formula for the solution of the cubic equation.

Given cubic equation: calculate the 3 values of

where:

Coefficients of depressed cubic:

One root of cubic function:

Formula incorporating all eight statements above is:

Cube roots of unity are: See "Cube roots of 1."


Therefore has 3 values:

It is not necessary to use both values of

Choose either or

If contains 3 equal roots, and line t = w + C/w fails with divisor

Before using this formula, check for equal roots as in "3 equal roots" above.

Using cubic formula

[edit | edit source]

2 equal roots

[edit | edit source]
Graph of cubic function with 2 equal roots at
Y axis compressed for clarity.

Calculate roots of

# python code
a,b,c,d = 1, -7, -5, 75
A = 9*a*c - 3*b*b
B = 27*a*a*d - 9*a*b*c + 2*b*b*b
C = -A/3
Δ = B*B - 4*C*C*C
print ('Δ =', Δ)
W = -B/2
# The following 2 lines ensure that cube root of negative
# real number is real number.
if W < 0 : w_ = -((-W)**(1/3))
else : w_ = W**(1/3)
r3 = 3**(0.5)
values_of_w = (w_, 
               w_*(-1 + 1j*r3)/2, 
               w_*(-1 - 1j*r3)/2)
for w in values_of_w :
    print ()
    print ('w =', w)
    t = w + C/w
    print ('t =', t)
    x = (-b + t)/(3*a)
    print ('x =', x)
Δ = 0.0

w = -8
t = -16
x = -3

w = (4-6.928203230275509j)
t = 8
x = 5

w = (4+6.928203230275508j)
t = 8
x = 5

Notice that:

  • is zero.

1 real root

[edit | edit source]
Graph of cubic function with 1 real root at
Y axis compressed for clarity.

Calculate roots of

# python code
a,b,c,d = 1, -7, -1, 87
A = 9*a*c - 3*b*b
B = 27*a*a*d - 9*a*b*c + 2*b*b*b
C = -A/3
Δ = B*B - 4*C*C*C
print ('Δ =', Δ)
δ = (Δ)**.5
W = (-B+δ)/2
if W < 0 : w_ = -((-W)**(1/3))
else : w_ = W**(1/3)
r3 = 3**(0.5)
values_of_w = (w_, 
               w_*(-1 + 1j*r3)/2, 
               w_*(-1 - 1j*r3)/2)
for w in values_of_w :
    print ()
    print ('w =', w)
    t = w + C/w
    print ('t =', t)
    x = (-b + t)/(3*a)
    print ('x =', x)
Δ = 1997568.0

w = -4.535898384862245
t = -16
x = -3

w = (2.2679491924311215-3.9282032302755088j)
t = (8.0+6.0j)
x = (5.0+2.0j)

w = (2.267949192431123+3.9282032302755083j)
t = (8.0-6.0j)
x = (5.0-2.0j)

Notice that:

  • is positive.
  • does not equal

3 real roots

[edit | edit source]
Graph of cubic function with 3 real roots,
Y axis compressed for clarity.

Calculate roots of

# python code
a,b,c,d = 5, -62, 11, 726
A = 9*a*c - 3*b*b
B = 27*a*a*d - 9*a*b*c + 2*b*b*b
C = -A/3
Δ = B*B - 4*C*C*C
print ('Δ =', Δ)
δ = (Δ)**.5
W = (-B-δ)/2
w_ = W**(1/3)
r3 = 3**(0.5)
values_of_w = (w_, 
               w_*(-1 + 1j*r3)/2, 
               w_*(-1 - 1j*r3)/2)
for w in values_of_w :
    print ()
    print ('w =', w)
    t = w + C/w
    print ('t =', t)
    x = (-b + t)/(3*a)
    print ('x =', x)
Δ = -197238264300.0

w = (51.5-32.042939940024226j)
t = 103
x = 11

w = (2.0+60.62177826491069j)
t = 4.0
x = 4.4

w = (-53.5-28.578838324886462j)
t = -107
x = -3

Notice that:

  • is negative
  • equals

cos (A/3)

[edit | edit source]

The method above for calculating depends upon calculating the value of angle

However, may be calculated from because

Generally, when is known, there are 3 possible values of the third angle because

This suggests that there is a cubic relationship between and

Expansion of cos (3A)

[edit | edit source]
Figure 7a.

Graph of

The well known identity for is:

The derivation of this identity may help understanding and interpreting the curve of

Let

and

Therefore the point is on the curve and

A 3A cos A cos 3A
0 0 1 1
180 180*3 -l -1
60 180 0.5 -1

Three simultaneous equations may be created from the above table:

Therefore

and

When is known,

Newton's Method

[edit | edit source]
Figure 7b.

Newton's Method used to calculate when

Newton's method is a simple and fast root finding method that can be applied effectively to the calculation of when is known because:

  • the function is continuous in the area under search.
  • the derivative of the function is continuous in the area under search.
  • the method avoids proximity to stationary points.
  • a suitable starting point is easily chosen.

See Figure 7b.

Perl code used to calculate when is:

$cos3A = 0.1;

$x = 1; # starting point.
$y = 4*$x*$x*$x - 3*$x - $cos3A;

while(abs($y) > 0.00000000000001){
    $s = 12*$x*$x - 3; # slope of curve at x.
    $delta_x = $y/$s;
    $x -= $delta_x;
    $y = 4*$x*$x*$x - 3*$x - $cos3A;

    print "                                                                                   
x=$x                                                                                              
y=$y                                                                                              
";
}

print "                                                                                           
cos(A) = $x                                                                                       
";
x=0.9
y=0.116

x=0.882738095238095
y=0.00319753789412588

x=0.882234602936352
y=2.68482638085543e-06

x=0.882234179465815
y=1.89812054962601e-12

x=0.882234179465516
y=-3.60822483003176e-16

cos(A) = 0.882234179465516

When cos(3A) is positive

[edit | edit source]
Figure 7c.

Newton's Method used to calculate when

When output of the above code is:

x=0.933333333333333
y=0.0521481481481486

x=0.926336712383224
y=0.000546900278781126

x=0.926261765753783
y=6.24370847246425e-08

x=0.926261757195518
y=7.7715611723761e-16

cos(A) = 0.926261757195518

If all 3 values of are required, the other 2 values can be calculated as roots of the associated quadratic function with coefficients

x1 = -0.136742508909433
x2 = -0.789519248286085

Proof:

# python code
values = (0.926261757195518, -0.136742508909433, -0.789519248286085)

for cosA in values :
    cos3A_ = 4*cosA*cosA*cosA -	3*cosA
    difference = abs (cos3A_ - 0.4)
    print ('cosA =',cosA,'   difference =',difference)

Results:

cosA =  0.926261757195518    difference = 7.771561172376096e-16
cosA = -0.136742508909433    difference = 1.7208456881689926e-15
cosA = -0.789519248286085    difference = 2.1094237467877974e-15

When cos(3A) is negative

[edit | edit source]
Figure 7d.

Newton's Method used to calculate when

When is negative, the starting value of

When output of the above code is:

x=-0.911111111111111
y=-0.0920054869684496

x=-0.89789474513884
y=-0.00190051666894692

x=-0.897610005610658
y=-8.73486682706481e-07

x=-0.89760987462259
y=-1.8446355554147e-13

x=-0.897609874622562
y=-1.66533453693773e-16

cos(A) = -0.897609874622562

An example

[edit | edit source]
Figure 7e.

Cubic function with 3 unique, real roots at .

in which

Use the code beside Figure 7b above with initial conditions:

$cosWphi = -0.338086344651354;

$cos3A = $cosWφ;

$x = -1; # starting point.

Point of Inflection

[edit | edit source]

The Point of Inflection is the point at which the slope of the curve is minimum.

After taking the first and second derivatives value at point of inflection is:

The slope at point of inflection is:

Value at point of inflection is:

From basic principles

[edit | edit source]
Figure 1. 4 points relative to point of inflection.

Relative to point of inflection :
Points have coordinates .
Points have coordinates .
When 2 points are equidistant in terms of they are also equidistant in terms of

may be calculated from basic principles.

Let us define the point of inflection as the point about which the curve is symmetric.

Let and let be non-zero.

Then where is point of inflection.

Let and

Then

Let be relative to

Then

Similarly

therefore:

Depressed cubic

[edit | edit source]

Recall from "Depressed cubic" above:

Therefore:

Coefficients of the depressed cubic show immediately:

  • If slope at point of inflection is positive, zero or negative, and
  • If point of inflection is above, on or below X axis.

If 1 of is zero, the cubic equation may be solved as under "Depressed cubic" above.

Newton's Method

[edit | edit source]

If both of the depressed function are non-zero, Newton's method may be applied to the original cubic function, and the Point of Inflection offers a convenient starting point.

When implemented as described below, Newton's Method always avoids that part of the curve where there might be equal roots.

slope at PoI positive

[edit | edit source]
Figure 8a.


Cubic function with positive slope at Point of Inflection

slope at PoI negative

[edit | edit source]

PoI above X axis

[edit | edit source]
Figure 8b.


Cubic function with negative slope at Point of Inflection
and PoI above axis.

When the other 2 intercepts may be calculated as roots of the associated quadratic with coefficients:

($a,$b,$c,$d) = (0.1,0.9,0.2,-2.8);
($x,$y) = ($x1a,$ypoi);

while(abs($y) > 1e-14){
    $s = 3*$a*$x*$x + 2*$b*$x + $c;
    $delta_x = $y/$s;
    $x -= $delta_x ;
    $y = $a*$x*$x*$x + $b*$x*$x + $c*$x + $d;
    print "
x=$x,y=$y
";
}

print "
x=$x
";
x=-8.4,y=-0.246400000000004

x=-8.36056338028169,y=-0.00251336673084257

x=-8.36015274586958,y=-2.7116352896428e-07

x=-8.36015270155726,y=-8.88178419700125e-16

x=-8.36015270155726
Graphs of 3 different cubic functions all solved with the same technique.

The figure shows all possible considerations if point of inflection is above axis.

The same technique using Newton's Method works well with all conditions.

PoI below X axis

[edit | edit source]
Figure 8c.


Cubic function with negative slope at Point of Inflection
and PoI below axis.

When the other 2 intercepts may be calculated as roots of the associated quadratic with coefficients:

Graphs of 3 different cubic functions all solved with the same technique.

The figure shows all possible considerations if point of inflection is below axis.

The same technique using Newton's Method works well with all conditions.

Using Newton's method

[edit | edit source]

The method used to solve the cubic equation (as presented here) depends on the value of the discriminant (B² - 4C³). If this value is non-negative, the value of 1 root is easily calculated and the other 2 roots are solutions of the associated quadratic described under "linear and quadratic" above. If this value is negative, the use of this value leads to some interesting theory of complex numbers and the solution depends on the calculation of


The method above uses Newton's method to calculate from Newton's method is very fast and more than adequate to do the job. However, the purist might say that the solution of a cubic equation must not depend on the solution of a cubic equation. The solution offered under "Cosine(A/3)" above satisfies the purist.


Also, if you're going to use Newton's method to calculate why not use Newton's method to calculate one real root of the original cubic?


One of the objectives above is to show that the cubic equation can be solved with high school math. Newton's method can be implemented with a good knowledge of high school calculus and the starting point may depend on the solution of a quadratic equation, also understood with a good knowledge of high school algebra.


The example presented below shows how to solve the cubic equation with high school math.

For function TwoRootsOfCubic() see General_case above.

Calculate roots of cubic function:

# python code

a,b,c,d = abcd = 2, -33, -6164, -65760

# Coefficients of depressed cubic:
A = 9*a*c - 3*b*b
B = 27*a*a*d - 9*a*b*c + 2*b*b*b

# The point of inflection:
ypoi = B/(27*a*a)
xpoi = -b/(3*a)
spoi = A/(9*a)
print ('xpoi =',xpoi)
print ('ypoi =',ypoi)
print ('spoi =',spoi)
xpoi = 5.5
ypoi = -100327.5
spoi = -6345.5

is negative. will not be used as starting point.

Figure 1: Diagram illustrating relationship between and
Roots of are 2 possible starting points.
Because is below axis, is chosen.

The associated quadratic when

Find 2 possible starting points to left and right of

TwoRootsOfCubicDebug = 1

x11,x12 = TwoRootsOfCubic((a,b,c,d), xpoi)
print ('x11,x12 =',x11,x12)
TwoRootsOfCubic ():
    y = ( 2 )xx + ( -22.0 )x + ( -6285.0 )
    for x1 = 5.5 , sum1 = -100327.5
    for x2 = -50.82716928800878 , sum2 = -100327.5
    for x3 = 61.82716928800878 , sum3 = -100327.50000000006
    
x11,x12 = -50.82716928800878 61.82716928800878

Execute newton's method:

if ypoi > 0 : start = x11
else : start = x12

# The differential function
_a = 3*a
_b = 2*b
_c = c

x = start
y = ypoi
while abs(y) > 1e-24 :
    print ('x,y =',x,y)
    s = _a*x*x + _b*x + _c
    deltax = y/s
    x -= deltax
    y = a*x*x*x + b*x*x + c*x + d
x1 = x
print ('x1 =',x1)
x,y = 61.82716928800878 -100327.5
x,y = 69.7325746934142 22109.249048075755
x,y = 68.53160134747581 552.4056893695961
x,y = 68.50002158732813 0.3770984176080674
x,y = 68.50000000001009 1.762527972459793e-07

x1 = 68.5

The starting point start is close to which was found quickly.

If only one root is required (as in calculation of roots of quartic function), may be used, in which case calculations below are not necessary. The big advantage of using is that is guaranteed to be a real number.

Figure 2: Diagram illustrating relationship between and
Roots of are 2 roots of

The associated quadratic when

x2,x3 = TwoRootsOfCubic(abcd, x1)

print ('3 roots:', x1,x2,x3)
TwoRootsOfCubic ():
    y = ( 2 )xx + ( 104.0 )x + ( 960.0 )
    for x1 = 68.5 , sum1 = 0.0
    for x2 = -40.0 , sum2 = 0.0
    for x3 = -12.0 , sum3 = 0.0
    
3 roots: 68.5 -40.0 -12.0

In practice

[edit | edit source]

Much interesting theory concerning complex numbers and Vieta's substitution has been presented above. The formula for a root of the cubic equation, is already appearing to be too complicated. Using the formula usually involves calculation of square root and cube root, possibly a complex cube root. How are these values calculated? Possibly by using Newton's method.

Every cubic function is guaranteed to contain at least one real root. The function below, oneRootOfCubic (), is an attempt at almost extreme simplicity. Considerations such as equal roots or complex cube root are ignored. After a few simple decisions, Newton's method is used to derive one real root of the given cubic.

# Python code
newtonDebug = 0

def newton (abcd, startx) :
    '''
x = newton (abcd, startx)
Values a,b,c,d,startx may be Decimal or non-Decimal, but not a mixture of both.
x is float or None.
Newton's method for finding 1 root of cubic function.
2 global variables are needed: newtonDebug
                               almostZero (same as relative tolerance)
'''

    if newtonDebug : print ('newton() 1: a,b,c,d =',abcd)
    a,b,c,d = abcd
    x = startx ; xx = x*x
    y = a*xx*x + b*xx +  c*x + d
    if newtonDebug : print ('newton() 2: x,y =', x,y)

# The differential function
# slope = 3*a*x*x + 2*b*x + c
    _a = 3*a
    _b = 2*b
    _c = c

    count = 0 ; L1 = []
    while 1 :
        count += 1
        if count >= 51 :
            print ('newton() 3: count expired.')
            return None
        slope = _a*xx + _b*x + _c
        delta_x = y/slope
        x -= delta_x
        xx = x*x
        t3,t2,t1 = a*xx*x, b*xx, c*x
        y = t3 + t2 + t1 + d
# Yes. This calculation of y is slightly faster than:
#        y = a*x*x*x + b*x*x + c*x + d
        if newtonDebug : print ('newton() 4: x,y =', x,y)
        if abs(y) <= almostZero : break
        max = sorted([ abs(v) for v in (t3,t2,t1,d) ])[-1]
        if abs(y)/max <= almostZero : break
        if x in L1[-1::-1] :
            if newtonDebug : print ('newton() 5: Endless loop detected.')
            return None
        L1 += [x]

    if newtonDebug : print ('newton() 6: count =', count)

    return x

# Python code
import decimal
D = decimal.Decimal

oneRootOfCubicDebug = 0

def oneRootOfCubic (abcd) :
    '''
x1 = oneRootOfCubic (abcd)
Each member of a,b,c,d must be int or float or Decimal.
If any member is Decimal, this function ensures that all are Decimal.
x1 may be None.
'''
    useDecimal = False
    for v in abcd :
        if isinstance (v,D) :
            useDecimal = True; continue
        if type(v) not in (int,float) :
            print ('oneRootOfCubic() 1: Each member of input (abcd) must be int, float or Decimal.')
            return None

    if useDecimal : a,b,c,d = [ D(str(v)) for v in abcd ]
    else : a,b,c,d = abcd

    if a == 0 :
        print ('oneRootOfCubic() 2: a must be non-zero.')
        return None

    if d == 0 : return 0

    if a != 1 :
        divider = a
        a,b,c,d = [ v/divider for v in (a,b,c,d) ] # a is now +1.

    if b == c == 0 :
        # This is effectively the calculation of cube root.
        if oneRootOfCubicDebug : print ('oneRootOfCubic() 3: Cube root of', -d)
        root3 = simpleCubeRoot(-d)
        if useDecimal : return D(str(root3))
        return float(root3)

    xpoi = -b/3 # Point of inflection.

    # Coefficient B of depressed cubic. B = 27*a*a*d - 9*a*b*c + 2*b*b*b
    B = 27*d - 9*b*c + 2*b*b*b
    if B == 0 :
        # Point of inflection is on X axis.
        if oneRootOfCubicDebug : print ('oneRootOfCubic() 4: Found B=0.')
        return xpoi

    A = 3*c - b*b # Coefficient A of depressed cubic. A = 9*a*c - 3*b*b
    if A == 0 :
        # Slope at Point of inflection is 0.
        if oneRootOfCubicDebug : print ('oneRootOfCubic() 5: Found A=0.')
        t = simpleCubeRoot (-B)
        if not useDecimal : t = float(t)
        x = (-b + t)/3
        return x

    if A > 0 :
        # Slope at Point of inflection is positive.
        return newton((a,b,c,d),xpoi)

    # Slope at Point of inflection is negative.
    x1,x2 = TwoRootsOfCubic ( [ float(v) for v in (a,b,c,d) ], float(xpoi) )
    if oneRootOfCubicDebug : print ('oneRootOfCubic() 6: x1,x2 =',x1,x2)
    if useDecimal : x1,x2 = [ D(str(v)) for v in (x1,x2) ]

    if B > 0 :
        # Point of inflection is above X axis.
        return newton((a,b,c,d),x1)

    # Point of inflection is below X axis.
    return newton((a,b,c,d),x2)

For function TwoRootsOfCubic () see General case above.

For function simpleCubeRoot (N), see Implementation.

Translation of axes

[edit | edit source]

Cubic function relative to (u,v)

[edit | edit source]
Graphs of 2 cubic functions with same shape.
Red curve relative to point is same as blue curve relative to

The familiar equation of the cubic function: This is the equation of relative to origin However, need not be constrained as always relative to origin. It is always possible, and sometimes desirable, to express relative to any other point in the two dimensional plane. The process of producing a new function that is relative to is called "Translation of axes."

On this page the point of reference of any cubic function is the point of inflection.


Point of inflection of (red curve) is Relative to point red curve is located at Relative to blue curve is located at and equation of blue curve is or


Equation of relative to is:



where:

Move cubic function to (u,v)

[edit | edit source]
Graphs of 2 cubic functions with same shape.
Red curve moved to has equation
Blue curve moved to has equation

When a cubic function is moved to point the point of inflection is moved from present position to and the amount of movement is:


Equation of function after being moved is:

or where:

Describing a cubic function

[edit | edit source]
Graph of complicated cubic function simplified.

Given a random cubic function, particularly those with large coefficients, it's usually difficult to visualize the function. One way to simplify our perception of a random cubic function is to consider the function at origin This can be done by:

  • moving function to or
  • calculating equation of function relative to point of inflection

Consider function

Point of inflection is

Equation of relative to point of inflection is:

See red curve in diagram.

may be described as moved to point