math-exercises 3.0.215 → 3.0.217
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/exercises/math/arithmetic/whichDayInXDays.d.ts.map +1 -1
- package/lib/exercises/math/arithmetic/whichDayInXDays.js +2 -1
- package/lib/exercises/math/calculLitteral/equation/exp/expOfFEqualsExpOfGEquation.d.ts.map +1 -1
- package/lib/exercises/math/calculLitteral/equation/exp/expOfFEqualsExpOfGEquation.js +19 -32
- package/lib/exercises/math/complex/unitRoots/giveOneSolutionToComplexPowNEqualsOne.js +1 -1
- package/lib/exercises/math/conversion/clock/index.d.ts +0 -1
- package/lib/exercises/math/conversion/clock/index.d.ts.map +1 -1
- package/lib/exercises/math/conversion/clock/index.js +1 -1
- package/lib/exercises/math/derivation/derivative/trigo/sinCosDerivativeRewriteUsingCos2PlusSin2Equals1.js +2 -2
- package/lib/exercises/math/graphs/adjacentMatrixPath.d.ts +10 -0
- package/lib/exercises/math/graphs/adjacentMatrixPath.d.ts.map +1 -0
- package/lib/exercises/math/graphs/adjacentMatrixPath.js +89 -0
- package/lib/exercises/math/graphs/edgesNumberFromSummitsDegrees.d.ts +7 -0
- package/lib/exercises/math/graphs/edgesNumberFromSummitsDegrees.d.ts.map +1 -0
- package/lib/exercises/math/graphs/edgesNumberFromSummitsDegrees.js +98 -0
- package/lib/exercises/math/graphs/eulerianChainFromAdjacentMatrix.d.ts +8 -0
- package/lib/exercises/math/graphs/eulerianChainFromAdjacentMatrix.d.ts.map +1 -0
- package/lib/exercises/math/graphs/eulerianChainFromAdjacentMatrix.js +96 -0
- package/lib/exercises/math/graphs/graphsChainOrPathOfLengthN.d.ts +15 -0
- package/lib/exercises/math/graphs/graphsChainOrPathOfLengthN.d.ts.map +1 -0
- package/lib/exercises/math/graphs/graphsChainOrPathOfLengthN.js +262 -0
- package/lib/exercises/math/graphs/graphsCheckIsConnectedGraph.d.ts +11 -0
- package/lib/exercises/math/graphs/graphsCheckIsConnectedGraph.d.ts.map +1 -0
- package/lib/exercises/math/graphs/graphsCheckIsConnectedGraph.js +178 -0
- package/lib/exercises/math/graphs/graphsCheckIsConnectedUndirectedGraph.d.ts +11 -0
- package/lib/exercises/math/graphs/graphsCheckIsConnectedUndirectedGraph.d.ts.map +1 -0
- package/lib/exercises/math/graphs/graphsCheckIsConnectedUndirectedGraph.js +178 -0
- package/lib/exercises/math/graphs/graphsCheckIsSameGraph.d.ts +19 -0
- package/lib/exercises/math/graphs/graphsCheckIsSameGraph.d.ts.map +1 -0
- package/lib/exercises/math/graphs/graphsCheckIsSameGraph.js +301 -0
- package/lib/exercises/math/graphs/graphsCheckIsVerticesAdjacent.d.ts +16 -0
- package/lib/exercises/math/graphs/graphsCheckIsVerticesAdjacent.d.ts.map +1 -0
- package/lib/exercises/math/graphs/graphsCheckIsVerticesAdjacent.js +207 -0
- package/lib/exercises/math/graphs/graphsDegreeOfVertex.d.ts +15 -0
- package/lib/exercises/math/graphs/graphsDegreeOfVertex.d.ts.map +1 -0
- package/lib/exercises/math/graphs/graphsDegreeOfVertex.js +232 -0
- package/lib/exercises/math/graphs/graphsOrderOfGraph.d.ts +14 -0
- package/lib/exercises/math/graphs/graphsOrderOfGraph.d.ts.map +1 -0
- package/lib/exercises/math/graphs/graphsOrderOfGraph.js +222 -0
- package/lib/exercises/math/graphs/index.d.ts +10 -0
- package/lib/exercises/math/graphs/index.d.ts.map +1 -0
- package/lib/exercises/math/graphs/index.js +9 -0
- package/lib/exercises/math/index.d.ts +1 -0
- package/lib/exercises/math/index.d.ts.map +1 -1
- package/lib/exercises/math/index.js +1 -0
- package/lib/exercises/math/integration/fromExpr/integralFromExpr.d.ts.map +1 -1
- package/lib/exercises/math/integration/fromExpr/integralFromExpr.js +2 -0
- package/lib/exercises/math/matrices/areMatricesInverse.d.ts +9 -0
- package/lib/exercises/math/matrices/areMatricesInverse.d.ts.map +1 -0
- package/lib/exercises/math/matrices/areMatricesInverse.js +106 -0
- package/lib/exercises/math/matrices/computeFixedMatrixInRecurrenceSequence.d.ts +9 -0
- package/lib/exercises/math/matrices/computeFixedMatrixInRecurrenceSequence.d.ts.map +1 -0
- package/lib/exercises/math/matrices/computeFixedMatrixInRecurrenceSequence.js +144 -0
- package/lib/exercises/math/matrices/findInversedMatrixFromSystem.d.ts +8 -0
- package/lib/exercises/math/matrices/findInversedMatrixFromSystem.d.ts.map +1 -0
- package/lib/exercises/math/matrices/findInversedMatrixFromSystem.js +148 -0
- package/lib/exercises/math/matrices/index.d.ts +12 -0
- package/lib/exercises/math/matrices/index.d.ts.map +1 -1
- package/lib/exercises/math/matrices/index.js +12 -0
- package/lib/exercises/math/matrices/isMatrixTransitionMatrix.d.ts +8 -0
- package/lib/exercises/math/matrices/isMatrixTransitionMatrix.d.ts.map +1 -0
- package/lib/exercises/math/matrices/isMatrixTransitionMatrix.js +132 -0
- package/lib/exercises/math/matrices/matrixBuildMatrixFromCoefficients.d.ts +8 -0
- package/lib/exercises/math/matrices/matrixBuildMatrixFromCoefficients.d.ts.map +1 -0
- package/lib/exercises/math/matrices/matrixBuildMatrixFromCoefficients.js +152 -0
- package/lib/exercises/math/matrices/matrixCheckIsSymmetrical.d.ts +8 -0
- package/lib/exercises/math/matrices/matrixCheckIsSymmetrical.d.ts.map +1 -0
- package/lib/exercises/math/matrices/matrixCheckIsSymmetrical.js +155 -0
- package/lib/exercises/math/matrices/matrixComputeDetOfMat2.d.ts +8 -0
- package/lib/exercises/math/matrices/matrixComputeDetOfMat2.d.ts.map +1 -0
- package/lib/exercises/math/matrices/matrixComputeDetOfMat2.js +142 -0
- package/lib/exercises/math/matrices/matrixComputeInverseOfMat2.d.ts +8 -0
- package/lib/exercises/math/matrices/matrixComputeInverseOfMat2.d.ts.map +1 -0
- package/lib/exercises/math/matrices/matrixComputeInverseOfMat2.js +237 -0
- package/lib/exercises/math/matrices/matrixComputeLinearCombination.d.ts +15 -0
- package/lib/exercises/math/matrices/matrixComputeLinearCombination.d.ts.map +1 -0
- package/lib/exercises/math/matrices/matrixComputeLinearCombination.js +232 -0
- package/lib/exercises/math/matrices/matrixComputePower.d.ts +12 -0
- package/lib/exercises/math/matrices/matrixComputePower.d.ts.map +1 -0
- package/lib/exercises/math/matrices/matrixComputePower.js +230 -0
- package/lib/exercises/math/matrices/matrixComputeProduct.d.ts +9 -0
- package/lib/exercises/math/matrices/matrixComputeProduct.d.ts.map +1 -0
- package/lib/exercises/math/matrices/matrixComputeProduct.js +178 -0
- package/lib/exercises/math/matrices/writeMatrixAssociatedToSystem.d.ts +8 -0
- package/lib/exercises/math/matrices/writeMatrixAssociatedToSystem.d.ts.map +1 -0
- package/lib/exercises/math/matrices/writeMatrixAssociatedToSystem.js +105 -0
- package/lib/exercises/math/spaceGeometry/parametricLine/lineLineRelativePositionsFromParametricLines.d.ts.map +1 -1
- package/lib/exercises/math/spaceGeometry/parametricLine/lineLineRelativePositionsFromParametricLines.js +56 -3
- package/lib/exercises/math/spaceGeometry/planes/findNormalVectorFromPlaneEquation.d.ts.map +1 -1
- package/lib/exercises/math/spaceGeometry/planes/findNormalVectorFromPlaneEquation.js +6 -0
- package/lib/exercises/vea/matrixVEA.d.ts +2 -0
- package/lib/exercises/vea/matrixVEA.d.ts.map +1 -0
- package/lib/exercises/vea/matrixVEA.js +1 -0
- package/lib/exercises/vea/treeTableVEA.d.ts.map +1 -1
- package/lib/exercises/vea/treeTableVEA.js +2 -0
- package/lib/index.d.ts +86 -13
- package/lib/index.d.ts.map +1 -1
- package/lib/math/geometry/point.d.ts.map +1 -1
- package/lib/math/geometry/point.js +3 -1
- package/lib/math/graphs/graph.d.ts +43 -0
- package/lib/math/graphs/graph.d.ts.map +1 -0
- package/lib/math/graphs/graph.js +447 -0
- package/lib/math/matrices/matrix.d.ts +42 -3
- package/lib/math/matrices/matrix.d.ts.map +1 -1
- package/lib/math/matrices/matrix.js +173 -7
- package/lib/math/matrices/parseMatrix.d.ts +3 -0
- package/lib/math/matrices/parseMatrix.d.ts.map +1 -0
- package/lib/math/matrices/parseMatrix.js +22 -0
- package/lib/math/systems/generalSystem.d.ts +2 -0
- package/lib/math/systems/generalSystem.d.ts.map +1 -1
- package/lib/math/systems/generalSystem.js +5 -0
- package/lib/math/utils/graphs/graphRenderer.d.ts +25 -0
- package/lib/math/utils/graphs/graphRenderer.d.ts.map +1 -0
- package/lib/math/utils/graphs/graphRenderer.js +123 -0
- package/lib/playground.d.ts +6 -1
- package/lib/playground.d.ts.map +1 -1
- package/lib/playground.js +6 -5
- package/lib/tree/parsers/latexParser.d.ts +1 -1
- package/lib/tree/utilities/nodeSimplifier.d.ts +1 -1
- package/lib/types/keyIds.d.ts +2 -0
- package/lib/types/keyIds.d.ts.map +1 -1
- package/lib/utils/arrays/arrayChunks.d.ts +9 -0
- package/lib/utils/arrays/arrayChunks.d.ts.map +1 -0
- package/lib/utils/arrays/arrayChunks.js +34 -0
- package/lib/utils/strings/ordinalSuffixed.d.ts +2 -0
- package/lib/utils/strings/ordinalSuffixed.d.ts.map +1 -0
- package/lib/utils/strings/ordinalSuffixed.js +5 -0
- package/package.json +7 -1
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { addValidProp, tryToAddWrongProp, } from "../../../exercises/exercise.js";
|
|
2
|
+
import { getDistinctQuestions } from "../../../exercises/utils/getDistinctQuestions.js";
|
|
3
|
+
import { Matrix, MatrixConstructor, } from "../../../math/matrices/matrix.js";
|
|
4
|
+
import { randint } from "../../../math/utils/random/randint.js";
|
|
5
|
+
import { NodeComparator } from "../../../tree/utilities/nodeComparator.js";
|
|
6
|
+
import { random } from "../../../utils/alea/random.js";
|
|
7
|
+
import { zip } from "../../../utils/arrays/arrayZip.js";
|
|
8
|
+
const _isMatrixSymH = (mat) => {
|
|
9
|
+
return zip(mat.elements, mat.elements.toReversed()).every(([row1, row2]) => zip(row1, row2).every(([node1, node2]) => NodeComparator.isEqualViaSub(node1, node2)));
|
|
10
|
+
};
|
|
11
|
+
const _isMatrixSymV = (mat) => {
|
|
12
|
+
return _isMatrixSymV(mat.transposed());
|
|
13
|
+
};
|
|
14
|
+
const isMatrixSymMat = (mat) => {
|
|
15
|
+
return mat.equals(mat.transposed());
|
|
16
|
+
};
|
|
17
|
+
const getHydrated = (identifiers) => {
|
|
18
|
+
const { matIdsA } = identifiers;
|
|
19
|
+
const [matA] = [matIdsA].map((matIds) => MatrixConstructor.fromIdentifiers(matIds));
|
|
20
|
+
return {
|
|
21
|
+
matA,
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
const getInstruction = (identifiers) => {
|
|
25
|
+
const { matA } = getHydrated(identifiers);
|
|
26
|
+
return `Soit :
|
|
27
|
+
|
|
28
|
+
$$
|
|
29
|
+
A = ${matA.toTex()}
|
|
30
|
+
$$
|
|
31
|
+
|
|
32
|
+
La matrice $A$ est-elle symétrique ?`;
|
|
33
|
+
};
|
|
34
|
+
const getAnswer = (identifiers) => {
|
|
35
|
+
const { matA } = getHydrated(identifiers);
|
|
36
|
+
return isMatrixSymMat(matA) ? "Oui" : "Non";
|
|
37
|
+
};
|
|
38
|
+
const getHint = () => {
|
|
39
|
+
return `Une matrice est symétrique si elle est égale à sa transposée.
|
|
40
|
+
Les symétries axiales n'ont rien à voir avec cette qualification.`;
|
|
41
|
+
};
|
|
42
|
+
const getCorrection = (identifiers) => {
|
|
43
|
+
const { matA } = getHydrated(identifiers);
|
|
44
|
+
return `On a :
|
|
45
|
+
|
|
46
|
+
$$
|
|
47
|
+
{}^{t}A = ${matA.transposed().toTex()}
|
|
48
|
+
$$
|
|
49
|
+
|
|
50
|
+
${(() => {
|
|
51
|
+
if (isMatrixSymMat(matA)) {
|
|
52
|
+
return `On a $A = {}^{t}A$. La matrice est donc symétrique.`;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
return `On a $A \\neq {}^{t}A$. La matrice n'est donc pas symétrique.`;
|
|
56
|
+
}
|
|
57
|
+
})()}
|
|
58
|
+
|
|
59
|
+
`;
|
|
60
|
+
};
|
|
61
|
+
const getPropositions = (_, { answer }) => {
|
|
62
|
+
const propositions = [];
|
|
63
|
+
["Oui", "Non"].forEach((str) => {
|
|
64
|
+
if (str === answer) {
|
|
65
|
+
addValidProp(propositions, str, "raw");
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
tryToAddWrongProp(propositions, str, "raw");
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return propositions;
|
|
72
|
+
};
|
|
73
|
+
const createRandomIdentifiers = () => {
|
|
74
|
+
const createMatWithSymH = (nbRows, nbCols) => {
|
|
75
|
+
const nbRowsTop = Math.floor(nbRows / 2);
|
|
76
|
+
const nbRowsCenter = nbRows - 2 * nbRowsTop;
|
|
77
|
+
const elementsTop = MatrixConstructor.random(nbRowsTop, nbCols).elements;
|
|
78
|
+
const elementsCenter = nbRowsCenter > 0
|
|
79
|
+
? MatrixConstructor.random(nbRowsCenter, nbCols).elements
|
|
80
|
+
: [];
|
|
81
|
+
const elements = [
|
|
82
|
+
...elementsTop,
|
|
83
|
+
...elementsCenter,
|
|
84
|
+
...elementsTop.toReversed(),
|
|
85
|
+
];
|
|
86
|
+
const mat = new Matrix(elements);
|
|
87
|
+
return mat;
|
|
88
|
+
};
|
|
89
|
+
const matA = (() => {
|
|
90
|
+
const typeSym = random([
|
|
91
|
+
"symH",
|
|
92
|
+
"symV",
|
|
93
|
+
"symMat",
|
|
94
|
+
"square",
|
|
95
|
+
]);
|
|
96
|
+
switch (typeSym) {
|
|
97
|
+
case "symH": {
|
|
98
|
+
const nbRows = randint(3, 6);
|
|
99
|
+
const nbCols = randint(3, 6);
|
|
100
|
+
return createMatWithSymH(nbRows, nbCols);
|
|
101
|
+
}
|
|
102
|
+
case "symV": {
|
|
103
|
+
const nbRows = randint(3, 6);
|
|
104
|
+
const nbCols = randint(3, 6);
|
|
105
|
+
return createMatWithSymH(nbRows, nbCols).transposed();
|
|
106
|
+
}
|
|
107
|
+
case "symMat": {
|
|
108
|
+
const dim = randint(3, 6);
|
|
109
|
+
const matRandom = MatrixConstructor.random(dim, dim);
|
|
110
|
+
return matRandom
|
|
111
|
+
.add(matRandom.transposed())
|
|
112
|
+
.simplify({ towardsDistribute: true });
|
|
113
|
+
}
|
|
114
|
+
case "square": {
|
|
115
|
+
const dim = randint(3, 6);
|
|
116
|
+
const matRandom = MatrixConstructor.random(dim, dim);
|
|
117
|
+
return matRandom.simplify({ towardsDistribute: true });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
})();
|
|
121
|
+
const identifiers = {
|
|
122
|
+
matIdsA: matA.toIdentifiers(),
|
|
123
|
+
};
|
|
124
|
+
return identifiers;
|
|
125
|
+
};
|
|
126
|
+
const getMatrixCheckIsSymmetricalQuestion = () => {
|
|
127
|
+
const identifiers = createRandomIdentifiers();
|
|
128
|
+
return getQuestionFromIdentifiers(identifiers);
|
|
129
|
+
};
|
|
130
|
+
const getQuestionFromIdentifiers = (identifiers, optsIn) => {
|
|
131
|
+
const question = {
|
|
132
|
+
answer: getAnswer(identifiers),
|
|
133
|
+
instruction: getInstruction(identifiers),
|
|
134
|
+
answerFormat: "raw",
|
|
135
|
+
identifiers,
|
|
136
|
+
hint: getHint(identifiers),
|
|
137
|
+
correction: getCorrection(identifiers),
|
|
138
|
+
options: optsIn,
|
|
139
|
+
};
|
|
140
|
+
return question;
|
|
141
|
+
};
|
|
142
|
+
export const matrixCheckIsSymmetrical = {
|
|
143
|
+
id: "matrixCheckIsSymmetrical",
|
|
144
|
+
connector: "=",
|
|
145
|
+
label: "Déterminer si une matrice est symétrique",
|
|
146
|
+
isSingleStep: true,
|
|
147
|
+
generator: (nb, opts) => getDistinctQuestions(() => getMatrixCheckIsSymmetricalQuestion(opts), nb),
|
|
148
|
+
qcmTimer: 60,
|
|
149
|
+
freeTimer: 60,
|
|
150
|
+
getPropositions,
|
|
151
|
+
subject: "Mathématiques",
|
|
152
|
+
getQuestionFromIdentifiers,
|
|
153
|
+
hasHintAndCorrection: true,
|
|
154
|
+
answerType: "QCU",
|
|
155
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Exercise } from "../../../exercises/exercise.js";
|
|
2
|
+
import { MatrixIdentifiers } from "../../../math/matrices/matrix.js";
|
|
3
|
+
type Identifiers = {
|
|
4
|
+
matIdsA: MatrixIdentifiers;
|
|
5
|
+
};
|
|
6
|
+
export declare const matrixComputeDetOfMat2: Exercise<Identifiers>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=matrixComputeDetOfMat2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrixComputeDetOfMat2.d.ts","sourceRoot":"","sources":["../../../../src/exercises/math/matrices/matrixComputeDetOfMat2.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAgBT,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAGL,iBAAiB,EAClB,MAAM,+BAA+B,CAAC;AAQvC,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,iBAAiB,CAAC;CAC5B,CAAC;AA0JF,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,WAAW,CAcxD,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { addValidProp, propWhile, shuffleProps, tryToAddWrongProp, } from "../../../exercises/exercise.js";
|
|
2
|
+
import { getDistinctQuestions } from "../../../exercises/utils/getDistinctQuestions.js";
|
|
3
|
+
import { Matrix, MatrixConstructor, } from "../../../math/matrices/matrix.js";
|
|
4
|
+
import { add } from "../../../tree/nodes/operators/addNode.js";
|
|
5
|
+
import { multiply } from "../../../tree/nodes/operators/multiplyNode.js";
|
|
6
|
+
import { parseAlgebraic } from "../../../tree/parsers/latexParser.js";
|
|
7
|
+
import { NodeComparator } from "../../../tree/utilities/nodeComparator.js";
|
|
8
|
+
import { handleVEAError } from "../../../utils/errors/handleVEAError.js";
|
|
9
|
+
import { alignTex } from "../../../utils/latex/alignTex.js";
|
|
10
|
+
const getHydrated = (identifiers) => {
|
|
11
|
+
const { matIdsA } = identifiers;
|
|
12
|
+
const [matA] = [matIdsA].map((matIds) => MatrixConstructor.fromIdentifiers(matIds));
|
|
13
|
+
return {
|
|
14
|
+
matA,
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
const getInstruction = (identifiers) => {
|
|
18
|
+
const { matA } = getHydrated(identifiers);
|
|
19
|
+
return `Soit :
|
|
20
|
+
|
|
21
|
+
$$
|
|
22
|
+
A = ${matA.toTex()}
|
|
23
|
+
$$
|
|
24
|
+
|
|
25
|
+
Calculer le déterminant de $A$.`;
|
|
26
|
+
};
|
|
27
|
+
const getAnswerNode = (identifiers) => {
|
|
28
|
+
const { matA } = getHydrated(identifiers);
|
|
29
|
+
return matA.determinant();
|
|
30
|
+
};
|
|
31
|
+
const getAnswer = (identifiers) => {
|
|
32
|
+
return getAnswerNode(identifiers)
|
|
33
|
+
.simplify({ towardsDistribute: true })
|
|
34
|
+
.toTex();
|
|
35
|
+
};
|
|
36
|
+
const getHint = () => {
|
|
37
|
+
const matA = new Matrix([
|
|
38
|
+
["a".toTree(), "b".toTree()],
|
|
39
|
+
["c".toTree(), "d".toTree()],
|
|
40
|
+
]);
|
|
41
|
+
return `Soient $A$ une matrice à $2$ lignes et $2$ colonnes à coefficients réels.
|
|
42
|
+
|
|
43
|
+
$$
|
|
44
|
+
A = ${matA.toTex()}
|
|
45
|
+
$$
|
|
46
|
+
|
|
47
|
+
$$
|
|
48
|
+
\\text{det}(A) = \\begin{vmatrix} a & b \\\\ c & d \\end{vmatrix} = ${matA
|
|
49
|
+
.determinant()
|
|
50
|
+
.toTex()}
|
|
51
|
+
$$
|
|
52
|
+
|
|
53
|
+
`;
|
|
54
|
+
};
|
|
55
|
+
const getCorrection = (identifiers) => {
|
|
56
|
+
const { matA } = getHydrated(identifiers);
|
|
57
|
+
return `${alignTex([
|
|
58
|
+
["\\text{det}(A)", "=", matA.toTex().replaceAll("pmatrix", "vmatrix")],
|
|
59
|
+
[
|
|
60
|
+
"",
|
|
61
|
+
"=",
|
|
62
|
+
matA
|
|
63
|
+
.determinant()
|
|
64
|
+
.toTex({ forceNoSimplification: true, forceTimesSign: true }),
|
|
65
|
+
],
|
|
66
|
+
["", "=", matA.determinant().simplify({ towardsDistribute: true }).toTex()],
|
|
67
|
+
])}`;
|
|
68
|
+
};
|
|
69
|
+
const getPropositions = (n, { answer, ...identifiers }) => {
|
|
70
|
+
const propositions = [];
|
|
71
|
+
addValidProp(propositions, answer);
|
|
72
|
+
const { matA } = getHydrated(identifiers);
|
|
73
|
+
//student ad-cb -> ad+cb
|
|
74
|
+
{
|
|
75
|
+
const [[a, b], [c, d]] = matA.elements;
|
|
76
|
+
const detWrong = add(multiply(a, d), multiply(b, c)).simplify({
|
|
77
|
+
towardsDistribute: true,
|
|
78
|
+
});
|
|
79
|
+
tryToAddWrongProp(propositions, detWrong.toTex());
|
|
80
|
+
}
|
|
81
|
+
//filler
|
|
82
|
+
{
|
|
83
|
+
propWhile(propositions, n, () => {
|
|
84
|
+
const identifiersWrong = createRandomIdentifiers();
|
|
85
|
+
tryToAddWrongProp(propositions, getAnswer(identifiersWrong));
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return shuffleProps(propositions, n);
|
|
89
|
+
};
|
|
90
|
+
const getKeys = () => {
|
|
91
|
+
return [];
|
|
92
|
+
};
|
|
93
|
+
const isAnswerValid = (ans, { answer }) => {
|
|
94
|
+
try {
|
|
95
|
+
const nodeAns = parseAlgebraic(ans);
|
|
96
|
+
const nodeAnswer = parseAlgebraic(answer);
|
|
97
|
+
return (NodeComparator.isEqualViaSub(nodeAns, nodeAnswer) ||
|
|
98
|
+
NodeComparator.isEqualViaFrac(nodeAns, nodeAnswer));
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
handleVEAError(e);
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const createRandomIdentifiers = () => {
|
|
106
|
+
const matA = MatrixConstructor.random(2, 2);
|
|
107
|
+
const identifiers = {
|
|
108
|
+
matIdsA: matA.toIdentifiers(),
|
|
109
|
+
};
|
|
110
|
+
return identifiers;
|
|
111
|
+
};
|
|
112
|
+
const getMatrixComputeDetOfMat2Question = () => {
|
|
113
|
+
const identifiers = createRandomIdentifiers();
|
|
114
|
+
return getQuestionFromIdentifiers(identifiers);
|
|
115
|
+
};
|
|
116
|
+
const getQuestionFromIdentifiers = (identifiers, optsIn) => {
|
|
117
|
+
const question = {
|
|
118
|
+
answer: getAnswer(identifiers),
|
|
119
|
+
instruction: getInstruction(identifiers),
|
|
120
|
+
keys: getKeys(identifiers),
|
|
121
|
+
answerFormat: "tex",
|
|
122
|
+
identifiers,
|
|
123
|
+
hint: getHint(identifiers),
|
|
124
|
+
correction: getCorrection(identifiers),
|
|
125
|
+
options: optsIn,
|
|
126
|
+
};
|
|
127
|
+
return question;
|
|
128
|
+
};
|
|
129
|
+
export const matrixComputeDetOfMat2 = {
|
|
130
|
+
id: "matrixComputeDetOfMat2",
|
|
131
|
+
connector: "=",
|
|
132
|
+
label: "Calculer le déterminant d'une matrice carrée d'ordre $2$",
|
|
133
|
+
isSingleStep: true,
|
|
134
|
+
generator: (nb, opts) => getDistinctQuestions(() => getMatrixComputeDetOfMat2Question(opts), nb),
|
|
135
|
+
qcmTimer: 60,
|
|
136
|
+
freeTimer: 60,
|
|
137
|
+
getPropositions,
|
|
138
|
+
isAnswerValid,
|
|
139
|
+
subject: "Mathématiques",
|
|
140
|
+
getQuestionFromIdentifiers,
|
|
141
|
+
hasHintAndCorrection: true,
|
|
142
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Exercise } from "../../../exercises/exercise.js";
|
|
2
|
+
import { MatrixIdentifiers } from "../../../math/matrices/matrix.js";
|
|
3
|
+
type Identifiers = {
|
|
4
|
+
matIdsA: MatrixIdentifiers;
|
|
5
|
+
};
|
|
6
|
+
export declare const matrixComputeInverseOfMat2: Exercise<Identifiers>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=matrixComputeInverseOfMat2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrixComputeInverseOfMat2.d.ts","sourceRoot":"","sources":["../../../../src/exercises/math/matrices/matrixComputeInverseOfMat2.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAgBT,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAGL,iBAAiB,EAClB,MAAM,+BAA+B,CAAC;AAWvC,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,iBAAiB,CAAC;CAC5B,CAAC;AAwPF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,WAAW,CAc5D,CAAC"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { addValidProp, propWhile, shuffleProps, tryToAddWrongProp, } from "../../../exercises/exercise.js";
|
|
2
|
+
import { getDistinctQuestions } from "../../../exercises/utils/getDistinctQuestions.js";
|
|
3
|
+
import { Matrix, MatrixConstructor, } from "../../../math/matrices/matrix.js";
|
|
4
|
+
import { parseMatrix } from "../../../math/matrices/parseMatrix.js";
|
|
5
|
+
import { opposite } from "../../../tree/nodes/functions/oppositeNode.js";
|
|
6
|
+
import { add } from "../../../tree/nodes/operators/addNode.js";
|
|
7
|
+
import { frac } from "../../../tree/nodes/operators/fractionNode.js";
|
|
8
|
+
import { multiply } from "../../../tree/nodes/operators/multiplyNode.js";
|
|
9
|
+
import { NodeComparator } from "../../../tree/utilities/nodeComparator.js";
|
|
10
|
+
import { handleVEAError } from "../../../utils/errors/handleVEAError.js";
|
|
11
|
+
import { alignTex } from "../../../utils/latex/alignTex.js";
|
|
12
|
+
const getHydrated = (identifiers) => {
|
|
13
|
+
const { matIdsA } = identifiers;
|
|
14
|
+
const [matA] = [matIdsA].map((matIds) => MatrixConstructor.fromIdentifiers(matIds));
|
|
15
|
+
return {
|
|
16
|
+
matA,
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
const getInstruction = (identifiers) => {
|
|
20
|
+
const { matA } = getHydrated(identifiers);
|
|
21
|
+
return `Soit :
|
|
22
|
+
|
|
23
|
+
$$
|
|
24
|
+
A = ${matA.toTex()}
|
|
25
|
+
$$
|
|
26
|
+
|
|
27
|
+
Déterminer l'inverse de $A$.`;
|
|
28
|
+
};
|
|
29
|
+
const getAnswer = (identifiers) => {
|
|
30
|
+
const { matA } = getHydrated(identifiers);
|
|
31
|
+
const matInverse = matA.inverse();
|
|
32
|
+
return matInverse
|
|
33
|
+
? matInverse.simplify({ towardsDistribute: true }).toTex()
|
|
34
|
+
: "A\\text{ n'est pas inversible}";
|
|
35
|
+
};
|
|
36
|
+
const getHint = () => {
|
|
37
|
+
const matA = new Matrix([
|
|
38
|
+
["a".toTree(), "b".toTree()],
|
|
39
|
+
["c".toTree(), "d".toTree()],
|
|
40
|
+
]);
|
|
41
|
+
return `Soient $A$ une matrice à $2$ lignes et $2$ colonnes à coefficients réels.
|
|
42
|
+
|
|
43
|
+
$$
|
|
44
|
+
A = ${matA.toTex()}
|
|
45
|
+
$$
|
|
46
|
+
|
|
47
|
+
$$
|
|
48
|
+
\\text{det}(A) = \\begin{vmatrix} a & b \\\\ c & d \\end{vmatrix} = ${matA
|
|
49
|
+
.determinant()
|
|
50
|
+
.toTex()}
|
|
51
|
+
$$
|
|
52
|
+
|
|
53
|
+
Si $\\text{det}(A) \\neq 0$ alors $A$ est inversible et
|
|
54
|
+
|
|
55
|
+
$$
|
|
56
|
+
A^{-1} = \\frac{1}{\\text{det}(A)} \\begin{pmatrix} d & -b \\\\ -c & a \\end{pmatrix}
|
|
57
|
+
$$
|
|
58
|
+
|
|
59
|
+
Sinon, $A$ n'a pas d'inverse.
|
|
60
|
+
|
|
61
|
+
`;
|
|
62
|
+
};
|
|
63
|
+
const getCorrection = (identifiers) => {
|
|
64
|
+
const { matA } = getHydrated(identifiers);
|
|
65
|
+
const [[a, b], [c, d]] = matA.elements;
|
|
66
|
+
const nodeDet = matA.determinant();
|
|
67
|
+
const matAForFormula = new Matrix([
|
|
68
|
+
["a".toTree(), "b".toTree()],
|
|
69
|
+
["c".toTree(), "d".toTree()],
|
|
70
|
+
]);
|
|
71
|
+
return `On commence par calculer le déterminant de $A$ :
|
|
72
|
+
|
|
73
|
+
${alignTex([
|
|
74
|
+
["\\text{det}(A)", "=", matA.toTex().replaceAll("pmatrix", "vmatrix")],
|
|
75
|
+
[
|
|
76
|
+
"",
|
|
77
|
+
"=",
|
|
78
|
+
nodeDet.toTex({ forceNoSimplification: true, forceTimesSign: true }),
|
|
79
|
+
],
|
|
80
|
+
["", "=", nodeDet.simplify({ towardsDistribute: true }).toTex()],
|
|
81
|
+
])}
|
|
82
|
+
|
|
83
|
+
${(() => {
|
|
84
|
+
if (NodeComparator.isEqualViaSub(nodeDet, (0).toTree())) {
|
|
85
|
+
return `Le déterminant vaut $0$ : La matrice $A$ n'est donc pas inversible.`;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
return `Le déterminant n'est pas nul : La matrice $A$ est donc inversible.
|
|
89
|
+
|
|
90
|
+
Pour une matrice carrée d'ordre $2$, il existe une formule pour calculer l'inverse.
|
|
91
|
+
|
|
92
|
+
En posant:
|
|
93
|
+
|
|
94
|
+
$$
|
|
95
|
+
A = ${matAForFormula.toTex()}
|
|
96
|
+
$$
|
|
97
|
+
|
|
98
|
+
${alignTex([
|
|
99
|
+
[
|
|
100
|
+
"A^{-1}",
|
|
101
|
+
"=",
|
|
102
|
+
"\\frac{1}{\\text{det}(A)} \\begin{pmatrix} d & -b \\\\ -c & a \\end{pmatrix}",
|
|
103
|
+
],
|
|
104
|
+
])}
|
|
105
|
+
|
|
106
|
+
Ici, on a donc :
|
|
107
|
+
|
|
108
|
+
${alignTex([
|
|
109
|
+
[
|
|
110
|
+
"A^{-1}",
|
|
111
|
+
"=",
|
|
112
|
+
`\\frac{1}{${nodeDet
|
|
113
|
+
.simplify({
|
|
114
|
+
towardsDistribute: true,
|
|
115
|
+
})
|
|
116
|
+
.toTex()}} \\begin{pmatrix} ${d.toTex()} & ${opposite(b)
|
|
117
|
+
.simplify()
|
|
118
|
+
.toTex()} \\\\ ${opposite(c)
|
|
119
|
+
.simplify()
|
|
120
|
+
.toTex()} & ${a.toTex()} \\end{pmatrix}`,
|
|
121
|
+
],
|
|
122
|
+
["", "=", matA.inverse().simplify({ towardsDistribute: true }).toTex()],
|
|
123
|
+
])}
|
|
124
|
+
|
|
125
|
+
`;
|
|
126
|
+
}
|
|
127
|
+
})()}
|
|
128
|
+
|
|
129
|
+
`;
|
|
130
|
+
};
|
|
131
|
+
const getPropositions = (n, { answer, ...identifiers }) => {
|
|
132
|
+
const propositions = [];
|
|
133
|
+
addValidProp(propositions, answer);
|
|
134
|
+
//impossible
|
|
135
|
+
{
|
|
136
|
+
const texImpossible = "A\\text{ n'est pas inversible}";
|
|
137
|
+
tryToAddWrongProp(propositions, texImpossible);
|
|
138
|
+
}
|
|
139
|
+
const { matA } = getHydrated(identifiers);
|
|
140
|
+
//student A^{-1} -> tA
|
|
141
|
+
{
|
|
142
|
+
const matWrong = matA.transposed();
|
|
143
|
+
tryToAddWrongProp(propositions, matWrong.toTex());
|
|
144
|
+
}
|
|
145
|
+
//student ad-cb -> ad+cb
|
|
146
|
+
{
|
|
147
|
+
const [[a, b], [c, d]] = matA.elements;
|
|
148
|
+
const detWrong = add(multiply(a, d), multiply(b, c)).simplify({
|
|
149
|
+
towardsDistribute: true,
|
|
150
|
+
});
|
|
151
|
+
if (NodeComparator.isEqualViaSub(detWrong, (0).toTree())) {
|
|
152
|
+
//ignore
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
const matWrong = new Matrix([
|
|
156
|
+
[d, opposite(b)],
|
|
157
|
+
[opposite(c), a],
|
|
158
|
+
]).times(frac(1, detWrong));
|
|
159
|
+
tryToAddWrongProp(propositions, matWrong.simplify({ towardsDistribute: true }).toTex());
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//filler
|
|
163
|
+
{
|
|
164
|
+
propWhile(propositions, n, () => {
|
|
165
|
+
const identifiersWrong = createRandomIdentifiers();
|
|
166
|
+
tryToAddWrongProp(propositions, getAnswer(identifiersWrong));
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
return shuffleProps(propositions, n);
|
|
170
|
+
};
|
|
171
|
+
const getKeys = () => {
|
|
172
|
+
return [
|
|
173
|
+
{
|
|
174
|
+
id: "custom",
|
|
175
|
+
label: "A\\text{ n'est pas inversible}",
|
|
176
|
+
labelType: "tex",
|
|
177
|
+
mathfieldInstructions: {
|
|
178
|
+
content: "A\\text{ n'est pas inversible}",
|
|
179
|
+
method: "write",
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
];
|
|
183
|
+
};
|
|
184
|
+
const isAnswerValid = (ans, { answer }) => {
|
|
185
|
+
if (answer === "A\\text{ n'est pas inversible}") {
|
|
186
|
+
return ans === answer;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
try {
|
|
190
|
+
const matAns = parseMatrix(ans);
|
|
191
|
+
const matAnswer = parseMatrix(answer);
|
|
192
|
+
return matAns.equals(matAnswer);
|
|
193
|
+
}
|
|
194
|
+
catch (e) {
|
|
195
|
+
handleVEAError(e);
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
const createRandomIdentifiers = () => {
|
|
201
|
+
const matA = MatrixConstructor.random(2, 2);
|
|
202
|
+
const identifiers = {
|
|
203
|
+
matIdsA: matA.toIdentifiers(),
|
|
204
|
+
};
|
|
205
|
+
return identifiers;
|
|
206
|
+
};
|
|
207
|
+
const getMatrixComputeInverseOfMat2Question = () => {
|
|
208
|
+
const identifiers = createRandomIdentifiers();
|
|
209
|
+
return getQuestionFromIdentifiers(identifiers);
|
|
210
|
+
};
|
|
211
|
+
const getQuestionFromIdentifiers = (identifiers, optsIn) => {
|
|
212
|
+
const question = {
|
|
213
|
+
answer: getAnswer(identifiers),
|
|
214
|
+
instruction: getInstruction(identifiers),
|
|
215
|
+
keys: getKeys(identifiers),
|
|
216
|
+
answerFormat: "tex",
|
|
217
|
+
identifiers,
|
|
218
|
+
hint: getHint(identifiers),
|
|
219
|
+
correction: getCorrection(identifiers),
|
|
220
|
+
options: optsIn,
|
|
221
|
+
};
|
|
222
|
+
return question;
|
|
223
|
+
};
|
|
224
|
+
export const matrixComputeInverseOfMat2 = {
|
|
225
|
+
id: "matrixComputeInverseOfMat2",
|
|
226
|
+
connector: "=",
|
|
227
|
+
label: "Calculer l'inverse d'une matrice carrée d'ordre $2$",
|
|
228
|
+
isSingleStep: true,
|
|
229
|
+
generator: (nb, opts) => getDistinctQuestions(() => getMatrixComputeInverseOfMat2Question(opts), nb),
|
|
230
|
+
qcmTimer: 60,
|
|
231
|
+
freeTimer: 60,
|
|
232
|
+
getPropositions,
|
|
233
|
+
isAnswerValid,
|
|
234
|
+
subject: "Mathématiques",
|
|
235
|
+
getQuestionFromIdentifiers,
|
|
236
|
+
hasHintAndCorrection: true,
|
|
237
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Exercise } from "../../../exercises/exercise.js";
|
|
2
|
+
import { MatrixIdentifiers } from "../../../math/matrices/matrix.js";
|
|
3
|
+
import { NodeIdentifiers } from "../../../tree/nodes/nodeConstructor.js";
|
|
4
|
+
type Identifiers = {
|
|
5
|
+
matIdsA: MatrixIdentifiers;
|
|
6
|
+
matIdsB: MatrixIdentifiers;
|
|
7
|
+
nodeIdsKA: NodeIdentifiers;
|
|
8
|
+
nodeIdsKB: NodeIdentifiers;
|
|
9
|
+
};
|
|
10
|
+
type Options = {
|
|
11
|
+
typeLinComb: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const matrixComputeLinearCombination: Exercise<Identifiers, Options>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=matrixComputeLinearCombination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrixComputeLinearCombination.d.ts","sourceRoot":"","sources":["../../../../src/exercises/math/matrices/matrixComputeLinearCombination.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAmBT,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAGL,iBAAiB,EAClB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAEL,eAAe,EAChB,MAAM,qCAAqC,CAAC;AAU7C,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,SAAS,EAAE,eAAe,CAAC;CAC5B,CAAC;AA8PF,KAAK,OAAO,GAAG;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAgBF,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAkBzE,CAAC"}
|