// Numbas version: finer_feedback_settings {"name": "Characteristic poly, eigenvalues and eigenvectors 3x3, digonailsability (non-randomised)", "extensions": ["linear-algebra", "linalg2"], "custom_part_types": [{"source": {"pk": 2, "author": {"name": "Christian Lawson-Perfect", "pk": 7}, "edit_page": "/part_type/2/edit"}, "name": "List of numbers", "short_name": "list-of-numbers", "description": "

The answer is a comma-separated list of numbers.

\n

The list is marked correct if each number occurs the same number of times as in the expected answer, and no extra numbers are present.

\n

You can optionally treat the answer as a set, so the number of occurrences doesn't matter, only whether each number is included or not.

", "help_url": "", "input_widget": "string", "input_options": {"correctAnswer": "join(\n if(settings[\"correctAnswerFractions\"],\n map(let([a,b],rational_approximation(x), string(a/b)),x,settings[\"correctAnswer\"])\n ,\n settings[\"correctAnswer\"]\n ),\n settings[\"separator\"] + \" \"\n)", "hint": {"static": false, "value": "if(settings[\"show_input_hint\"],\n \"Enter a list of numbers separated by {settings['separator']}.\",\n \"\"\n)"}, "allowEmpty": {"static": true, "value": true}}, "can_be_gap": true, "can_be_step": true, "marking_script": "bits:\nlet(b,filter(x<>\"\",x,split(studentAnswer,settings[\"separator\"])),\n if(isSet,list(set(b)),b)\n)\n\nexpected_numbers:\nlet(l,settings[\"correctAnswer\"] as \"list\",\n if(isSet,list(set(l)),l)\n)\n\nvalid_numbers:\nif(all(map(not isnan(x),x,interpreted_answer)),\n true,\n let(index,filter(isnan(interpreted_answer[x]),x,0..len(interpreted_answer)-1)[0], wrong, bits[index],\n warn(wrong+\" is not a valid number\");\n fail(wrong+\" is not a valid number.\")\n )\n )\n\nis_sorted:\nassert(sort(interpreted_answer)=interpreted_answer,\n multiply_credit(0.5,\"Not in order\")\n )\n\nincluded:\nmap(\n let(\n num_student,len(filter(x=y,y,interpreted_answer)),\n num_expected,len(filter(x=y,y,expected_numbers)),\n switch(\n num_student=num_expected,\n true,\n num_studentThe separate items in the student's answer

", "definition": "let(b,filter(x<>\"\",x,split(studentAnswer,settings[\"separator\"])),\n if(isSet,list(set(b)),b)\n)"}, {"name": "expected_numbers", "description": "", "definition": "let(l,settings[\"correctAnswer\"] as \"list\",\n if(isSet,list(set(l)),l)\n)"}, {"name": "valid_numbers", "description": "

Is every number in the student's list valid?

", "definition": "if(all(map(not isnan(x),x,interpreted_answer)),\n true,\n let(index,filter(isnan(interpreted_answer[x]),x,0..len(interpreted_answer)-1)[0], wrong, bits[index],\n warn(wrong+\" is not a valid number\");\n fail(wrong+\" is not a valid number.\")\n )\n )"}, {"name": "is_sorted", "description": "

Are the student's answers in ascending order?

", "definition": "assert(sort(interpreted_answer)=interpreted_answer,\n multiply_credit(0.5,\"Not in order\")\n )"}, {"name": "included", "description": "

Is each number in the expected answer present in the student's list the correct number of times?

", "definition": "map(\n let(\n num_student,len(filter(x=y,y,interpreted_answer)),\n num_expected,len(filter(x=y,y,expected_numbers)),\n switch(\n num_student=num_expected,\n true,\n num_studentHas every number been included the right number of times?

", "definition": "all(included)"}, {"name": "no_extras", "description": "

True if the student's list doesn't contain any numbers that aren't in the expected answer.

", "definition": "if(all(map(x in expected_numbers, x, interpreted_answer)),\n true\n ,\n incorrect(\"Your answer contains \"+extra_numbers[0]+\" but should not.\");\n false\n )"}, {"name": "interpreted_answer", "description": "A value representing the student's answer to this part.", "definition": "if(lower(studentAnswer) in [\"empty\",\"\u2205\"],[],\n map(\n if(settings[\"allowFractions\"],parsenumber_or_fraction(x,notationStyles), parsenumber(x,notationStyles))\n ,x\n ,bits\n )\n)"}, {"name": "mark", "description": "This is the main marking note. It should award credit and provide feedback based on the student's answer.", "definition": "if(studentanswer=\"\",fail(\"You have not entered an answer\"),false);\napply(valid_numbers);\napply(included);\napply(no_extras);\ncorrectif(all_included and no_extras)"}, {"name": "notationStyles", "description": "", "definition": "[\"en\"]"}, {"name": "isSet", "description": "

Should the answer be considered as a set, so the number of times an element occurs doesn't matter?

", "definition": "settings[\"isSet\"]"}, {"name": "extra_numbers", "description": "

Numbers included in the student's answer that are not in the expected list.

", "definition": "filter(not (x in expected_numbers),x,interpreted_answer)"}], "settings": [{"name": "correctAnswer", "label": "Correct answer", "help_url": "", "hint": "The list of numbers that the student should enter. The order does not matter.", "input_type": "code", "default_value": "", "evaluate": true}, {"name": "allowFractions", "label": "Allow the student to enter fractions?", "help_url": "", "hint": "", "input_type": "checkbox", "default_value": false}, {"name": "correctAnswerFractions", "label": "Display the correct answers as fractions?", "help_url": "", "hint": "", "input_type": "checkbox", "default_value": false}, {"name": "isSet", "label": "Is the answer a set?", "help_url": "", "hint": "If ticked, the number of times an element occurs doesn't matter, only whether it's included at all.", "input_type": "checkbox", "default_value": false}, {"name": "show_input_hint", "label": "Show the input hint?", "help_url": "", "hint": "", "input_type": "checkbox", "default_value": true}, {"name": "separator", "label": "Separator", "help_url": "", "hint": "The substring that should separate items in the student's list", "input_type": "string", "default_value": ",", "subvars": false}], "public_availability": "always", "published": true, "extensions": []}], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "question_groups": [{"pickingStrategy": "all-ordered", "questions": [{"name": "Characteristic poly, eigenvalues and eigenvectors 3x3, digonailsability (non-randomised)", "tags": ["characteristic polynomial", "eigenvalues", "Eigenvalues", "Eigenvectors", "eigenvectors", "explore mode", "Linear algebra", "Linear Algebra", "linear algebra"], "metadata": {"description": "

Example of an explore mode question. Student is given a 3x3 matrix and is asked to find the characteristic polynomial and eigenvalues, and then eigenvectors for each eigenvalue. The part asking for eigenvectors can be repeated as often as the student wants, to be used for different eigenvalues.

\n

Assessed: calculating characteristic polynomial and eigenvectors.

\n

Feature: any correct eigenvalue will be recognised by the marking algorithm, even multiples of the obvious one(s) (which can be read off from the reduced row echelon form)

\n

Randomisation: Not randomised, just using particular matrices. I am still working on how to randomise this for 3x3; a randomised 2x2 version exists. I have several different versions for 3x3 (not all published yet), so I could make a random choice between these in a test.

\n

The implementation uses linear algebra functions such as \"find reduced echelon form\" or \"find kernel of a reduced echelon form\", from the extension \"linalg2\".

", "licence": "Creative Commons Attribution 4.0 International"}, "statement": "

Find the characteristic polynomial, eigenvalues and eigenvectors (bases for eigenspaces) for the matrix \\(\\var{matrixA}\\). Decide whether the matrix is diagonalisable.  

", "advice": "

The characteristic polynomial of \\(A\\) is defined as \\(\\chi_A(t)=\\det(tI-A)\\). So in this case you should calculate

\n

\\(\\begin{vmatrix} \\simplify{t-{matrixA[0][0]}} & \\var{-matrixA[0][1]} & \\var{-matrixA[0][2]} \\\\ \\var{-matrixA[1][0]} & \\simplify{t-{matrixA[1][1]}} & \\var{-matrixA[1][2]}\\\\ \\var{-matrixA[2][0]} & \\var{-matrixA[2][1]} & \\simplify{t-{matrixA[2][2]}} \\end{vmatrix}=(\\simplify{t-{matrixA[0][0]}})\\begin{vmatrix}  \\simplify{t-{matrixA[1][1]}} & \\var{-matrixA[1][2]}\\\\  \\var{-matrixA[2][1]} & \\simplify{t-{matrixA[2][2]}} \\end{vmatrix}=\\simplify[]{(t-{matrixA[0][0]})((t-{matrixA[1][1]})(t-{matrixA[2][2]})-{matrixA[1][2]*matrixA[2][1]})}= \\var{chiA}=\\var{chiAexpanded}\\).

\n

Here we first expanded the determinant in the first column, and then we used the formula for the determinant a \\(2\\times 2\\) matrix in the last step: \\( \\begin{vmatrix}a&b\\\\c&d\\end{vmatrix}=ad-bc\\).

\n

The eigenvalues are exactly the roots of the characteristic polynomial. So the eigenvalues of \\(A\\) are \\(\\var{a}\\), \\(\\var{b}\\) and \\(\\var{c}\\).

\n

To calculate the eigenvectors for a given eigenvalues \\(\\lambda\\), we calculate the kernel of \\(A-\\lambda I\\). So, for

\n

\\(\\lambda=\\var{a}\\), we calculate the kernel of \\(\\var{matrixA-a*id(n)}\\). The reduced row echelon form is \\(\\var[fractionNumbers]{RREFa}\\). So the eigenvector for \\(\\lambda=\\var{a}\\) is

\n

\\(\\var[fractionNumbers]{v1}\\) (or any multiple of this).

\n

And for \\(\\lambda=\\var{b}\\), the reduced row echelon form of \\(\\var{matrixA-b*id(n)}\\) is \\(\\var[fractionNumbers]{RREFb}\\), and the eigenvector is \\(\\var[fractionNumbers]{v2}\\) (or any multiple).

\n

And for \\(\\lambda=\\var{c}\\), the reduced row echelon form of \\(\\var{matrixA-c*id(n)}\\) is \\(\\var[fractionNumbers]{RREFc}\\), and the eigenvector is \\(\\var[fractionNumbers]{v3}\\) (or any multiple).

Recall that the algebraic multiplicity of an eigenvalue is it multiplicity as a root of the characteristic polynomial. Then, it is clear that all the eigenvalues of \\(A\\) has albegraic multiplicity \\(1\\).

\n

\n

Also, recall that the geometric multiplicity of an eigenvalue \\(\\lambda\\) is the dimension of the subspace genereted by eigenvectors associated to \\(\\lambda\\). Observe that here every eigenvalue has geometric multiplicty \\(1\\). Therefore, for every eigenvalue, its algebraic and geoemtric multiplicities are eqaul. That implies \\(A\\) is diagonalisable. 

", "rulesets": {}, "extensions": ["linalg2", "linear-algebra"], "builtin_constants": {"e": true, "pi,\u03c0": true, "i": true, "j": false}, "constants": [], "variables": {"matrixA": {"name": "matrixA", "group": "Ungrouped variables", "definition": "matrix([5,1,3],[0,-1,0],[0,1,2])", "description": "", "templateType": "anything", "can_override": false}, "a": {"name": "a", "group": "Ungrouped variables", "definition": "-1", "description": "", "templateType": "anything", "can_override": false}, "b": {"name": "b", "group": "Ungrouped variables", "definition": "2", "description": "", "templateType": "anything", "can_override": false}, "chiA": {"name": "chiA", "group": "Ungrouped variables", "definition": "simplify(expression(\"(t-{a})*(t-{b})*(t-{c})\"),\"all\")", "description": "", "templateType": "anything", "can_override": false}, "v1": {"name": "v1", "group": "Ungrouped variables", "definition": "transpose(matrix(le_kernel(RREFa)))", "description": "", "templateType": "anything", "can_override": false}, "v2": {"name": "v2", "group": "Ungrouped variables", "definition": "transpose(matrix(le_kernel(RREFb)))", "description": "", "templateType": "anything", "can_override": false}, "RREFa": {"name": "RREFa", "group": "Ungrouped variables", "definition": "matrix(le_red_echelon(matrixA-a*id(n)))", "description": "", "templateType": "anything", "can_override": false}, "RREFb": {"name": "RREFb", "group": "Ungrouped variables", "definition": "matrix(le_red_echelon(matrixA-b*id(n)))", "description": "", "templateType": "anything", "can_override": false}, "n": {"name": "n", "group": "Ungrouped variables", "definition": "3", "description": "", "templateType": "anything", "can_override": false}, "c": {"name": "c", "group": "Ungrouped variables", "definition": "5", "description": "", "templateType": "anything", "can_override": false}, "RREFc": {"name": "RREFc", "group": "Ungrouped variables", "definition": "matrix(le_red_echelon(matrixA-c*id(n)))", "description": "", "templateType": "anything", "can_override": false}, "v3": {"name": "v3", "group": "Ungrouped variables", "definition": "transpose(matrix(le_kernel(RREFc)))", "description": "", "templateType": "anything", "can_override": false}, "chiAexpanded": {"name": "chiAexpanded", "group": "Ungrouped variables", "definition": "simplify(expression(\"(t-{a})*(t-{b})*(t-{c})\"),[\"all\",\"expandBrackets\"])", "description": "", "templateType": "anything", "can_override": false}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["matrixA", "a", "b", "c", "chiA", "v1", "v2", "v3", "RREFa", "RREFb", "RREFc", "n", "chiAexpanded"], "variable_groups": [], "functions": {}, "preamble": {"js": "", "css": ""}, "parts": [{"type": "gapfill", "useCustomName": true, "customName": "Char poly", "marks": 0, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [{"label": "evectors", "rawLabel": "", "otherPart": 1, "variableReplacements": [], "availabilityCondition": "", "penalty": "", "penaltyAmount": 0, "showPenaltyHint": true, "lockAfterLeaving": false}], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "

characteristic polynomial \\(\\chi_A(t)= \\) [[0]]

\n

The eigenvalues of \\(A\\) are (in any order): [[1]]

\n

", "gaps": [{"type": "jme", "useCustomName": true, "customName": "char_A", "marks": 1, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": "char_A", "answer": "{chiA}", "showPreview": true, "checkingType": "absdiff", "checkingAccuracy": 0.001, "failureRate": 1, "vsetRangePoints": 5, "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "valuegenerators": []}, {"type": "list-of-numbers", "useCustomName": true, "customName": "evals", "marks": 1, "scripts": {}, "customMarkingAlgorithm": "included:\nmap(\n let(\n num_student,len(filter(x=y,y,interpreted_answer)),\n num_expected,len(filter(x=y,y,expected_numbers)),\n switch(\n num_student=num_expected,\n true,\n num_studentNow choose one of the eigenvalues of \\(A\\): [[0]]

\n

and enter the corresponding eigenvector(s).

\n

Enter a basis for the relevant eigenspace of \\(A\\), i.e. a linearly independent set of eigenvectors for your chosen eigenvalue, as the columns of a matrix. E.g. if there is only one eigenvector, select \"1 column\" and enter the vector. If there are two, select \"2 columns\" and enter the first vector in the first column and the second vector in the second column, etc. This way you can determine how many eigenvectors there are.

\n

[[1]]

", "gaps": [{"type": "numberentry", "useCustomName": false, "customName": "", "marks": "0", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": false, "showFeedbackIcon": false, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "minValue": "a", "maxValue": "a", "correctAnswerFraction": false, "allowFractions": true, "mustBeReduced": false, "mustBeReducedPC": 0, "displayAnswer": "", "showFractionHint": true, "notationStyles": ["plain", "en", "si-en"], "correctAnswerStyle": "plain"}, {"type": "matrix", "useCustomName": false, "customName": "", "marks": 1, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": false, "showFeedbackIcon": false, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "correctAnswer": "v1", "correctAnswerFractions": false, "numRows": 1, "numColumns": 1, "allowResize": true, "tolerance": 0, "markPerCell": false, "allowFractions": true, "minColumns": 1, "maxColumns": 0, "minRows": 1, "maxRows": 0, "prefilledCells": ""}], "sortAnswers": false}, {"type": "1_n_2", "useCustomName": true, "customName": "Diagonalisability", "marks": 0, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "

Is \\(A\\) diagonalisable? 

", "minMarks": 0, "maxMarks": 0, "shuffleChoices": false, "displayType": "radiogroup", "displayColumns": 0, "showCellAnswerState": true, "choices": ["Yes", "No"], "matrix": ["1", 0], "distractors": ["", ""]}], "partsMode": "explore", "maxMarks": 0, "objectives": [], "penalties": [], "objectiveVisibility": "always", "penaltyVisibility": "always", "contributors": [{"name": "Julia Goedecke", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/5121/"}, {"name": "Ugur Efem", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/18261/"}]}]}], "contributors": [{"name": "Julia Goedecke", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/5121/"}, {"name": "Ugur Efem", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/18261/"}]}