Skip to content
Merged
12 changes: 12 additions & 0 deletions source/common/sagemath/library.sage
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,18 @@ class TBIL:
string+=latex(self.vectors[-1])
return string

#Vector equation class
class LinearCombinationFromMatrix(LinearCombination):
def __init__(self,A,vars=None):
A=A.subdivision(0,0) # ignores augmented matrices
if vars is None:
self.coefficients=[var(f"x_{i}") for i in range(1,len(A.columns())+1)]
else:
self.coefficients=[vars[:len(A.columns())]]
self.vectors=[column_matrix(v) for v in A.columns()]
self.length=min(len(self.coefficients),len(self.vectors))
self.parentheses=False

#Generic equation, which could be used with polynomial or matrix equations. Often used with a LinearCombination passed as leftside
class Equation(SageObject):
def __init__(self,leftside,rightside):
Expand Down
21 changes: 14 additions & 7 deletions source/linear-algebra/exercises/outcomes/EV/EV1/generator.sage
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ class Generator(BaseGenerator):
a,b,c,d = var("a b c d")
ls = [a,b,c,d][:rows]

# roll different statements
statements = [f"statement{l}" for l in "ABCDEF"]
shuffle(statements)

#start with nice RREF
number_of_pivots = 2
A = CheckIt.simple_random_matrix_of_rank(number_of_pivots,rows=rows,columns=columns)
Expand All @@ -32,14 +36,16 @@ class Generator(BaseGenerator):
for i in range(number_of_pivots)
],
)
matrix = A.augment(column_matrix(lin_combo), subdivide=True)
A_aug = A.augment(column_matrix(lin_combo), subdivide=True)
vectors = [
{
"v": column_matrix(lin_combo),
"lin_combo": True,
"lin_combo_exp": lin_combo_exp,
"A": matrix,
"rref": matrix.rref(),
"A": A_aug,
"rref": A_aug.rref(),
"veceq": TBIL.VectorEquation(A_aug),
statements[0]: True,
}
]

Expand All @@ -53,13 +59,15 @@ class Generator(BaseGenerator):
choice([-1,1])
for _ in range(rows)
])
matrix = A.augment(column_matrix(non_lin_combo), subdivide=True)
A_aug = A.augment(column_matrix(non_lin_combo), subdivide=True)
vectors += [
{
"v": column_matrix(non_lin_combo),
"lin_combo": False,
"A": matrix,
"rref": matrix.rref(),
"A": A_aug,
"rref": A_aug.rref(),
"veceq": TBIL.VectorEquation(A_aug),
statements[1]: True,
}
]

Expand All @@ -72,7 +80,6 @@ class Generator(BaseGenerator):
"vectors": vectors,
# "combovector": column_matrix(A.column(-1)),
# "statement": choice([True,False]),
# "veceq": TBIL.VectorEquation(A),
# "matrix": A,
# "rref": A.rref(),
# "pivots": A.pivots(),
Expand Down
21 changes: 20 additions & 1 deletion source/linear-algebra/exercises/outcomes/EV/EV1/template.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,26 @@ that's equivalent to this claim.
</p>
</content>
<outtro>
<p><q>The vector equation (...) has at least one solution.</q></p>
<p>Here's an example of one such statement:
<!-- {{#statementA}} -->
<q>The vector equation <m>{{veceq}}</m> has at least one solution.</q>
<!-- {{/statementA}} -->
<!-- {{#statementB}} -->
<q>The following vector equation is consistent: <m>{{veceq}}</m>.</q>
<!-- {{/statementB}} -->
<!-- {{#statementC}} -->
<q>At least one solution exists for the equation <m>{{veceq}}</m>.</q>
<!-- {{/statementC}} -->
<!-- {{#statementD}} -->
<q><m>{{veceq}}</m> has at least one solution vector.</q>
<!-- {{/statementD}} -->
<!-- {{#statementE}} -->
<q>A minimum of one solution for <m>{{veceq}}</m> can be found.</q>
<!-- {{/statementE}} -->
<!-- {{#statementF}} -->
<q>We can find at least one vector which solves the equation <m>{{veceq}}</m>.</q>
<!-- {{/statementF}} -->
</p>
</outtro>
</knowl>
<knowl>
Expand Down
10 changes: 10 additions & 0 deletions source/linear-algebra/exercises/outcomes/EV/EV2/generator.sage
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,18 @@ TBIL.config_matrix_typesetting()
class Generator(BaseGenerator):
def data(self):
A=CheckIt.simple_random_matrix_of_rank(choice([2,3]),rows=4,columns=3)

# roll different statements
statements = [f"statement{l}" for l in "ABCDEF"]
shuffle(statements)

tasks = [{
"spans": False,
"vecset": TBIL.VectorSet(A.columns()),
"matrix": A,
"rref": A.rref(),
statements[0]: True,
"veceqleft": TBIL.LinearCombinationFromMatrix(A),
}]

spans = choice([True,False])
Expand All @@ -24,6 +30,8 @@ class Generator(BaseGenerator):
"vecset": TBIL.VectorSet(A.columns()),
"matrix": A,
"rref": A.rref(),
statements[1]: True,
"veceqleft": TBIL.LinearCombinationFromMatrix(A),
}]

spans = not spans
Expand All @@ -38,6 +46,8 @@ class Generator(BaseGenerator):
"vecset": TBIL.VectorSet(A.columns()),
"matrix": A,
"rref": A.rref(),
statements[2]: True,
"veceqleft": TBIL.LinearCombinationFromMatrix(A),
}]

shuffle(tasks)
Expand Down
21 changes: 19 additions & 2 deletions source/linear-algebra/exercises/outcomes/EV/EV2/template.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,25 @@
</p>
</content>
<outtro>
<p>
<q>The vector equation <m>(...)=\vec w</m> has at least one solution for every <m>\vec w\in\mathbb R^4</m>.</q>
<p>Here's an example of one such statement:
<!-- {{#statementA}} -->
<q>The vector equation <m>{{veceqleft}}=\vec w</m> has at least one solution for any <m>\vec w\in\mathbb R^4</m>.</q>
<!-- {{/statementA}} -->
<!-- {{#statementB}} -->
<q>For any <m>\vec w\in\mathbb R^4</m>, the following vector equation is consistent: <m>{{veceqleft}}=\vec w</m>.</q>
<!-- {{/statementB}} -->
<!-- {{#statementC}} -->
<q>At least one solution exists for the equation <m>{{veceqleft}}=\vec w</m> for every vector <m>\vec w</m> in <m>\mathbb R^4</m>.</q>
<!-- {{/statementC}} -->
<!-- {{#statementD}} -->
<q><m>{{veceqleft}}=\vec w</m> has at least one solution vector regardless of how <m>\vec w</m> is chosen from <m>\mathbb R^4</m>.</q>
<!-- {{/statementD}} -->
<!-- {{#statementE}} -->
<q>Given any <m>\vec w</m> from <m>\mathbb R^4</m>, a minimum of one solution for <m>{{veceqleft}}=\vec w</m> can be found.</q>
<!-- {{/statementE}} -->
<!-- {{#statementF}} -->
<q>We can find at least one vector which solves the equation <m>{{veceqleft}}=\vec w</m> no matter what <m>\vec w\in\mathbb R^4</m> is.</q>
<!-- {{/statementF}} -->
</p>
</outtro>
</knowl>
Expand Down
10 changes: 10 additions & 0 deletions source/linear-algebra/exercises/outcomes/EV/EV4/generator.sage
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,18 @@ TBIL.config_matrix_typesetting()
class Generator(BaseGenerator):
def data(self):
A=CheckIt.simple_random_matrix_of_rank(choice([3,4]),rows=4,columns=5)

# roll different statements
statements = [f"statement{l}" for l in "ABCDEF"]
shuffle(statements)

tasks = [{
"independent": False,
"vecset": TBIL.VectorSet(A.columns()),
"matrix": A,
"rref": A.rref(),
statements[0]: True,
"veceqleft": TBIL.LinearCombinationFromMatrix(A),
}]

independent = choice([True,False])
Expand All @@ -24,6 +30,8 @@ class Generator(BaseGenerator):
"vecset": TBIL.VectorSet(A.columns()),
"matrix": A,
"rref": A.rref(),
statements[1]: True,
"veceqleft": TBIL.LinearCombinationFromMatrix(A),
}]

independent = not independent
Expand All @@ -38,6 +46,8 @@ class Generator(BaseGenerator):
"vecset": TBIL.VectorSet(A.columns()),
"matrix": A,
"rref": A.rref(),
statements[2]: True,
"veceqleft": TBIL.LinearCombinationFromMatrix(A),
}]

shuffle(tasks)
Expand Down
21 changes: 19 additions & 2 deletions source/linear-algebra/exercises/outcomes/EV/EV4/template.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,25 @@
</p>
</content>
<outtro>
<p>
<q>The vector equation <m>(...)=\vec 0</m> has exactly one solution.</q>
<p>Here's an example of one such statement:
<!-- {{#statementA}} -->
<q>The vector equation <m>{{veceqleft}}=\vec 0</m> has exactly one solution.</q>
<!-- {{/statementA}} -->
<!-- {{#statementB}} -->
<q>The following vector equation is consistent with a unique solution: <m>{{veceqleft}}=\vec 0</m>.</q>
<!-- {{/statementB}} -->
<!-- {{#statementC}} -->
<q>Exactly one solution exists for the equation <m>{{veceqleft}}=\vec 0</m>.</q>
<!-- {{/statementC}} -->
<!-- {{#statementD}} -->
<q><m>{{veceqleft}}=\vec 0</m> can only be solved by the solution vector <m>\vec 0</m>.</q>
<!-- {{/statementD}} -->
<!-- {{#statementE}} -->
<q>The unique solution for <m>{{veceqleft}}=\vec 0</m> is the zero vector.</q>
<!-- {{/statementE}} -->
<!-- {{#statementF}} -->
<q>There is no vector besides <m>\vec 0</m> which solves the equation <m>{{veceqleft}}=\vec 0</m>.</q>
<!-- {{/statementF}} -->
</p>
</outtro>
</knowl>
Expand Down
10 changes: 10 additions & 0 deletions source/linear-algebra/exercises/outcomes/EV/EV5/generator.sage
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,18 @@ TBIL.config_matrix_typesetting()
class Generator(BaseGenerator):
def data(self):
A=CheckIt.simple_random_matrix_of_rank(choice([2,3]),rows=4,columns=choice([3,5]))

# roll different statements
statements = [f"statement{l}" for l in "ABCDEF"]
shuffle(statements)

tasks = [{
"basis": False,
"vecset": TBIL.VectorSet(A.columns()),
"matrix": A,
"rref": A.rref(),
statements[0]: True,
"veceqleft": TBIL.LinearCombinationFromMatrix(A),
}]

basis = choice([True,False])
Expand All @@ -24,6 +30,8 @@ class Generator(BaseGenerator):
"vecset": TBIL.VectorSet(A.columns()),
"matrix": A,
"rref": A.rref(),
statements[1]: True,
"veceqleft": TBIL.LinearCombinationFromMatrix(A),
}]

basis = not basis
Expand All @@ -38,6 +46,8 @@ class Generator(BaseGenerator):
"vecset": TBIL.VectorSet(A.columns()),
"matrix": A,
"rref": A.rref(),
statements[2]: True,
"veceqleft": TBIL.LinearCombinationFromMatrix(A),
}]

shuffle(tasks)
Expand Down
21 changes: 19 additions & 2 deletions source/linear-algebra/exercises/outcomes/EV/EV5/template.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,25 @@
</p>
</content>
<outtro>
<p>
<q>The vector equation <m>(...)=\vec w</m> has exactly one solution for every <m>\vec w\in\mathbb R^4</m>.</q>
<p>Here's an example of one such statement:
<!-- {{#statementA}} -->
<q>The vector equation <m>{{veceqleft}}=\vec w</m> has a unique solution for any <m>\vec w\in\mathbb R^4</m>.</q>
<!-- {{/statementA}} -->
<!-- {{#statementB}} -->
<q>For any <m>\vec w\in\mathbb R^4</m>, the following vector equation has exactly one solution: <m>{{veceqleft}}=\vec w</m>.</q>
<!-- {{/statementB}} -->
<!-- {{#statementC}} -->
<q>One and only one solution exists for the equation <m>{{veceqleft}}=\vec w</m> for every vector <m>\vec w</m> in <m>\mathbb R^4</m>.</q>
<!-- {{/statementC}} -->
<!-- {{#statementD}} -->
<q><m>{{veceqleft}}=\vec w</m> has a unique solution regardless of how <m>\vec w</m> is chosen from <m>\mathbb R^4</m>.</q>
<!-- {{/statementD}} -->
<!-- {{#statementE}} -->
<q>Given any <m>\vec w</m> from <m>\mathbb R^4</m>, exactly one solution for <m>{{veceqleft}}=\vec w</m> can be found.</q>
<!-- {{/statementE}} -->
<!-- {{#statementF}} -->
<q>We can find a unique vector which solves the equation <m>{{veceqleft}}=\vec w</m> no matter what <m>\vec w\in\mathbb R^4</m> is.</q>
<!-- {{/statementF}} -->
</p>
</outtro>
</knowl>
Expand Down