Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
| Download
Views: 1794
Image: ubuntu2004
1
load("__common__.sage")
2
3
def generator():
4
# create a 4x4 or 5x3 matrix
5
rows = randrange(3,5)
6
columns = 8-rows
7
8
#start with nice RREF
9
max_number_of_pivots = min(rows,columns)
10
number_of_pivots = randrange(2,max_number_of_pivots+1)
11
A = random_matrix(QQ,rows,columns,algorithm='echelonizable',rank=number_of_pivots,upper_bound=9)
12
A.subdivide([],[columns-1])
13
14
# construct variables
15
xs=vector([var("x_"+str(i+1)) for i in range(0,columns-1)])
16
17
# construct system
18
system=[A.delete_columns([columns-1]).row(r)*xs==A.column(-1)[r] for r in range(0,rows)]
19
20
#Choose prompt
21
prompt = choice(["system","vectoreq"])
22
23
# Get RREF
24
rref = copy(A.echelon_form())
25
rref.subdivide([],[columns-1])
26
constants = rref.column(-1)
27
free_vars = [var("a"), var("b"), var("c"), var("d")]
28
29
# get solution
30
if columns-1 in A.pivots():
31
# a pivot in the last column represents a contradiction
32
solset=setBuilder()
33
else:
34
# get particular solution
35
part_sol = []
36
abbr_part_sol = list(rref.column(-1))
37
for i in range(0,columns-1):
38
if i in A.pivots():
39
part_sol.append(abbr_part_sol.pop(0))
40
else:
41
part_sol.append(0)
42
sol = column_matrix(QQ,part_sol)
43
# add span of homogeneous general solution
44
predicate = []
45
for v in A.delete_columns([columns-1]).right_kernel(basis='pivot').basis():
46
free_var = free_vars.pop(0)
47
predicate.append(free_var)
48
predicate.append(",")
49
sol += free_var*column_matrix(v)
50
if (len(predicate) > 0):
51
predicate.pop() #Remove extra comma
52
predicate.append(LatexExpr(r"\in\mathbb{R}"))
53
solset = setBuilder(sol,predicate)
54
else:
55
infinite = False
56
solset = setBuilder(sol)
57
58
59
return {
60
'system': systemEquations(A).equations,
61
'alignCols': A.ncols(),
62
'matrix': A,
63
'rref': rref,
64
'solution': solset,
65
'prompt': prompt,
66
'vectoreq': vectorEquation(A)
67
}
68
69