Chapter 7
22 min read
Section 37 of 139

When the Grid Refuses to Build

Building Your Own Grid

By the end of this section you will recognize the moment a grid collapses — when a second vector promises a new direction and delivers none. Section 3 showed that any pair of genuinely different directions builds a working grid. This section shows what happens when they are not genuinely different: the construction does not just work worse, it fails outright, and the plane you hoped for stays a line.

What You Will Be Able to Do

You will be able to…Concretely
Spot a duplicate directionRecognize when a second vector is just a scaled copy of the first, pointing along the same line.
Explain why the grid refusesSay, in one sentence, why every combination of two parallel vectors is stuck on one line.
Define dependence constructivelyState that a vector is 'extra' when it cannot help the set build any new part of the grid.
Preview the numeric testAnticipate that a determinant of zero is the algebraic signature of this exact failure.

The Big Picture: A Pair That Cannot Build Anything New

Start with one working ruler, v=(1,2)\vec v = (1, 2). By itself it spans a line: every scaling tvt\vec v lands somewhere on that line, and nowhere else. Now hand the grid a second vector, w=(3,6)\vec w = (3, 6), hoping it opens up the plane the way Section 3’s pairs did.

It does not — because w\vec w is not a new direction at all:

w=(3,6)=3(1,2)=3v\vec w = (3, 6) = 3 \cdot (1, 2) = 3\vec v

Every combination xv+ywx\vec v + y\vec w is really xv+y(3v)=(x+3y)vx\vec v + y(3\vec v) = (x + 3y)\vec v — still just some multiple of v\vec v. No matter how you scale and mix the two, you never leave the original line. The grid you were promised — two vectors, a whole plane — never gets built. w\vec w is extra: it cannot help the set reach anywherev\vec v could not already reach alone.

This is the constructive picture of linear dependence: a set is dependent when one of its vectors is redundant in exactly this way — reachable from the others, contributing zero new reach. The later sections make this precise with a single number, the determinant, that goes to zero at the exact instant a pair collapses like this.


The Owner's Two Examples, Worked

The teaching notes behind this chapter work through this exact failure twice, with two concrete matrices. Both are worth doing by hand, because the second one forces a small but important detour into how a matrix gets written down.

Two copies of the same direction

The plainest possible case: hand the grid the same vector twice. Naming b1=(1,0)\vec b_1 = (1, 0) and b2=(1,0)\vec b_2 = (1, 0) as the columns of a matrix,

A=[1100],A = \begin{bmatrix} 1 & 1 \\ 0 & 0 \end{bmatrix},

every combination collapses the same way Section 3’s example did — just with the scalar equal to exactly 1 this time:

xb1+yb2=x(1,0)+y(1,0)=(x+y)(1,0)x\vec b_1 + y\vec b_2 = x(1, 0) + y(1, 0) = (x + y)(1, 0)

No matter what xx and yy you pick, the result is always some multiple of (1,0)(1, 0) — every reachable point sits on the x-axis. Two vectors went in; one dimension came out.

The notes' second example — and a convention to reconcile

The handwritten notes give a second version of the same failure, written as “A = [1, 0; 2, 0]”. Read literally as a matrix with rows separated by the semicolon, that is:

Anotes=[1020](row 1=b1, row 2=b2)A_{\text{notes}} = \begin{bmatrix} 1 & 0 \\ 2 & 0 \end{bmatrix} \quad \text{(row 1} = \vec b_1\text{, row 2} = \vec b_2\text{)}

Every matrix in this book — and in the studio — is written the other way: basis vectors as columns, not rows. The same two vectors, b1=(1,0)\vec b_1 = (1, 0) and b2=(2,0)\vec b_2 = (2, 0), filed as columns instead of rows, give:

A=[1200]=AnotesTA = \begin{bmatrix} 1 & 2 \\ 0 & 0 \end{bmatrix} = A_{\text{notes}}^{\mathsf T}

AA is literally the transpose of AnotesA_{\text{notes}} — same two vectors, same information, just filed by rows instead of columns. From here on this chapter uses the column form, matching every other matrix in the book; keep the transpose in mind if you ever compare notes against the original handwritten pages.

With b2=(2,0)=2b1\vec b_2 = (2, 0) = 2\vec b_1, the same collapse happens, just scaled:

xb1+yb2=xb1+y(2b1)=(x+2y)b1x\vec b_1 + y\vec b_2 = x\vec b_1 + y(2\vec b_1) = (x + 2y)\vec b_1

Again, every combination is stuck as a multiple of b1\vec b_1 — still just the x-axis, still just one dimension, however you scale yy.


The Determinant Catches It

Both collapses leave a fingerprint in the numbers themselves. For a 2×22 \times 2 matrix [abcd]\begin{bmatrix} a & b \\ c & d \end{bmatrix}, the determinant is adbcad - bc. Work it out for both examples, digit by digit.

First example, A=[1100]A = \begin{bmatrix} 1 & 1 \\ 0 & 0 \end{bmatrix} (a=1,b=1,c=0,d=0a=1, b=1, c=0, d=0):

detA=(1)(0)(1)(0)=00=0\det A = (1)(0) - (1)(0) = 0 - 0 = 0

Second example, A=[1200]A = \begin{bmatrix} 1 & 2 \\ 0 & 0 \end{bmatrix} (a=1,b=2,c=0,d=0a=1, b=2, c=0, d=0):

detA=(1)(0)(2)(0)=00=0\det A = (1)(0) - (2)(0) = 0 - 0 = 0

Both come out exactly zero — not a coincidence of these particular numbers, but the signature of the failure itself. A nonzero determinant measures how much the unit square's area got stretched by the transformation; a collapsed grid has no area left to stretch, because it never leaves a line. Dependence, one vector is extra, and det = 0 are three ways of saying the exact same thing.

One more detail worth being precise about: which vector is “extra” is not unique. In the second example you could just as well keep b1=(1,0)\vec b_1 = (1, 0) and call it the redundant one, dropping it in favor of b2=(2,0)\vec b_2 = (2, 0) alone — the reachable set (the x-axis) is identical either way. Dependence is a property of the pair, not a label stuck to one vector.


See It Live: Finish the Collapse

The viewer below opens on Stage 4 — Your Grid. Open the presets list and choose “The notes' example — finish the collapse”. It loads b1=(1,0)\vec b_1 = (1, 0) and b2=(2,0.35)\vec b_2 = (2, 0.35) — deliberately not yet the notes' exact (2,0)(2, 0). The rank chip still reads 2 and the amber grid still (barely) covers the plane, because b2\vec b_2 has not quite lined up with b1\vec b_1 yet.

Drag the green handle (b2\vec b_2) straight down onto the x-axis, landing on (2,0)(2, 0) — the exact point worked out above. Watch the rank chip flip from 2 to 1 the instant it lands, the amber grid thin out to a single line, and a dashed red null-space direction appear. That is the collapse this section has been describing, built with your own hands instead of read off a page.

Loading grid builder

Checking Rank With NumPy

In practice nobody computes a 2×2 determinant by hand to check for collapse — you ask for the rank directly. np.linalg.matrix_rank\texttt{np.linalg.matrix\_rank} reads the rank off a singular value decomposition, tolerant of floating-point noise. Compare this section's collapsed matrix against Section 3’s full-rank one:

np.linalg.matrix_rank on a collapsed grid vs. a full-rank grid
🐍grid_rank_check.py
1import numpy as np

📚 NumPy — the array library under most numerical Python. We use np.linalg.matrix_rank, the same SVD-based rank Chapter 7 introduces.

EXAMPLE
after import: np.linalg.* available
3A_collapsed = np.array([[1, 2], [0, 0]])

📚 The row-array form of this section's second example: column 0 is b1 = (1, 0), column 1 is b2 = (2, 0) — a scaled copy of b1.

EXAMPLE
⬆ A_collapsed.shape = (2, 2)
6A_full_rank = np.array([[1, -1], [1, 1]])

📚 §3's live example: column 0 is u1 = (1, 1), column 1 is u2 = (-1, 1) — genuinely different directions, drawn earlier as the cyan-and-amber grid pair.

EXAMPLE
⬆ A_full_rank.shape = (2, 2)
9print("rank(A_collapsed) =", np.linalg.matrix_rank(A_collapsed))

matrix_rank finds only one meaningful singular value — the second column contributed no new direction, exactly as the by-hand determinant already showed.

EXAMPLE
stdout: rank(A_collapsed) = 1
10print("rank(A_full_rank) =", np.linalg.matrix_rank(A_full_rank))

Both columns of A_full_rank are genuinely new directions, so NumPy confirms the grid built a full plane.

EXAMPLE
stdout: rank(A_full_rank) = 2
5 lines without explanation
1import numpy as np
2
3A_collapsed = np.array([[1.0, 2.0],
4                         [0.0, 0.0]])   # b1=(1,0), b2=(2,0) as columns
5
6A_full_rank = np.array([[1.0, -1.0],
7                         [1.0, 1.0]])   # u1=(1,1), u2=(-1,1) as columns
8
9print("rank(A_collapsed) =", np.linalg.matrix_rank(A_collapsed))
10print("rank(A_full_rank) =", np.linalg.matrix_rank(A_full_rank))

Same function, same tolerance-aware algorithm, two very different verdicts — because the two matrices really do describe two very different grids: one plane, one line.


Common Misconceptions

“Dependent means the vectors are equal”

Why it is tempting: the cleanest example — two copies of the same vector — makes it look like dependence requires literal equality. Correction: equality is only one way to be dependent; being collinear is enough. Any two vectors on the same line through the origin, however differently scaled or even pointing opposite ways, are dependent. Example: b1=(1,0)\vec b_1 = (1, 0) and b2=(3,0)\vec b_2 = (-3, 0) are not equal, not even the same length, and point in opposite directions — yet b2=3b1\vec b_2 = -3\vec b_1, so they are just as dependent as two literal copies. Every combination of the two still lands on the x-axis.


Practice Problems

Beginner

B1. For A=[1326]A = \begin{bmatrix} 1 & 3 \\ 2 & 6 \end{bmatrix}, compute detA\det A and state whether the two columns are dependent.
Hint: is column 2 a scalar multiple of column 1?

Conceptual

C1. For b1=(1,2)\vec b_1 = (1, 2), find every b2\vec b_2 that makes {b1,b2}\{\vec b_1, \vec b_2\} dependent. Describe the answer as a set, not a single vector.
Hint: dependence with b1\vec b_1 means lying on b1\vec b_1's own line — every point of that line, for every real scalar tt.

Coding

K1. Using NumPy, write a small function that takes a 2×22 \times 2 array and prints “independent” or “dependent” based on np.linalg.matrix_rank\texttt{np.linalg.matrix\_rank}. Test it on both matrices from the worked examples above.
Hint: rank 2 means independent; rank less than 2 means dependent.


Loading comments...