GLOBAL KNOWLEDGE ARK

Mathematics · Article

Graph transformations and piecewise functions

Build new function graphs by changing inputs and outputs. Derive exact point mappings, carry domains, ranges and endpoint conditions through shifts, scales and reflections, and evaluate piecewise rules by selecting the permitted branch first.

Useful background article: Functions, domains and ranges

Back to Mathematics

After reading, you can

  • Distinguish changes inside and outside a function and derive the point mapping for g(x) = a f(b(x − h)) + k with nonzero a and b.
  • Determine transformed domains and complete ranges, including reversed inequalities, excluded inputs and included or excluded endpoints.
  • Evaluate and graph piecewise functions on their stated branch domains, checking boundary coverage, output uniqueness and the full range.
01

Transform coordinates while preserving the function rule

A graph point (u, v) records a permitted input u and its output v = f(u). A transformation builds a new function from that rule by changing the input sent to f, the output returned by f, or both. Keep the parent input u separate from the new input x: they may correspond to different horizontal coordinates.

Let f have real inputs and real outputs. For g(x) = a f(b(x − h)) + k, assume a and b are nonzero real constants, with real h and k. To reuse the parent point (u, v), solve b(x − h) = u. This gives x = h + u/b, and the new output is y = av + k. Thus the exact point mapping is (u, v) → (h + u/b, av + k). Substitution proves it: the new inner input equals u, so f returns v. This works for every parent graph point, not just a few plotted examples.

02

Outside changes act directly on output coordinates

For g(x) = f(x) + k, the input coordinate stays fixed and each output increases by k. Positive k moves the graph up; negative k moves it down. For g(x) = a f(x), each output coordinate is multiplied by a. A factor |a| greater than 1 stretches vertical distances from the x-axis; a factor between 0 and 1 compresses them. The notation |a| means the nonnegative magnitude of a.

If a is negative, multiplication also reflects the graph across the x-axis: positive outputs become negative and negative outputs become positive before any vertical shift. For example, g(x) = −2f(x) + 5 sends (u, v) to (u, 5 − 2v). First reflect and double the vertical coordinate, then add 5. A point with output 3 moves to output −1; adding 5 before multiplying would instead give −2(3 + 5) = −16, a different rule.

Changes outside the function leave the inherited input domain unchanged
RulePoint mappingEffect
f(x) + k(u, v) → (u, v + k)Vertical shift by k
a f(x), a > 0(u, v) → (u, av)Vertical scale by a
−f(x)(u, v) → (u, −v)Reflection across the x-axis
03

Inside changes require solving for the new horizontal coordinate

For g(x) = f(x − h), the parent input u is reached at x = u + h. Therefore h > 0 shifts the graph right and h < 0 shifts it left. The minus sign inside does not mean the graph moves left: the equation linking the old and new inputs determines the direction. For f(x + 2), write h = −2; the corresponding point moves left by 2.

For g(x) = f(bx), a parent input u is reached at x = u/b. Thus |b| > 1 compresses horizontal distances by the factor 1/|b|, while 0 < |b| < 1 stretches them by that factor. Negative b also reverses horizontal direction, reflecting across the y-axis before any horizontal shift. With f(−2(x − 1)), the full mapping is x = 1 − u/2: reflect the parent horizontal coordinate, halve it, then shift it right by 1.

Solve the inside equation instead of copying its sign or scale
RuleRequired equationNew horizontal coordinate
f(x − 3)x − 3 = ux = u + 3
f(x + 2)x + 2 = ux = u − 2
f(2x)2x = ux = u/2
f(x/2)x/2 = ux = 2u
f(−x)−x = ux = −u
04

Read the grouped expression before describing a sequence

The two rules f(2x − 6) and f(2(x − 6)) are different. Factor the first inner expression to 2(x − 3); its point mapping is x = 3 + u/2. The second maps to x = 6 + u/2. Describing either by seeing a 6 and calling it a shift of 6 would miss the grouping. In the grouped form f(b(x − h)), scale and possibly reflect the parent horizontal coordinate first, then add h.

For the outside form a f(x) + k, multiply the parent output first, then add k. In contrast, a(f(x) + k) multiplies the shift as well. Horizontal and vertical coordinate changes can be performed in either order because they act on separate coordinates; two changes to the same coordinate need not commute. The point mapping gives one consistent description even when an expanded formula makes a sequence difficult to see.

05

Different transformations can produce the same graph

The square function on all real inputs satisfies f(−x) = (−x)² = x² = f(x). Reflecting its graph across the y-axis leaves the graph unchanged. Such a function is called even when its domain is symmetric about zero and f(−x) = f(x) for every permitted input. The coordinate mapping still sends (u, u²) to (−u, u²); it pairs points differently even though the complete graph coincides with the original.

For the same parent, f(2x) = (2x)² = 4x² = 4f(x). A horizontal compression by 1/2 and a vertical stretch by 4 therefore produce the same set of graph points. Their point mappings differ: (u, u²) becomes (u/2, u²) in the first construction and (u, 4u²) in the second. A formula or complete graph can sometimes admit more than one transformation description; this does not invalidate either exact mapping. Do not assume that a reflection must visibly change every parent graph.

06

Carry the full domain and range through the mapping

Give the transformed function its inherited domain: all real x for which b(x − h) belongs to the parent's stated domain. Every permitted parent input u then has a new input h + u/b, and every transformed input corresponds to one permitted u. Its complete range is consequently every value av + k with v in the parent's complete range. An additional restriction on the new domain may remove some outputs, so recheck the range if one is imposed.

For f(u) = u² on all real u, the range is v ≥ 0: squares are nonnegative, and any v ≥ 0 is attained at u = √v. Under a nonzero horizontal transformation the inherited domain still includes every real x, because solving for x reaches every real u. If a > 0 the transformed range is y ≥ k; if a < 0 it is y ≤ k. Each permitted y is attained by choosing a parent input with square (y − k)/a ≥ 0, then mapping that input. A few plotted outputs show examples, while this argument establishes the full range.

The nonzero assumptions matter. If b = 0, the inner input is always 0: f(0) must be defined before the expression gives a constant output. If a = 0, multiplying by zero does not make an undefined evaluation of f valid; keep the original expression's input restrictions. A separately defined constant function may be assigned a different domain, but that is a new definition.

07

Map endpoint inclusion as well as endpoint values

Let the parent be f(u) = u² only for 0 ≤ u < 2. Its range is 0 ≤ v < 4: every square obeys those bounds, and each v in them is reached by u = √v in the stated domain. Define g(x) = −2f(−3(x − 1)) + 5 on its inherited domain. The inner condition 0 ≤ −3(x − 1) < 2 gives 1/3 < x ≤ 1. Dividing an inequality by a negative number reverses its direction.

The output mapping y = 5 − 2v sends the parent's range to −3 < y ≤ 5. The included parent input u = 0 maps to the included point (1, 5); the excluded endpoint u = 2 would map to (1/3, −3), so that point remains excluded. The endpoint at the left can become the endpoint at the right after reflection. Neither a horizontal nor a vertical reflection changes whether the corresponding endpoint itself was included.

08

Choose a branch from its input condition before evaluating

A piecewise function uses different formulas on different parts of its domain. Each formula comes with an input condition. To find an output, first check the stated overall domain, then select the applicable condition, and only then substitute into that branch's formula. Do not choose whichever branch gives a preferred output, and do not add the outputs of separate branches.

For absolute value, use A(x) = −x when x < 0 and A(x) = x when x ≥ 0. At input −3 the negative-input branch gives A(−3) = −(−3) = 3. At input 0 only the second condition applies, giving A(0) = 0. The branches together cover all real inputs without overlap. Their outputs form the range y ≥ 0: outputs cannot be negative, and every y ≥ 0 is attained by input x = y in the second branch.

Absolute value uses the input's sign to select the rule
Input conditionFormulaExample
x < 0A(x) = −xA(−3) = 3
x ≥ 0A(x) = xA(0) = 0; A(3) = 3
09

Check coverage and uniqueness at every boundary

Disjoint conditions that cover the stated domain give a clear piecewise definition, provided each selected formula is defined there. For conditions x < 0 and x ≥ 0, every real input belongs to exactly one branch. Conditions x < 0 and x > 0 would leave 0 uncovered if the declared domain were all real numbers. They could define a function on the smaller domain x ≠ 0, but that changes the definition.

Overlapping conditions require their formulas to agree wherever both apply. For x − 1 when x ≤ 0 and x + 1 when x ≥ 0, input 0 would receive both −1 and 1, so this prescription is not a function on all real inputs. Identical outputs at an overlap cause no uniqueness failure, but disjoint conditions avoid the ambiguity of selecting a branch. A piecewise rule can also fail if a selected formula is undefined; an input condition alone does not repair division by zero or a negative real radicand.

10

Graph each branch on its own domain and combine its actual outputs

For p(x) = x − 1 when x < 0 and p(x) = x + 1 when x ≥ 0, draw the first line only to the left of 0 and the second only from 0 onward. The first branch has an open endpoint at (0, −1); the second has a closed point at (0, 1). An open circle marks a point excluded from that branch, and a filled circle marks an included point. Do not draw a connecting vertical segment: that would add outputs the function never assigns at input 0.

The first branch produces exactly y < −1: its formula gives that bound, and any such y is reached at x = y + 1 < 0. The second produces exactly y ≥ 1, with input x = y − 1 ≥ 0. The full range is therefore y < −1 or y ≥ 1. Combine branch ranges by including any output attained by at least one branch, rather than filling the gap between the smallest and largest plotted values.

This jump does not violate the function condition: every input still has exactly one output, and p(0) = 1. Continuity asks whether the graph joins without a break; output uniqueness asks whether an input receives more than one value. These are different questions. For absolute value, the first branch's open endpoint and the second branch's included point have the same coordinates (0, 0); the included point belongs to the full graph.

11

Compare a mapped parent point with an independent new input

The explorer provides seven transformations of the all-real square parent f(u) = u²: (x − 2)² + 1, −x², (−x)², 2x², (2x)², (x/2)² and −[−2(x − 1)]² + 3. The last uses a = −1, b = −2, h = 1 and k = 3, so its mapping is (u, u²) → (1 − u/2, 3 − u²). Notice both unchanged graphs from reflection and coincident graphs from different scale descriptions.

Choose a new input x and a parent input u independently. Evaluating g at x checks one output of the transformed rule; mapping the parent point checks a corresponding point whose new input is h + u/b. Those two new inputs need not be the same. The two remaining cases are the absolute-value branches and the jump rule x − 1 for x < 0, x + 1 for x ≥ 0; there, select the branch using the chosen input.

The finite controls and displayed graph window cannot cover every real input or output. Use the full point mapping, domain conditions and range proofs to establish complete statements. Check original formula restrictions and endpoint conditions before interpreting an open or closed point. Broader function composition follows next; here the inside affine input change is explicit and can be solved exactly.

Map points and choose piecewise branches

Choose a graph case. For a square transformation, choose a parent input u and an independent input x of the transformed function. The mapped point and the value g(x) answer different questions. For a piecewise function, choose the input first and check which branch condition includes it.

Choose a graph case
Choose a parent input u
Choose an independent input x

g(x) = (x − 2)² + 1

Domain: x ∈ ℝ. Whole range: y ∈ ℝ; y ≥ 1.

The minus sign inside x − 2 moves the square right by 2; adding 1 outside moves every output up by 1. The vertex is (2, 1).

Parent function: f(u) = u². Transformation rule: g(x) = a f(b(x − h)) + k.

Exact parameters: a = 1; b = 1; h = 2; k = 1.

Map the selected parent point

For g(x) = a f(b(x − h)) + k, with nonzero a and b, a parent point (u, f(u)) maps to (h + u/b, a f(u) + k). Solve b(x − h) = u for the new x-coordinate; do not multiply u by b.

Changing the independent input x does not change this mapped parent point. Changing u does not change the separate evaluation of g(x).

Selected parent point: (1, 1). Corresponding transformed point: (3, 2).

x = h + u/b = 3; y = a f(u) + k = 2.

Check the mapped point in the original transformed rule: g(3) = 2. The mapped output agrees exactly with the original rule.

Evaluate the selected input: x = 1

Input passed to the parent square: b(x − h) = −1. Output of the parent square: f(b(x − h)) = 1.

Value of the transformed or piecewise function: g(1) = 2.

Graph in a fixed viewing window: Shift right and upThe axes use the same fixed scales for every case. Curves and line segments are clipped to the stated window; the window is not a domain restriction. A dashed curve is the parent square and a solid curve is the selected function. A hollow square marks the selected parent point, a filled diamond its transformed point, and a circle the separately selected input-output point. Coincident markers describe the same coordinate. Selected parent point: (1, 1). Corresponding transformed point: (3, 2). Value of the transformed or piecewise function: (1, 2).−4−2024−4−20246810xy
The axes use the same fixed scales for every case. Curves and line segments are clipped to the stated window; the window is not a domain restriction. A dashed curve is the parent square and a solid curve is the selected function. A hollow square marks the selected parent point, a filled diamond its transformed point, and a circle the separately selected input-output point. Coincident markers describe the same coordinate.

Viewing window: −4 ≤ x ≤ 4; −4 ≤ y ≤ 10. Only the part of each graph inside this window is displayed. The functions and their whole ranges continue beyond the picture.

  • Dashed curve: parent square; hollow square: selected parent point
  • Solid curve: selected function; filled diamond: mapped point
  • Circle: independently selected input-output point

Shift right and up. Selected parent point: (1, 1); Corresponding transformed point: (3, 2). x = 1; g(x) = 2. Whole range: y ∈ ℝ; y ≥ 1.

Exact point mappings for nine parent inputs
Parent pointMapped point
(−3, 9)(−1, 10)
(−2, 4)(0, 5)
(−1, 1)(1, 2)
(−1/2, 1/4)(3/2, 5/4)
(0, 0)(2, 1)
(1/2, 1/4)(5/2, 5/4)
(1, 1)(3, 2)
(2, 4)(4, 5)
(3, 9)(5, 10)
Exact evaluations at nine independent inputs
Input xOutput g(x)Branch whose condition holds
−326Single square rule
−217Single square rule
−110Single square rule
−1/229/4Single square rule
05Single square rule
1/213/4Single square rule
12Single square rule
21Single square rule
32Single square rule

Why this is the whole range: y ∈ ℝ; y ≥ 1

The domain is all real x because a shifted square is always defined. Every output (x − 2)² + 1 is at least 1. For every real y ≥ 1, the real input x = 2 + √(y − 1) produces y. Hence the whole range is y ≥ 1, with its endpoint attained at x = 2.

The nine exact controls and the visible graph illustrate the rules. They do not prove a continuous domain or range. The whole-range argument excludes every value outside the stated range and constructs an allowed input for every value inside it.

Coordinate fractions, branch comparisons and mapped-point checks use exact integer arithmetic. Decimal coordinates are used only to place marks in the SVG picture. A clipped point is not moved onto the window boundary or treated as outside the function's domain.

Worked examples

Map a square and prove its complete reflected range

Let f(u) = u² for all real u and define q(x) = −2f(3(x − 1)) + 5. Map the parent points (−3, 9), (0, 0) and (3, 9), then find q(0), the inherited domain and the exact range.

  1. Identify a = −2, b = 3, h = 1 and k = 5. The mapping is (u, v) → (1 + u/3, 5 − 2v): horizontally compress by 1/3 and shift right by 1; vertically reflect, stretch by 2 and shift up by 5.
  2. The three parent points become (0, −13), (1, 5) and (2, −13). Direct substitution confirms q(0) = −2(−3)² + 5 = −13.
  3. The square parent accepts every real input, and 3(x − 1) is real for every real x. Thus the inherited domain is all real numbers. Expanding only the square gives q(x) = 5 − 18(x − 1)².
  4. Every output is at most 5 because the subtracted square is nonnegative; input 1 attains 5. For any y ≤ 5, choose x = 1 + √((5 − y)/18). This real input gives q(x) = y, proving that no value below 5 is missing.

The mapped points are (0, −13), (1, 5), (2, −13); q(0) = −13. The inherited domain is all real x and the complete range is y ≤ 5.

Carry a root's domain through a negative inside scale

Starting from f(u) = √u on u ≥ 0, define g(x) = −3f(−2(x − 4)) + 1. Find its inherited domain and exact range, map (0, 0) and (4, 2), and decide whether g(6) is defined as a real output.

  1. The parent requires −2(x − 4) ≥ 0. Dividing by −2 reverses the inequality, giving x − 4 ≤ 0, so the inherited domain is x ≤ 4. At x = 6 the radicand is −4, so the original real rule is undefined.
  2. The mapping is (u, v) → (4 − u/2, 1 − 3v). Thus (0, 0) maps to (4, 1), and (4, 2) maps to (2, −5). Check g(2) = −3√4 + 1 = −5.
  3. The parent root has outputs v ≥ 0, so every transformed output 1 − 3v is at most 1. The included parent endpoint maps to included output 1 at x = 4.
  4. For any real y ≤ 1, set s = (1 − y)/3, which is nonnegative, and choose x = 4 − s²/2. Then x ≤ 4 and the radicand is s². Its principal root is s, so g(x) = 1 − 3s = y. This proves the entire range, not just the two mapped outputs.

The inherited domain is x ≤ 4 and the complete range is y ≤ 1. The mapped points are (4, 1) and (2, −5); g(6) is undefined over the reals.

Select a charge branch and prove a range with a gap

A hypothetical booking lasts a real duration t between 0 and 5 hours. No use costs €0. Positive duration costs €4 per hour, prorated exactly, with an additional flat €3 surcharge only if t exceeds 2 hours. Define C(t), find C(2), C(5/2), C(5), and its exact range. Can this model accept t = −1 or produce a charge of €10?

  1. Declare the physical domain 0 ≤ t ≤ 5. Use C(t) = 0 at t = 0; C(t) = 4t for 0 < t ≤ 2; and C(t) = 4t + 3 for 2 < t ≤ 5. These three conditions are disjoint and cover the full domain. The surcharge is added to the whole booking's charge, rather than being a different hourly rate.
  2. At exactly 2 hours the surcharge does not apply, so C(2) = €8. At 5/2 hours it does: C(5/2) = 4(5/2) + 3 = €13. At 5 hours, C(5) = €23. A negative duration is outside the stated model's domain; do not extend a branch to calculate C(−1).
  3. The first two branches together produce every charge from €0 to €8 inclusive. For any real charge y with 0 < y ≤ 8, input t = y/4 lies in the second branch and produces it; y = 0 comes from t = 0.
  4. The last branch produces exactly 11 < y ≤ 23: its inputs obey 2 < t ≤ 5, and each charge in those bounds has t = (y − 3)/4 in that branch. Charge €11 is excluded because it would require t = 2 in the surcharge branch. Charge €10 belongs to neither branch range.
  5. At the boundary, plot the included point (2, 8) and the surcharge branch's open endpoint (2, 11). The graph jumps because of the stated flat surcharge, but every permitted duration still has one charge.

C(2) = €8, C(5/2) = €13 and C(5) = €23. The exact charge range is 0 ≤ y ≤ 8 or 11 < y ≤ 23 euros. Duration −1 is excluded and charge €10 is unattained.

Try it yourself

  1. A parent function contains point (−4, 7). For g(x) = −3f(2(x + 1)) + 5 on its inherited domain, find the corresponding new point and check its inner input.

    Show the answer and reasoning

    The new point is (−3, −16); its inner input is −4.

    Write x + 1 as x − (−1), so h = −1, b = 2, a = −3 and k = 5. The mapping gives x = −1 + (−4)/2 = −3 and y = −3(7) + 5 = −16. At x = −3, 2(x + 1) = −4, the permitted input of the given parent point.

  2. A parent function has f(1) = 4. Compare the outputs at input 1 of g(x) = 2f(x) + 3 and j(x) = 2(f(x) + 3). Also compare the horizontal point mappings of f(2x − 6) and f(2(x − 6)).

    Show the answer and reasoning

    g(1) = 11 and j(1) = 14. The horizontal mappings are x = 3 + u/2 and x = 6 + u/2 respectively.

    The first output is 2(4) + 3 = 11; the second is 2(4 + 3) = 14 because its shift is multiplied too. Solving 2x − 6 = u gives x = 3 + u/2, whereas 2(x − 6) = u gives x = 6 + u/2. Grouping determines the sequence and shift.

  3. For f(x) = x² on all real inputs, compare f(−x) with −f(x), and compare f(2x) with 4f(x). Must different coordinate mappings always create different graphs?

    Show the answer and reasoning

    f(−x) = x² is unchanged; −f(x) = −x² agrees with it only at x = 0. f(2x) = 4f(x) = 4x², although their parent-point mappings differ.

    An inside reflection sends (u, u²) to (−u, u²), while an outside reflection sends it to (u, −u²). Equality of x² and −x² requires 2x² = 0, hence x = 0. Horizontal compression sends (u, u²) to (u/2, u²); vertical stretch sends it to (u, 4u²). Both constructions describe the full graph y = 4x². Different point mappings need not produce distinct graphs.

  4. Let f(u) = u² only for 0 ≤ u < 2. For g(x) = −2f(−3(x − 1)) + 5 on its inherited domain, determine the exact domain and range and explain both endpoint inclusions.

    Show the answer and reasoning

    Domain 1/3 < x ≤ 1; range −3 < y ≤ 5. The point (1, 5) is included; (1/3, −3) is excluded.

    The condition 0 ≤ −3(x − 1) < 2 becomes x ≤ 1 and x > 1/3 after division by a negative number. The parent range is 0 ≤ v < 4, proved by u = √v; applying y = 5 − 2v gives −3 < y ≤ 5. Parent u = 0 is allowed and u = 2 is excluded, so their mapped endpoints retain those inclusion conditions.

  5. Starting from f(u) = 1/u on u ≠ 0, define r(x) = 2f(x + 3) − 4. State the inherited domain and complete range, then give an input that attains any proposed output y in that range.

    Show the answer and reasoning

    Domain x ≠ −3; range y ≠ −4. Every y ≠ −4 is attained at x = 2/(y + 4) − 3.

    The inner denominator requires x + 3 ≠ 0. The term 2/(x + 3) cannot equal zero, so subtracting 4 never produces −4. For y ≠ −4, the proposed input is real and has x + 3 = 2/(y + 4) ≠ 0; substitution gives 2/(2/(y + 4)) − 4 = y. This establishes both the exclusion and attainment of every other output.

  6. On all real inputs, let j(x) = −2x for x < 1 and j(x) = x + 2 for x ≥ 1. Find j(−2), j(1), j(3), and the complete range. Which endpoint points are open or included?

    Show the answer and reasoning

    j(−2) = 4, j(1) = 3, j(3) = 5; the complete range is y > −2. The first branch excludes (1, −2); the second includes (1, 3).

    Select by input: −2 uses −2x, while 1 and 3 use x + 2. The first branch produces every y > −2 because x = −y/2 < 1; the second produces every y ≥ 3 because x = y − 2 ≥ 1. Their combined range is y > −2, since the second range is already contained in the first. At x = 1 only the second branch applies; no connecting vertical segment belongs to the graph.

  7. Each prescription declares all real inputs. A uses x − 1 for x ≤ 0 and x + 1 for x ≥ 0. B uses x − 1 for x < 0 and x + 1 for x > 0. C uses x − 1 for x < 0 and x + 1 for x ≥ 0. Which defines a function on the declared domain, and does its jump prevent that?

    Show the answer and reasoning

    Only C defines a function on all real inputs. A assigns two outputs at 0; B omits 0. C's jump does not violate output uniqueness.

    For A, input 0 would produce −1 and 1. For B, neither condition accepts 0; its rules can define a function if the domain is changed to x ≠ 0. For C, every input belongs to exactly one condition, and C(0) = 1. It has range y < −1 or y ≥ 1, but the gap and jump do not give any input more than one output.

What to carry forward

  • For nonzero a and b, the rule g(x) = a f(b(x − h)) + k maps every parent point (u, v) to (h + u/b, av + k).
  • Outside changes multiply and shift output coordinates directly; inside changes require solving the inner equation for the new input.
  • Horizontal scale is 1/|b|, with a reflection when b is negative. Vertical scale is |a|, with a reflection when a is negative; read shifts from the grouped expression.
  • Different transformations can produce the same complete graph. Symmetry or an algebraic identity can make graphs coincide even when their parent-point mappings differ.
  • Carry the parent's stated domain, complete range and endpoint inclusions through the mapping. Recheck the range after any additional domain restriction.
  • For a piecewise rule, check the overall domain, select a branch by its input condition and then evaluate. Cover every declared input and avoid conflicting outputs at overlaps.
  • Graph each branch only on its own domain, mark open and included endpoints, and combine the exact branch ranges. A jump can coexist with one output for every input.

References

Sources for the concepts and teaching approaches in this article.

  1. OpenStax, Rice University2 sources
    1. College Algebra 2e · 3.5 Transformation of FunctionsOpenStax, Rice UniversityTextbook chapteropenstax.orgRead source
    2. College Algebra 2e · 3.2 Domain and RangeOpenStax, Rice UniversityTextbook chapteropenstax.orgRead source