For the following quadratic function:
\(f(x) = x^2 + 2x – 20\)
Here’s the plot that we want to produce:
Coding the function f(x) in R
A quadratic function is a function of the form: \(ax^2 + bx + c\), where \(a \neq 0\).
So for \(f(x) = x^2 + 2x – 20\):
- a = 1
- b = 2
- c = -20
In R, we write:
a = 1 b = 2 c = -20 f = function(x) { a*x^2 + b*x + c }
Plotting the quadratic function f(x)
First, we have to choose a domain over which we want to plot f(x).
Let’s try -10 ≤ x ≤ 10:
# domain over which we want to plot f(x) x = -10:10 # plot f(x) plot(x, f(x), type = 'l') # type = 'l' plots a line instead of points # plot the x and y axes abline(h = 0) abline(v = 0)
Output:
Finding the vertex
The vertex V of a quadratic equation, in this case the lowest point on the graph of f(x), is: \(V(\frac{-b}{2a}, f(\frac{-b}{2a}))\)
find.vertex = function(a, b, c) { x_vertex = -b/(2 * a) y_vertex = f(x_vertex) c(x_vertex, y_vertex) } V = find.vertex(a, b, c) # print(V) outputs: -1 -21 # so the vertex is the point V(-1, -21)
Adding the vertex to the plot:
# add the vertex to the plot points(x = V[1], y = V[2], pch = 18, cex = 2) # pch controls the form of the point and cex controls its size # add a label next to the point text(x = V[1], y = V[2], labels = "Vertex", pos = 3) # pos = 3 places the text above the point
Output:
Finding the x-intercepts of f(x)
The x-intercepts are the solutions of the quadratic equation f(x) = 0; they can be found by using the quadratic formula:
\(x = \frac{-b \pm \sqrt{b^2 – 4ac}}{2a}\)
The quantity \(b^2 – 4ac\) is called the discriminant:
- if the discriminant is positive, then f(x) has 2 solutions (i.e. 2 x-intercepts).
- if the discriminant is zero, then f(x) has 1 solution (i.e. 1 x-intercept).
- if the discriminant is negative, then f(x) has no real solutions (i.e. does not intersect the x-axis).
# find the x-intercepts of f(x) find.roots = function(a, b, c) { discriminant = b^2 - 4 * a * c if (discriminant > 0) { c((-b - sqrt(discriminant))/(2 * a), (-b + sqrt(discriminant))/(2 * a)) } else if (discriminant == 0) { -b / (2 * a) } else { NaN } } solutions = find.roots(a, b, c) # print(solutions) outputs: -5.582576 3.582576 # so the x-intercepts are the points: (-5.582576, 0) and (3.582576, 0)
Adding the x-intercepts to the plot:
# add the x-intercepts to the plot points(x = solutions, y = rep(0, length(solutions)), # x and y coordinates of the x-intercepts pch = 18, cex = 2, col = 'red') text(x = solutions, y = rep(0, length(solutions)), labels = rep("x-intercept", length(solutions)), pos = 3, col = 'red')
Output:
Here’s the full code used in this tutorial
a = 1 b = 2 c = -20 f = function(x) { a*x^2 + b*x + c } # simple plot of f(x) x = -10:10 plot(x, f(x), type = 'l') # plot the x and y axes abline(h = 0) abline(v = 0) # find the vertex find.vertex = function(a, b, c) { x_vertex = -b/(2 * a) y_vertex = f(x_vertex) c(x_vertex, y_vertex) } V = find.vertex(a, b, c) # add the vertex to the plot points(x = V[1], y = V[2], pch = 18, cex = 2) text(x = V[1], y = V[2], labels = "Vertex", pos = 3) # find the x-intercepts of f(x) find.roots = function(a, b, c) { discriminant = b^2 - 4 * a * c if (discriminant > 0) { c((-b - sqrt(discriminant))/(2 * a), (-b + sqrt(discriminant))/(2 * a)) } else if (discriminant == 0) { -b / (2 * a) } else { NaN } } solutions = find.roots(a, b, c) # add the x-intercepts to the plot points(x = solutions, y = rep(0, length(solutions)), pch = 18, cex = 2, col = 'red') text(x = solutions, y = rep(0, length(solutions)), labels = rep("x-intercept", length(solutions)), pos = 3, col = 'red')
I encourage you to play with this code, for example, you can change the function f(x) to get a negative discriminant, by using:
- a = 1
- b = 2
- c = 2
What does the plot look like in this case?