// Numbas version: exam_results_page_options {"name": "V-M 5: Symmetric parabolic loading", "extensions": ["geogebra", "polynomials", "quantities"], "custom_part_types": [{"source": {"pk": 19, "author": {"name": "William Haynes", "pk": 2530}, "edit_page": "/part_type/19/edit"}, "name": "Engineering Accuracy with units", "short_name": "engineering-answer", "description": "

A value with units marked right if within an adjustable % error of the correct value.  Marked close if within a wider margin of error.

", "help_url": "", "input_widget": "string", "input_options": {"correctAnswer": "siground(settings['correctAnswer'],4)", "hint": {"static": true, "value": ""}, "allowEmpty": {"static": true, "value": true}}, "can_be_gap": true, "can_be_step": true, "marking_script": "mark:\nswitch( \n right and good_units and right_sign, add_credit(1.0,'Correct.'),\n right and good_units and not right_sign, add_credit(settings['C2'],'Wrong sign.'),\n right and right_sign and not good_units, add_credit(settings['C2'],'Correct value, but wrong or missing units.'),\n close and good_units, add_credit(settings['C1'],'Close.'),\n close and not good_units, add_credit(settings['C3'],'Answer is close, but wrong or missing units.'),\n incorrect('Wrong answer.')\n)\n\n\ninterpreted_answer:\nqty(student_scalar, student_units)\n\n\n\ncorrect_quantity:\nsettings[\"correctAnswer\"]\n\n\n\ncorrect_units:\nunits(correct_quantity)\n\n\nallowed_notation_styles:\n[\"plain\",\"en\"]\n\nmatch_student_number:\nmatchnumber(studentAnswer,allowed_notation_styles)\n\nstudent_scalar:\nmatch_student_number[1]\n\nstudent_units:\nreplace_regex('ohms','ohm',\n replace_regex('\u00b0', ' deg',\n replace_regex('-', ' ' ,\n studentAnswer[len(match_student_number[0])..len(studentAnswer)])),\"i\")\n\ngood_units:\ntry(\ncompatible(quantity(1, student_units),correct_units),\nmsg,\nfeedback(msg);false)\n\n\nstudent_quantity:\nswitch(not good_units, \n student_scalar * correct_units, \n not right_sign,\n -quantity(student_scalar, student_units),\n quantity(student_scalar,student_units)\n)\n \n\n\npercent_error:\ntry(\nscalar(abs((correct_quantity - student_quantity)/correct_quantity))*100 \n,msg,\nif(student_quantity=correct_quantity,0,100))\n \n\nright:\npercent_error <= settings['right']\n\n\nclose:\nright_sign and percent_error <= settings['close']\n\nright_sign:\nsign(student_scalar) = sign(correct_quantity)", "marking_notes": [{"name": "mark", "description": "This is the main marking note. It should award credit and provide feedback based on the student's answer.", "definition": "switch( \n right and good_units and right_sign, add_credit(1.0,'Correct.'),\n right and good_units and not right_sign, add_credit(settings['C2'],'Wrong sign.'),\n right and right_sign and not good_units, add_credit(settings['C2'],'Correct value, but wrong or missing units.'),\n close and good_units, add_credit(settings['C1'],'Close.'),\n close and not good_units, add_credit(settings['C3'],'Answer is close, but wrong or missing units.'),\n incorrect('Wrong answer.')\n)\n"}, {"name": "interpreted_answer", "description": "A value representing the student's answer to this part.", "definition": "qty(student_scalar, student_units)\n\n"}, {"name": "correct_quantity", "description": "", "definition": "settings[\"correctAnswer\"]\n\n"}, {"name": "correct_units", "description": "", "definition": "units(correct_quantity)\n"}, {"name": "allowed_notation_styles", "description": "", "definition": "[\"plain\",\"en\"]"}, {"name": "match_student_number", "description": "", "definition": "matchnumber(studentAnswer,allowed_notation_styles)"}, {"name": "student_scalar", "description": "", "definition": "match_student_number[1]"}, {"name": "student_units", "description": "

Modify the unit portion of the student's answer by

\n

1. replacing \"ohms\" with \"ohm\"  case insensitive

\n

2. replacing '-' with ' ' 

\n

3. replacing '°' with ' deg' 

\n

to allow answers like 10 ft-lb and 30°

", "definition": "replace_regex('ohms','ohm',\n replace_regex('\u00b0', ' deg',\n replace_regex('-', ' ' ,\n studentAnswer[len(match_student_number[0])..len(studentAnswer)])),\"i\")"}, {"name": "good_units", "description": "", "definition": "try(\ncompatible(quantity(1, student_units),correct_units),\nmsg,\nfeedback(msg);false)\n"}, {"name": "student_quantity", "description": "

This fixes the student answer for two common errors.  

\n

If student_units are wrong  - replace with correct units

\n

If student_scalar has the wrong sign - replace with right sign

\n

If student makes both errors, only one gets fixed.

", "definition": "switch(not good_units, \n student_scalar * correct_units, \n not right_sign,\n -quantity(student_scalar, student_units),\n quantity(student_scalar,student_units)\n)\n \n"}, {"name": "percent_error", "description": "", "definition": "try(\nscalar(abs((correct_quantity - student_quantity)/correct_quantity))*100 \n,msg,\nif(student_quantity=correct_quantity,0,100))\n "}, {"name": "right", "description": "", "definition": "percent_error <= settings['right']\n"}, {"name": "close", "description": "

Only marked close if the student actually has the right sign.

", "definition": "right_sign and percent_error <= settings['close']"}, {"name": "right_sign", "description": "", "definition": "sign(student_scalar) = sign(correct_quantity) "}], "settings": [{"name": "correctAnswer", "label": "Correct Quantity.", "help_url": "", "hint": "The correct answer given as a JME quantity.", "input_type": "code", "default_value": "", "evaluate": true}, {"name": "right", "label": "% Accuracy for right.", "help_url": "", "hint": "Question will be considered correct if the scalar part of the student's answer is within this % of correct value.", "input_type": "code", "default_value": "0.2", "evaluate": true}, {"name": "close", "label": "% Accuracy for close.", "help_url": "", "hint": "Question will be considered close if the scalar part of the student's answer is within this % of correct value.", "input_type": "code", "default_value": "1.0", "evaluate": true}, {"name": "C1", "label": "Close with units.", "help_url": "", "hint": "Partial Credit for close value with appropriate units.  if correct answer is 100 N and close is ±1%,
99  N is accepted.", "input_type": "percent", "default_value": "75"}, {"name": "C2", "label": "No units or wrong sign", "help_url": "", "hint": "Partial credit for forgetting units or using wrong sign.
If the correct answer is 100 N, both 100 and -100 N are accepted.", "input_type": "percent", "default_value": "50"}, {"name": "C3", "label": "Close, no units.", "help_url": "", "hint": "Partial Credit for close value but forgotten units.
This value would be close if the expected units were provided.  If the correct answer is 100 N, and close is ±1%,
99 is accepted.", "input_type": "percent", "default_value": "25"}], "public_availability": "always", "published": true, "extensions": ["quantities"]}], "resources": [["question-resources/newVM_cA1Sig0.ggb", "/srv/numbas/media/question-resources/newVM_cA1Sig0.ggb"]], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "question_groups": [{"pickingStrategy": "all-ordered", "questions": [{"name": "V-M 5: Symmetric parabolic loading", "tags": ["gets answer from ggb", "Mechanics", "mechanics", "shear and bending moment", "Statics", "statics"], "metadata": {"description": "Shear and bending moment diagram for a beam loaded with a parabolic distributed load described with a loading function.", "licence": "Creative Commons Attribution-NonCommercial 4.0 International"}, "statement": "

to do: use the show_curves(applet)  javascript function when Step 2 is shown to show V and M curves.  With the procedure shown in the steps, the advice section is redundant. Diagram sometimes doesn't load properly.  Need to change the ggb applet to the one contained in Arbitrary Parabolic Loading.

\n

A {qty(2b, units[0])} long, simply-supported beam is subjected to a symmetrical parabolic loading, where

\n

$w\\!(x) =\\simplify[fractionNumbers]{{w}}$    [{units[1]}/{units[0]}].

\n

{applet}

\n

", "advice": "

Given $w(x)$ and beam length $L$,

\n

1.  Find load $W= \\int_0^L w(x)\\; dx$

\n

2.  By symmetry, the reactions are half the load.  $ A = B = W/2$

\n

3.  Integrate $V(x) = \\int w(x)\\; dx$ to get the shear function.

\n

Maximum shear occurs at the ends, where $d V /d x = -w(x) = 0$

\n

$V_{max} = V(0)$

\n

4.  Integrate $M(x) = \\int V(x)\\; dx$ to get moment function.  

\n

Maximum moment occurs at midpoint, where $dM/dx = V = 0$

\n

$M_{max} = M(\\var{b})$

\n

Don't forget to evaluate the constant of integration when deriving the shear and bending moment functions.

\n

\n

", "rulesets": {}, "extensions": ["geogebra", "polynomials", "quantities"], "builtin_constants": {"e": true, "pi,\u03c0": true, "i": true}, "constants": [], "variables": {"units": {"name": "units", "group": "Ungrouped variables", "definition": "random(['ft','lb'],['m','kN'])", "description": "", "templateType": "anything", "can_override": false}, "applet": {"name": "applet", "group": "geogebra diagram", "definition": "geogebra_file('newVM_cA1Sig0.ggb' , ggb_params)", "description": "

was geogebra_applet('symmetric-parabolic-loading_HCdYjqQ.ggb' , ggb_params)

", "templateType": "anything", "can_override": false}, "ggb_params": {"name": "ggb_params", "group": "geogebra diagram", "definition": "[ unitsD: '\"' + units[0] + '\"',\n unitsF: '\"' + units[1] + '\"',\n A: [definition: vector(0,0), visible: false ],\n B: [definition: vector(2 b,0), visible: false], \n C: [definition: vector(b,h), visible: false], \n L: 2b,\n showV:[definition: 'false', visible: true],\n showM:[definition: 'false', visible: true],\n wscale: [definition: \"CopyFreeObject(scaleFunction(Max(abs(y(wmax)))/4))\"],\n vscale: [definition: \"CopyFreeObject(scaleFunction(Max(abs(y(vmax)))/3))\"],\n mscale: [definition: \"CopyFreeObject(scaleFunction(Max(abs(y(mmax)))/3))\"]\n]\n", "description": "

Points A,B, and C define the loading function.  The curve is a polynomial passing through these three points.

\n

The beam length is 2b and height is h in force/distance units

\n

", "templateType": "anything", "can_override": false}, "b": {"name": "b", "group": "Ungrouped variables", "definition": "random(5..10)", "description": "

half width of beam \"base\"

", "templateType": "anything", "can_override": false}, "h": {"name": "h", "group": "Ungrouped variables", "definition": "random([1,2,2.5,5,7.5,10])random([10,100])", "description": "

distributed load at the center of the beam \"height\"

", "templateType": "anything", "can_override": false}, "w": {"name": "w", "group": "Ungrouped variables", "definition": "polynomial(x,[0,2 h/b,-h/(b^2)])", "description": "

loading function w(x)

", "templateType": "anything", "can_override": false}, "F_A": {"name": "F_A", "group": "Ungrouped variables", "definition": "rational(2/3 b h)", "description": "

Reaction at A = half the downward force ( 2/3 bh)

\n

Reaction at B is the same.

", "templateType": "anything", "can_override": false}, "v": {"name": "v", "group": "Ungrouped variables", "definition": "polynomial(x,[ F_A,0, -h/b, h/(b^2)/3])", "description": "

the shear function. result of integrating -w(x)

", "templateType": "anything", "can_override": false}, "m": {"name": "m", "group": "Ungrouped variables", "definition": "polynomial(x,[0, F_A,0, -h/b/3, h/(b^2)/3/4])", "description": "

The moment function m(x), result of integrating v(x)

", "templateType": "anything", "can_override": false}, "debug": {"name": "debug", "group": "geogebra diagram", "definition": "false", "description": "", "templateType": "anything", "can_override": false}, "w_t": {"name": "w_t", "group": "Ungrouped variables", "definition": "siground(qty(2 F_A, units[1]),4)", "description": "

Total Weight supported by the beam

", "templateType": "anything", "can_override": false}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["units", "b", "h", "w", "F_A", "v", "m", "w_t"], "variable_groups": [{"name": "geogebra diagram", "variables": ["applet", "ggb_params", "debug"]}], "functions": {"show_curvesxxx": {"parameters": [["app", "ggbapplet"]], "type": "anything", "language": "javascript", "definition": "app.promise.then(function(d) {\n d.app.setVisible(\"showV\", true,false);\n d.app.setVisible(\"showM\", true,false);\n d.app.setValue(\"showV\",true);\n d.app.setValue(\"showM\",true);\n});\nreturn \"\"//new Numbas.jme.types.ggbapplet(app);\n"}}, "preamble": {"js": "question.signals.on('adviceDisplayed',function() {\n try{\n var app = question.scope.variables.applet.app; \n app.setVisible(\"showV\", true,false);\n app.setVisible(\"showM\", true,false);\n app.setValue(\"showV\",true);\n app.setValue(\"showM\",true);\n }\n catch(err){} \n})\n\n\n", "css": ""}, "parts": [{"type": "gapfill", "useCustomName": true, "customName": "Load and Reactions", "marks": 0, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "

Determine the total weight supported by the beam and the reactions at $A$ and $B$.

\n

$W = $ [[0]]

\n

$R_A =$ [[1]] $\\qquad R_B = $[[2]]

\n

$R_A = R_B =\\simplify[fractionNumbers]{{F_A}}$ =  {siground(qty(F_A,units[1]),4)}

", "stepsPenalty": "10", "steps": [{"type": "information", "useCustomName": false, "customName": "", "marks": 0, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "

The total weight is found by integrating the loading function $w(x)$.  Positive values indicate a downward load.

\n

$\\begin{align}W &= \\simplify{defint(w,x,0,L)}\\\\ &= \\simplify[fractionNumbers,canonicalOrder]{defint({w},x,0,{2b})}\\\\ &= \\var{W_t}\\end{align}$

\n

By symmetry, the reactions are half the weight:

\n

$F_A = F_B = \\dfrac{W}{2}$.

"}], "gaps": [{"type": "engineering-answer", "useCustomName": true, "customName": "$W$", "marks": "10", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "qty(2 F_A,units[1])", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}, {"type": "engineering-answer", "useCustomName": true, "customName": "$F_A$", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "qty(F_A,units[1])", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}, {"type": "engineering-answer", "useCustomName": true, "customName": "$F_B$", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "qty(F_A,units[1])", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}], "sortAnswers": false}, {"type": "gapfill", "useCustomName": true, "customName": "Shear and Bending Moment Functions", "marks": 0, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "

Determine expressions for:

\n

$V\\!(x) =$ [[0]]

\n

$M\\!(x) =$ [[1]]

\n

and then plot the shear and bending moment diagrams.

\n

$V(x) = \\simplify[canonicalOrder,fractionNumbers]{{v}}$

\n

$M(x) = \\simplify[canonicalOrder,fractionNumbers]{{m}}$

\n

", "stepsPenalty": "10", "steps": [{"type": "information", "useCustomName": false, "customName": "", "marks": 0, "scripts": {"validate": {"script": "{show_curves(applet)}", "order": "after"}}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "

The shear function is found by integrating the loading function. The negative sign is because positive values of w(x) represent a load which points down.

\n

$\\begin{align}V(x) &=  \\simplify{-defint(w,x,0,x)} \\\\&= \\simplify[fractionNumbers,canonicalOrder]{defint({-w},x,0,L)} \\\\&= \\simplify[fractionNumbers,canonicalOrder]{{v}}\\end{align}$

\n

The bending moment function is found by integrating the shear function.

\n

$\\begin{align}M(x) &= \\simplify{defint(V,x,0,x)}\\\\&= \\simplify[fractionNumbers,canonicalOrder]{defint({v},x,0,L)} \\\\&= \\simplify[fractionNumbers,canonicalOrder]{{M}}\\end{align}$

\n

In both cases, the resulting constant of integration is determined by considering the values at $x=0$.

\n

$V(0) = F_A, \\text{ and } M(0) = 0$

\n

\n

  

"}], "gaps": [{"type": "jme", "useCustomName": true, "customName": "V(x)", "marks": "10", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "answer": "{expr(v)}", "answerSimplification": "fractionNumbers", "showPreview": true, "checkingType": "sigfig", "checkingAccuracy": "2", "failureRate": 1, "vsetRangePoints": 5, "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "valuegenerators": []}, {"type": "jme", "useCustomName": true, "customName": "M(x)", "marks": "10", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "answer": "{expr(m)}", "answerSimplification": "fractionNumbers", "showPreview": true, "checkingType": "sigfig", "checkingAccuracy": "2", "failureRate": 1, "vsetRangePoints": 5, "vsetRange": [0, 1], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "valuegenerators": []}], "sortAnswers": false}, {"type": "gapfill", "useCustomName": true, "customName": "Maximum internal loads", "marks": 0, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "

Give the (signed) values of the largest shear and bending moment occuring anywhere within the beam.  Use the standard sign convention for shear and bending moments.

\n

$V_{\\text{max}} = $  [[0]] $\\qquad M_{\\text{max}} = $  [[1]]

\n

$V_{max} = \\var{siground(qty(eval(v,0),units[1]),4)}$ 

\n

$M_{max} = \\var{siground(qty(eval(m,b),units[0]+\" \" + units[1]),4)}$

\n

", "stepsPenalty": "10", "steps": [{"type": "information", "useCustomName": false, "customName": "", "marks": 0, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "

The maximum shear occurs at the ends, where $\\simplify{diff(V,x,1)} = -w(x) = 0$ i.e. at $x=0$, or $x=\\var{qty(2b,units[0])}$.

\n

$\\begin{align}V_{max} &= V(0) \\\\ &= \\var{siground(qty(F_A,units[1]),4)}\\end{align}$

\n

Maximum moment occurs at midpoint, where $\\simplify{diff(M,x,1)} = V = 0$

\n

$\\begin{align}M_{max} &= M(\\var{b}) \\\\&= \\var{siground(qty(eval(m,b),units[0] + ' ' + units[1]),4)}\\end{align}$

"}], "gaps": [{"type": "engineering-answer", "useCustomName": true, "customName": "$V_{max}$", "marks": "10", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "siground(qty(F_A,units[1]),4)", "right": "0.5", "close": "1", "C1": "75", "C2": "50", "C3": "25"}}, {"type": "engineering-answer", "useCustomName": true, "customName": "$M_{max}$", "marks": "10", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "siground(qty(eval(m,b),units[0] + ' ' + units[1]),4)", "right": "0.5", "close": "1", "C1": "75", "C2": "50", "C3": "25"}}], "sortAnswers": false}], "partsMode": "all", "maxMarks": 0, "objectives": [], "penalties": [], "objectiveVisibility": "always", "penaltyVisibility": "always", "contributors": [{"name": "William Haynes", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/2530/"}]}]}], "contributors": [{"name": "William Haynes", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/2530/"}]}