Cubic function
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

- 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
Introduction
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
Coefficient c missing
If coefficient is missing, the cubic function becomes and
For a stationary point
When coefficient is missing, there is always a stationary point at Template:RoundBoxBottom
x = f(y)
The cubic function may be expressed as
Unless otherwise noted, references to "cubic function" on this page refer to function of form Template:RoundBoxBottom
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.
Template:RoundBoxBottom
Sum of roots 0
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 Template:RoundBoxBottom
Ratio of stationary points to roots
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 Template:RoundBoxBottom
s = 2r
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 Template:RoundBoxBottom
Function as product of 3 linear functions
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
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 . Template:RoundBoxTop
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 Template:RoundBoxTop Let
where
If point is any point on the curve of then the solution of provides the other values of that produce Template:RoundBoxTop
All values of that produce
An example:
Let
It is known that point satisfies
Let associated quadratic function
Roots of show that when or Template:RoundBoxBottom
General case
Template:RoundBoxTop
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: Template:RoundBoxBottom Template:RoundBoxBottom Template:RoundBoxBottom
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)Template:RoundBoxBottom The 4 coefficients above are in fact the values Template:RoundBoxBottom Cubic function defined by the 4 points is Template:RoundBoxBottom
Function defined by 3 points and 1 slope
Template:RoundBoxTop 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)Template:RoundBoxBottom The 4 coefficients above are in fact the values (same as above.) Template:RoundBoxBottom Template:RoundBoxTop
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 ) Template:RoundBoxBottom Template:RoundBoxBottom Template:RoundBoxBottom
The simplest cubic function
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. Template:RoundBoxBottom
Roots of equal absolute value
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
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 . Template:RoundBoxTop This method works with complex roots of equal absolute value.
Consider function:
has roots of equal absolute value.
Roots of equal absolute value are: Template:RoundBoxBottom Template:RoundBoxBottom
Equal Roots
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 .
Template:RoundBoxTop 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
No equal roots
Cubic function with 3 unique, real roots at .
Consider function
from
from
are numerically different.
Exactly 2 equal roots
Cubic function with 2 equal, real roots at .
Consider function
from
from
There are 2 equal roots at Template:RoundBoxTop 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.0Roots of cubic function are Template:RoundBoxBottom Template:RoundBoxBottom
3 equal roots
Cubic function with 3 equal, real roots at .
Consider function
from
from
from
are numerically identical, the discriminant of each is and
Depressed cubic
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 . Template:RoundBoxTop
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
Template:RoundBoxBottom Be prepared for the possibility that one or both of may be zero.
6 examples
Template:RoundBoxTop Six simple depressed cubic functions illustrate all the possible shapes of all cubic functions:
-
Cubic functions with no stationary points
-
Cubic functions with one stationary point
-
Cubic functions with two stationary points
When A = 0
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
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
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
Template:RoundBoxTop 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
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
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
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
Cubic function with 3 unique, real roots at .
in which
radians.
radians.
Using Cosine (A/3)
Template:RoundBoxTop
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))
Template:RoundBoxBottom Results are: Template:RoundBoxTop
x = 3.0
x = -2.0
x = 1.0Template:RoundBoxBottom Template:RoundBoxBottom Template:RoundBoxBottom
Review of complex math
Origin at point .
parallel to axis.
parallel to axis.
= modulus of
Angle is the phase of
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
To multiply complex numbers, multiply the moduli and add the phases.
Complex number cubed
Generally
For the cube of a complex number in polar format,
Cube root of complex number W
Let and
If then:
and
Complex number w + C/w
Let where
If
In the case of 3 real roots,
Cubic formula
Template:RoundBoxTop 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:
Template:RoundBoxTop Coefficients of depressed cubic:
Template:RoundBoxTop One root of cubic function:
Template:RoundBoxBottom Template:RoundBoxTop Formula incorporating all eight statements above is:
Template:RoundBoxBottom Template:RoundBoxTop Template:RoundBoxTop Cube roots of unity are: See "Cube roots of 1."
Therefore has 3 values:
Template:RoundBoxTop It is not necessary to use both values of
Choose either or
Template:RoundBoxBottom
Template:RoundBoxTop
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. Template:RoundBoxBottom Template:RoundBoxBottom
Using cubic formula
2 equal roots
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 = 5Notice that:
- is zero.
Template:RoundBoxBottom Template:RoundBoxBottom
1 real root
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
Template:RoundBoxBottom Template:RoundBoxBottom
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 = -3Notice that:
- is negative
- equals
Template:RoundBoxBottom Template:RoundBoxBottom Template:RoundBoxBottom Template:RoundBoxBottom
cos (A/3)
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)
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
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
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-15When cos(3A) is negative
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
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
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
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
Recall from "Depressed cubic" above:
Therefore:
Template:RoundBoxTop 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
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. Template:RoundBoxTop When implemented as described below, Newton's Method always avoids that part of the curve where there might be equal roots. Template:RoundBoxBottom
slope at PoI positive
Cubic function with positive slope at Point of Inflection
slope at PoI negative
PoI above X axis
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
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. Template:RoundBoxBottom Template:RoundBoxBottom
PoI below X axis
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:
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. Template:RoundBoxBottom Template:RoundBoxBottom Template:RoundBoxBottom
Using Newton's method
Template:RoundBoxTop 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.
Template:RoundBoxTop
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.5is negative. will not be used as starting point. Template:RoundBoxBottom
Roots of are 2 possible starting points.
Because is below axis, is chosen.
The associated quadratic when
Template:RoundBoxTop 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.82716928800878Execute 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.5The starting point start is close to which was found quickly. Template:RoundBoxTop 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. Template:RoundBoxBottom Template:RoundBoxBottom
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.0Template:RoundBoxBottom Template:RoundBoxBottom Template:RoundBoxBottom
In practice
Template:RoundBoxTop 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.
Template:RoundBoxTop
# 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
Template:RoundBoxBottom Template:RoundBoxTop
# 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.
Template:RoundBoxBottom
Template:RoundBoxBottom
Template:RoundBoxBottom
Translation of axes
Cubic function relative to (u,v)
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)
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
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 Template:RoundBoxBottom