// Numbas version: exam_results_page_options {"showstudentname": true, "duration": 0, "timing": {"timedwarning": {"action": "none", "message": ""}, "timeout": {"action": "none", "message": ""}, "allowPause": true}, "metadata": {"description": "", "licence": "All rights reserved"}, "percentPass": 0, "navigation": {"preventleave": true, "reverse": true, "allowregen": true, "browse": true, "showresultspage": "oncompletion", "onleave": {"action": "none", "message": ""}, "showfrontpage": true}, "question_groups": [{"pickingStrategy": "all-ordered", "pickQuestions": 1, "name": "Group", "questions": [{"name": "Present Value of \u00a31", "extensions": ["jsxgraph"], "custom_part_types": [], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "contributors": [{"name": "Rory Shanahan", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/1513/"}], "statement": "

{random_question}

", "metadata": {"description": "", "licence": "None specified"}, "functions": {"timeline": {"language": "javascript", "definition": "//REVISION 20/6/17 1.50pm\n\n// Possible timeline types:\n// - Amount of \u00a31 per annum \n\n\nvar A1PA = {\n \n startPoint : 'none',\n startPointArrow : 'up',\n endPoint : 'below',\n endPointArrow : 'down',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'end',\n \n }; \n\n// - Amount of \u00a31\n\n\nvar A1 = {\n \n startPoint : 'above',\n startPointArrow : 'up',\n startPointText : 'payment_str',\n endPoint : 'below',\n endPointArrow : 'down',\n endPointText : 'none',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'end',\n \n };\n\n\n// - Present value of \u00a31 per annum\n\nvar PV1PA = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n// - Present value of \u00a31\nvar PV1 = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n startPointText : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'start',\n \n };\n\n\n// - Annual sink fund\nvar ASF = {\n \n startPoint : 'none',\n startPointArrow : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'below',\n tickText : 'qMarks',\n qmark : 'none',\n \n };\n\n\n// Years purchase in perpetuity\n\nvar YPP = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'inf',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n//// SPECIFY TYPE OF TIMELINE HERE\n\nvar timelineType = PV1;\n\n\nvar XLineAttrs = {\n strokeColor: 'black',\n fixed: true,\n strokeWidth: 3,\n straightFirst: false,\n straightLast: false,\n }\n\nvar startEndAttrs = {\n strokeColor: 'black', \n fixed: true, \n strokeWidth: 4\n }\n\n// End point for arrow\nvar endPointX = periods;\n\nif(timelineType.end === 'inf'){\n periods = 11;\n}\n\n// Constrain the graph to 10 periods in width\nif(periods<=10){\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, periods + 0.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n \n var board = div.board;\n board.create('line', [[0,0],[periods,0]], XLineAttrs);\n \n \n\n}\nelse{\n \n \n endPointX = 10;\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, 10.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n var board = div.board;\n \n //time break line segments\n var timeBreakSegmentCoords = [\n [[0,0],[8.4,0]], \n [[8.4,0],[8.5,.3]],\n [[8.5,.3],[8.7,-.4]],\n [[8.7,-.4],[8.8,0]],\n [[8.8,0],[10,0]]\n ]; \n \n board.create('line',timeBreakSegmentCoords[0],XLineAttrs);\n board.create('line',timeBreakSegmentCoords[4],XLineAttrs);\n \n for(i=1;i=10){\n qmarkX = 10;\n \n }\n else{\n qmarkX = periods;\n }\n \n if(timelineType.endPoint=='above'){\n qmarkY = .75;\n }\n else if (timelineType.endPoint=='below'){\n qmarkY = -.75;\n }\n else{\n qmarkY = -.4;\n }\n \n break;\n \n case 'none':\n qmarkRequired = false;\n break;\n}\n\n\n\nif(qmarkRequired === true){\n var qMarkAttrs = {\n anchorX: 'middle',\n fontSize : 28,\n fixed : true,\n }\n \n board.create('text',[qmarkX,qmarkY,'?'],qMarkAttrs); \n \n}\n\n \n\nvar firstTick = true;\nvar lastTick = true;\n\n\n// Draw start/end arrows\nvar startEndLength = .6;\n\nvar startEndTextAttrs = {\n anchorX: 'middle',\n anchorY: 'middle',\n fontSize : 12,\n fixed : true,\n }\n\n\nvar paymentStrStyled = \"

+*

\".replace('*',paymentStr);\n\n\nif((timelineType.startPoint === 'above') || (timelineType.startPoint === 'below')) {\n paymentStrStart = paymentStrStyled.replace('+','Year 0
');\n}\n\nif ((timelineType.endPoint === 'above') || (timelineType.endPoint === 'below')){\n paymentStrEnd = paymentStrStyled.replace('+',['Year ',periods.toString(), '
'].join(''));\n}\n\n\nswitch(timelineType.startPoint){\n \n case 'above':\n \n var startPoint = board.create('arrow',[[0,startEndLength],[0,0]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n firstTick = false;\n }\n break;\n \n case 'below':\n \n var startPoint = board.create('arrow',[[0,0],[0,-startEndLength]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,-.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n firstTick = false;\n }\n break;\n \n}\n\n\n\nswitch(timelineType.endPoint){\n \n case 'above':\n var endPoint = board.create('arrow',[[endPointX,startEndLength],[endPointX,0]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n lastTick = false;\n }\n break;\n \n case 'below':\n var endPoint = board.create('arrow',[[endPointX,0],[endPointX,-startEndLength]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n if(periods<10)\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n lastTick = false;\n }\n break;\n \n}\n\nconsole.log(lastTick);\n\n// Reverse arrow head direction in needed\nif(timelineType.endPointArrow === 'up' && timelineType.endPoint !== 'none'){\n endPoint.setArrow(true,false)\n}\n\nif(timelineType.startPointArrow === 'up' && timelineType.startPoint !== 'none'){\n startPoint.setArrow(true,false)\n}\n\n \n// Insert smaller ticks if needed\nvar tickerStr;\nvar tmp_arrow;\n\n\nvar tickerTextAttrs = {\n anchorX: 'middle',\n anchorY: 'top',\n fontSize : 11,\n fixed : true,\n }\n\nif(timelineType.tickText === 'qMarks'){\n tickerStr = '

\u00a3?

';\n}\nelse if(timelineType.tickText === 'payment'){\n tickerStr = paymentStr;\n}\nelse{\n tickerStr = '';\n}\n\nif(timelineType.ticks !== 'none'){\n \n var lowTextY = .05;\n var textY;\n var smallArrows = true;\n\n switch(timelineType.ticks){\n case 'above':\n textY = 0.45;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below':\n textY = -0.45;\n lowTextY = -.05;\n break;\n case 'above-low':\n textY = .05;\n smallArrows = false;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below-low':\n textY = -.05;\n smallArrows = false;\n break;\n }\n \n\n \n for(i=0;i<=periods;i++){\n \n if(smallArrows === true){\n \n if(timelineType.ticks === 'above'){\n //Check that a first/last tick is needed\n\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='above'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n }\n }\n else{ //ticks below\n //Check that a first/last tick is needed\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='below'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,-.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n\n //tmp_arrow.setArrow(true,false)\n }\n\n }\n }\n \n\n //Count years from 0 as long as the period is 8y or lower. Continue to 10 if there are 10 periods\n //or fewer. For periods over 10 year, add in the last two periods after the 8th.\n if(!(i>8 && periods>10)){\n \n if(i===0){\n if(firstTick===false){\n\n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch1'); tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch1');tickerTextAttrs.anchorY = 'bottom';}\n \n //board.create('text',[i,-lowTextY,'Year 0'],tickerTextAttrs);\n \n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch2');tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch2');tickerTextAttrs.anchorY = 'bottom';}\n\n }\n //else if(timelineType.tickText === 'payment'){\n //board.create('text',[i,textY,'Year 0
\u00a30'],tickerTextAttrs);\n //}\n else{\n \n board.create('text',[i,lowTextY,'Year 0'],tickerTextAttrs);\n \n\n }\n \n \n }\n else if(i===periods && lastTick===false){}\n else{\n \n board.create('text',[i,textY,['Year ',i.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n \n }\n else if(i===9){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',(periods-1).toString(),'
',tickerStr].join('')],tickerTextAttrs); \n }\n }\n else{\n // last period for >10 periods\n if(lastTick===true){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',periods.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n }\n }\n }\n}\n\n\n \nreturn div;\n", "type": "html", "parameters": [["periods", "number"], ["paymentStr", "string"]]}}, "advice": "

The correct formula to use for this question is the Present Value of £1 formula:

\n

\\[\\textrm{Present value of £1} = {(1+i)}^{-n}\\]

\n

Where $i$ is the interest rate and $n$ is the number of periods.

\n

\n

The Present Value of £1 formula is used to obtain the Present Value of an asset with a known Future Value. In other words, you know how much something is going to be worth in the future and want to know what it is worth now. Substituting the relevant numbers into the formula produces the Present Value of £1 for a given number of years and discounting at a given interest rate. Multiplying that number by any other Future Value will give the corresponding Present Value.

\n\n

\n

Let's break it down...

\n

Substituting in the values from the question gives:

\n

\\[{(1+\\var{interest_rate})}^{-\\var{periods}}\\]

\n

\\[{=(\\var{1+interest_rate}})^{-\\var{periods}}\\]

\n

\\[=\\var{dpformat(multiplier,4,\"en\")}\\]

\n

\n

\n

Finally, you need to multiply that number by the $Capital$ to get the final answer:

\n

\\[\\textrm{Present Value} = \\var{dpformat(multiplier,4,\"en\")} \\textrm{*} £\\var{dpformat(future_value,0,\"en\")}\\]

\n

\n

Which is £{sigformat(answer,3,\"en\")} to 3 significant figures. 

\n

", "parts": [{"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "correctAnswerStyle": "plain", "prompt": "

Solve the question using the correct formula.

\n

If you are unsure of how to solve this problem, work through the steps or click 'reveal answer' to view a fully worked solution. When you are finished, use the links on the left to attempt the other questions.

\n

 

\n

In the Class Test you must state the formula, insert the numbers into the formula, show the answer, provide some advice and set out a time diagram. If you get any stages wrong, you may be awarded a mark if you show your working.

", "precision": 0, "precisionType": "dp", "variableReplacements": [], "mustBeReduced": false, "strictPrecision": true, "notationStyles": ["plain", "en", "si-en"], "precisionPartialCredit": 0, "scripts": {}, "marks": "1", "showPrecisionHint": true, "maxValue": "answer+answer*answer_tolerance", "showCorrectAnswer": true, "precisionMessage": "

You need to round your answer to the nearest £1.

", "stepsPenalty": "0", "minValue": "answer-answer*answer_tolerance", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "steps": [{"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

If you get an answer to any of the steps wrong, you can resubmit values until you are correct.

\n

Here is the time diagram:

\n

{timeline(periods,paymentStr)}

", "variableReplacements": [], "scripts": {}}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Name the formula needed to solve this question.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "dropdownlist", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

Amount of £1

", "

Present Value of £1

", "

Amount of £1 per annum

", "

Annual Sinking Fund

", "

Present Value of £1 per annum

", "

YP perp

"], "distractors": ["", "", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, 0, 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Select the correct formula.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "radiogroup", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

\\[{(1 + i)}^{n}\\]

", "

\\[{(1 + i)}^{-n}\\]

", "

\\[\\frac{{(1 + i)}^{n}-1}{i}\\]

", "

\\[\\textrm{Capital *}\\frac{i}{{(1+i)}^{n}-1}\\]

", "

\\[\\frac{1-{(1+i)}^{-n}}{i}\\]

", "

\\[\\frac{1}{i}\\]

"], "distractors": ["", "Correct", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, "0", 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Please input the values that should be substituted into the formula. Please make sure percentages are converted to decimal values (e.g. 4% should be entered as 0.04).

", "variableReplacements": [], "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "interest_rate", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

i = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "interest_rate", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "periods", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

n = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "periods", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

Substitute in the values of $n$ and $i$ and calculate the $multiplier$.

", "precision": "4", "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "mustBeReduced": false, "correctAnswerStyle": "plain", "notationStyles": ["plain", "en", "si-en"], "strictPrecision": true, "scripts": {}, "marks": ".2", "showPrecisionHint": true, "maxValue": "multiplier", "showCorrectAnswer": true, "precisionMessage": "You have not given your answer to the correct precision.", "precisionPartialCredit": "0", "minValue": "multiplier", "precisionType": "dp", "correctAnswerFraction": false}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Finally, you need to multiply that number by the $capital$ to get the final answer.

", "variableReplacements": [], "scripts": {}}]}], "tags": [], "variables": {"answer_tolerance": {"name": "answer_tolerance", "templateType": "number", "description": "", "definition": "0.01", "group": "Ungrouped variables"}, "answer": {"name": "answer", "templateType": "anything", "description": "

Present value

", "definition": "present_value", "group": "Ungrouped variables"}, "random_question": {"name": "random_question", "templateType": "anything", "description": "", "definition": "join(split(join(split(join(split(random_question_gaps, \"[future_value]\"),separatethousands(future_value,\",\")),\"[periods]\"), separatethousands(periods,\"\")),\"[interest_rate]\"),separatethousands(interest_rate*100,\"\"))\n\n\n\n\n\n\n", "group": "Ungrouped variables"}, "random_question_gaps": {"name": "random_question_gaps", "templateType": "anything", "description": "

A question selected at random from the list of questions stored in the variable questions. 

", "definition": "random(questions)", "group": "Ungrouped variables"}, "multiplier": {"name": "multiplier", "templateType": "anything", "description": "", "definition": "(1+interest_rate)^(-1*periods)", "group": "Ungrouped variables"}, "periods": {"name": "periods", "templateType": "randrange", "description": "", "definition": "random(1..25#1)", "group": "Ungrouped variables"}, "questions": {"name": "questions", "templateType": "list of strings", "description": "", "definition": "[ \"If you could receive \u00a3[future_value] in [periods] years, what would you pay for it now, assuming the time value of money is [interest_rate]%?\", \"A contact has alerted you that a prestigeous office property is due to come on the market in [periods] years time for \u00a3[future_value] . What is the present value of this sum, assuming the time value of money is [interest_rate]%?\", \"How much should you save today, in order to have \u00a3[future_value] in [periods] years time, if interest rates are [interest_rate]%?\", \"What is the present value of a future sum of \u00a3[future_value] , receivable in [periods] years, with a discount rate of [interest_rate]%?\", \"If the interest rate is [interest_rate]%, how much would you need to pay today in order to earn the right to receive \u00a3[future_value] in [periods] years? \" ]", "group": "Ungrouped variables"}, "paymentStr": {"name": "paymentStr", "templateType": "anything", "description": "", "definition": "'\u00a3'+separateThousands(future_value,',')", "group": "Ungrouped variables"}, "present_value": {"name": "present_value", "templateType": "anything", "description": "", "definition": "multiplier*future_value", "group": "Ungrouped variables"}, "interest_rate": {"name": "interest_rate", "templateType": "randrange", "description": "", "definition": "random(0.01..0.15#0.0025)", "group": "Ungrouped variables"}, "future_value": {"name": "future_value", "templateType": "randrange", "description": "", "definition": "random(1000000..70000000#500000)", "group": "Ungrouped variables"}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["periods", "interest_rate", "present_value", "answer", "future_value", "questions", "random_question_gaps", "random_question", "answer_tolerance", "multiplier", "paymentStr"], "rulesets": {}, "variable_groups": [], "preamble": {"js": "", "css": ""}, "type": "question"}, {"name": "Present Value of \u00a31", "extensions": ["jsxgraph"], "custom_part_types": [], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "contributors": [{"name": "Rory Shanahan", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/1513/"}], "statement": "

{random_question}

", "metadata": {"description": "", "licence": "None specified"}, "functions": {"timeline": {"language": "javascript", "definition": "//REVISION 20/6/17 1.50pm\n\n// Possible timeline types:\n// - Amount of \u00a31 per annum \n\n\nvar A1PA = {\n \n startPoint : 'none',\n startPointArrow : 'up',\n endPoint : 'below',\n endPointArrow : 'down',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'end',\n \n }; \n\n// - Amount of \u00a31\n\n\nvar A1 = {\n \n startPoint : 'above',\n startPointArrow : 'up',\n startPointText : 'payment_str',\n endPoint : 'below',\n endPointArrow : 'down',\n endPointText : 'none',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'end',\n \n };\n\n\n// - Present value of \u00a31 per annum\n\nvar PV1PA = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n// - Present value of \u00a31\nvar PV1 = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n startPointText : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'start',\n \n };\n\n\n// - Annual sink fund\nvar ASF = {\n \n startPoint : 'none',\n startPointArrow : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'below',\n tickText : 'qMarks',\n qmark : 'none',\n \n };\n\n\n// Years purchase in perpetuity\n\nvar YPP = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'inf',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n//// SPECIFY TYPE OF TIMELINE HERE\n\nvar timelineType = PV1;\n\n\nvar XLineAttrs = {\n strokeColor: 'black',\n fixed: true,\n strokeWidth: 3,\n straightFirst: false,\n straightLast: false,\n }\n\nvar startEndAttrs = {\n strokeColor: 'black', \n fixed: true, \n strokeWidth: 4\n }\n\n// End point for arrow\nvar endPointX = periods;\n\nif(timelineType.end === 'inf'){\n periods = 11;\n}\n\n// Constrain the graph to 10 periods in width\nif(periods<=10){\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, periods + 0.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n \n var board = div.board;\n board.create('line', [[0,0],[periods,0]], XLineAttrs);\n \n \n\n}\nelse{\n \n \n endPointX = 10;\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, 10.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n var board = div.board;\n \n //time break line segments\n var timeBreakSegmentCoords = [\n [[0,0],[8.4,0]], \n [[8.4,0],[8.5,.3]],\n [[8.5,.3],[8.7,-.4]],\n [[8.7,-.4],[8.8,0]],\n [[8.8,0],[10,0]]\n ]; \n \n board.create('line',timeBreakSegmentCoords[0],XLineAttrs);\n board.create('line',timeBreakSegmentCoords[4],XLineAttrs);\n \n for(i=1;i=10){\n qmarkX = 10;\n \n }\n else{\n qmarkX = periods;\n }\n \n if(timelineType.endPoint=='above'){\n qmarkY = .75;\n }\n else if (timelineType.endPoint=='below'){\n qmarkY = -.75;\n }\n else{\n qmarkY = -.4;\n }\n \n break;\n \n case 'none':\n qmarkRequired = false;\n break;\n}\n\n\n\nif(qmarkRequired === true){\n var qMarkAttrs = {\n anchorX: 'middle',\n fontSize : 28,\n fixed : true,\n }\n \n board.create('text',[qmarkX,qmarkY,'?'],qMarkAttrs); \n \n}\n\n \n\nvar firstTick = true;\nvar lastTick = true;\n\n\n// Draw start/end arrows\nvar startEndLength = .6;\n\nvar startEndTextAttrs = {\n anchorX: 'middle',\n anchorY: 'middle',\n fontSize : 12,\n fixed : true,\n }\n\n\nvar paymentStrStyled = \"

+*

\".replace('*',paymentStr);\n\n\nif((timelineType.startPoint === 'above') || (timelineType.startPoint === 'below')) {\n paymentStrStart = paymentStrStyled.replace('+','Year 0
');\n}\n\nif ((timelineType.endPoint === 'above') || (timelineType.endPoint === 'below')){\n paymentStrEnd = paymentStrStyled.replace('+',['Year ',periods.toString(), '
'].join(''));\n}\n\n\nswitch(timelineType.startPoint){\n \n case 'above':\n \n var startPoint = board.create('arrow',[[0,startEndLength],[0,0]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n firstTick = false;\n }\n break;\n \n case 'below':\n \n var startPoint = board.create('arrow',[[0,0],[0,-startEndLength]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,-.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n firstTick = false;\n }\n break;\n \n}\n\n\n\nswitch(timelineType.endPoint){\n \n case 'above':\n var endPoint = board.create('arrow',[[endPointX,startEndLength],[endPointX,0]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n lastTick = false;\n }\n break;\n \n case 'below':\n var endPoint = board.create('arrow',[[endPointX,0],[endPointX,-startEndLength]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n if(periods<10)\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n lastTick = false;\n }\n break;\n \n}\n\nconsole.log(lastTick);\n\n// Reverse arrow head direction in needed\nif(timelineType.endPointArrow === 'up' && timelineType.endPoint !== 'none'){\n endPoint.setArrow(true,false)\n}\n\nif(timelineType.startPointArrow === 'up' && timelineType.startPoint !== 'none'){\n startPoint.setArrow(true,false)\n}\n\n \n// Insert smaller ticks if needed\nvar tickerStr;\nvar tmp_arrow;\n\n\nvar tickerTextAttrs = {\n anchorX: 'middle',\n anchorY: 'top',\n fontSize : 11,\n fixed : true,\n }\n\nif(timelineType.tickText === 'qMarks'){\n tickerStr = '

\u00a3?

';\n}\nelse if(timelineType.tickText === 'payment'){\n tickerStr = paymentStr;\n}\nelse{\n tickerStr = '';\n}\n\nif(timelineType.ticks !== 'none'){\n \n var lowTextY = .05;\n var textY;\n var smallArrows = true;\n\n switch(timelineType.ticks){\n case 'above':\n textY = 0.45;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below':\n textY = -0.45;\n lowTextY = -.05;\n break;\n case 'above-low':\n textY = .05;\n smallArrows = false;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below-low':\n textY = -.05;\n smallArrows = false;\n break;\n }\n \n\n \n for(i=0;i<=periods;i++){\n \n if(smallArrows === true){\n \n if(timelineType.ticks === 'above'){\n //Check that a first/last tick is needed\n\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='above'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n }\n }\n else{ //ticks below\n //Check that a first/last tick is needed\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='below'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,-.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n\n //tmp_arrow.setArrow(true,false)\n }\n\n }\n }\n \n\n //Count years from 0 as long as the period is 8y or lower. Continue to 10 if there are 10 periods\n //or fewer. For periods over 10 year, add in the last two periods after the 8th.\n if(!(i>8 && periods>10)){\n \n if(i===0){\n if(firstTick===false){\n\n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch1'); tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch1');tickerTextAttrs.anchorY = 'bottom';}\n \n //board.create('text',[i,-lowTextY,'Year 0'],tickerTextAttrs);\n \n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch2');tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch2');tickerTextAttrs.anchorY = 'bottom';}\n\n }\n //else if(timelineType.tickText === 'payment'){\n //board.create('text',[i,textY,'Year 0
\u00a30'],tickerTextAttrs);\n //}\n else{\n \n board.create('text',[i,lowTextY,'Year 0'],tickerTextAttrs);\n \n\n }\n \n \n }\n else if(i===periods && lastTick===false){}\n else{\n \n board.create('text',[i,textY,['Year ',i.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n \n }\n else if(i===9){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',(periods-1).toString(),'
',tickerStr].join('')],tickerTextAttrs); \n }\n }\n else{\n // last period for >10 periods\n if(lastTick===true){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',periods.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n }\n }\n }\n}\n\n\n \nreturn div;\n", "type": "html", "parameters": [["periods", "number"], ["paymentStr", "string"]]}}, "advice": "

The correct formula to use for this question is the Present Value of £1 formula:

\n

\\[\\textrm{Present value of £1} = {(1+i)}^{-n}\\]

\n

Where $i$ is the interest rate and $n$ is the number of periods.

\n

\n

The Present Value of £1 formula is used to obtain the Present Value of an asset with a known Future Value. In other words, you know how much something is going to be worth in the future and want to know what it is worth now. Substituting the relevant numbers into the formula produces the Present Value of £1 for a given number of years and discounting at a given interest rate. Multiplying that number by any other Future Value will give the corresponding Present Value.

\n\n

\n

Let's break it down...

\n

Substituting in the values from the question gives:

\n

\\[{(1+\\var{interest_rate})}^{-\\var{periods}}\\]

\n

\\[{=(\\var{1+interest_rate}})^{-\\var{periods}}\\]

\n

\\[=\\var{dpformat(multiplier,4,\"en\")}\\]

\n

\n

\n

Finally, you need to multiply that number by the $Capital$ to get the final answer:

\n

\\[\\textrm{Present Value} = \\var{dpformat(multiplier,4,\"en\")} \\textrm{*} £\\var{dpformat(future_value,0,\"en\")}\\]

\n

\n

Which is £{sigformat(answer,3,\"en\")} to 3 significant figures. 

\n

", "parts": [{"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "correctAnswerStyle": "plain", "prompt": "

Solve the question using the correct formula.

\n

If you are unsure of how to solve this problem, work through the steps or click 'reveal answer' to view a fully worked solution. When you are finished, use the links on the left to attempt the other questions.

\n

 

\n

In the Class Test you must state the formula, insert the numbers into the formula, show the answer, provide some advice and set out a time diagram. If you get any stages wrong, you may be awarded a mark if you show your working.

", "precision": 0, "precisionType": "dp", "variableReplacements": [], "mustBeReduced": false, "strictPrecision": true, "notationStyles": ["plain", "en", "si-en"], "precisionPartialCredit": 0, "scripts": {}, "marks": "1", "showPrecisionHint": true, "maxValue": "answer+answer*answer_tolerance", "showCorrectAnswer": true, "precisionMessage": "

You need to round your answer to the nearest £1.

", "stepsPenalty": "0", "minValue": "answer-answer*answer_tolerance", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "steps": [{"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

If you get an answer to any of the steps wrong, you can resubmit values until you are correct.

\n

Here is the time diagram:

\n

{timeline(periods,paymentStr)}

", "variableReplacements": [], "scripts": {}}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Name the formula needed to solve this question.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "dropdownlist", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

Amount of £1

", "

Present Value of £1

", "

Amount of £1 per annum

", "

Annual Sinking Fund

", "

Present Value of £1 per annum

", "

YP perp

"], "distractors": ["", "", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, 0, 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Select the correct formula.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "radiogroup", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

\\[{(1 + i)}^{n}\\]

", "

\\[{(1 + i)}^{-n}\\]

", "

\\[\\frac{{(1 + i)}^{n}-1}{i}\\]

", "

\\[\\textrm{Capital *}\\frac{i}{{(1+i)}^{n}-1}\\]

", "

\\[\\frac{1-{(1+i)}^{-n}}{i}\\]

", "

\\[\\frac{1}{i}\\]

"], "distractors": ["", "Correct", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, "0", 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Please input the values that should be substituted into the formula. Please make sure percentages are converted to decimal values (e.g. 4% should be entered as 0.04).

", "variableReplacements": [], "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "interest_rate", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

i = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "interest_rate", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "periods", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

n = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "periods", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

Substitute in the values of $n$ and $i$ and calculate the $multiplier$.

", "precision": "4", "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "mustBeReduced": false, "correctAnswerStyle": "plain", "notationStyles": ["plain", "en", "si-en"], "strictPrecision": true, "scripts": {}, "marks": ".2", "showPrecisionHint": true, "maxValue": "multiplier", "showCorrectAnswer": true, "precisionMessage": "You have not given your answer to the correct precision.", "precisionPartialCredit": "0", "minValue": "multiplier", "precisionType": "dp", "correctAnswerFraction": false}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Finally, you need to multiply that number by the $capital$ to get the final answer.

", "variableReplacements": [], "scripts": {}}]}], "tags": [], "variables": {"answer_tolerance": {"name": "answer_tolerance", "templateType": "number", "description": "", "definition": "0.01", "group": "Ungrouped variables"}, "answer": {"name": "answer", "templateType": "anything", "description": "

Present value

", "definition": "present_value", "group": "Ungrouped variables"}, "random_question": {"name": "random_question", "templateType": "anything", "description": "", "definition": "join(split(join(split(join(split(random_question_gaps, \"[future_value]\"),separatethousands(future_value,\",\")),\"[periods]\"), separatethousands(periods,\"\")),\"[interest_rate]\"),separatethousands(interest_rate*100,\"\"))\n\n\n\n\n\n\n", "group": "Ungrouped variables"}, "random_question_gaps": {"name": "random_question_gaps", "templateType": "anything", "description": "

A question selected at random from the list of questions stored in the variable questions. 

", "definition": "random(questions)", "group": "Ungrouped variables"}, "multiplier": {"name": "multiplier", "templateType": "anything", "description": "", "definition": "(1+interest_rate)^(-1*periods)", "group": "Ungrouped variables"}, "periods": {"name": "periods", "templateType": "randrange", "description": "", "definition": "random(1..25#1)", "group": "Ungrouped variables"}, "questions": {"name": "questions", "templateType": "list of strings", "description": "", "definition": "[ \"If you could receive \u00a3[future_value] in [periods] years, what would you pay for it now, assuming the time value of money is [interest_rate]%?\", \"A contact has alerted you that a prestigeous office property is due to come on the market in [periods] years time for \u00a3[future_value] . What is the present value of this sum, assuming the time value of money is [interest_rate]%?\", \"How much should you save today, in order to have \u00a3[future_value] in [periods] years time, if interest rates are [interest_rate]%?\", \"What is the present value of a future sum of \u00a3[future_value] , receivable in [periods] years, with a discount rate of [interest_rate]%?\", \"If the interest rate is [interest_rate]%, how much would you need to pay today in order to earn the right to receive \u00a3[future_value] in [periods] years? \" ]", "group": "Ungrouped variables"}, "paymentStr": {"name": "paymentStr", "templateType": "anything", "description": "", "definition": "'\u00a3'+separateThousands(future_value,',')", "group": "Ungrouped variables"}, "present_value": {"name": "present_value", "templateType": "anything", "description": "", "definition": "multiplier*future_value", "group": "Ungrouped variables"}, "interest_rate": {"name": "interest_rate", "templateType": "randrange", "description": "", "definition": "random(0.01..0.15#0.0025)", "group": "Ungrouped variables"}, "future_value": {"name": "future_value", "templateType": "randrange", "description": "", "definition": "random(1000000..70000000#500000)", "group": "Ungrouped variables"}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["periods", "interest_rate", "present_value", "answer", "future_value", "questions", "random_question_gaps", "random_question", "answer_tolerance", "multiplier", "paymentStr"], "rulesets": {}, "variable_groups": [], "preamble": {"js": "", "css": ""}, "type": "question"}, {"name": "Present Value of \u00a31", "extensions": ["jsxgraph"], "custom_part_types": [], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "contributors": [{"name": "Rory Shanahan", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/1513/"}], "statement": "

{random_question}

", "metadata": {"description": "", "licence": "None specified"}, "functions": {"timeline": {"language": "javascript", "definition": "//REVISION 20/6/17 1.50pm\n\n// Possible timeline types:\n// - Amount of \u00a31 per annum \n\n\nvar A1PA = {\n \n startPoint : 'none',\n startPointArrow : 'up',\n endPoint : 'below',\n endPointArrow : 'down',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'end',\n \n }; \n\n// - Amount of \u00a31\n\n\nvar A1 = {\n \n startPoint : 'above',\n startPointArrow : 'up',\n startPointText : 'payment_str',\n endPoint : 'below',\n endPointArrow : 'down',\n endPointText : 'none',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'end',\n \n };\n\n\n// - Present value of \u00a31 per annum\n\nvar PV1PA = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n// - Present value of \u00a31\nvar PV1 = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n startPointText : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'start',\n \n };\n\n\n// - Annual sink fund\nvar ASF = {\n \n startPoint : 'none',\n startPointArrow : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'below',\n tickText : 'qMarks',\n qmark : 'none',\n \n };\n\n\n// Years purchase in perpetuity\n\nvar YPP = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'inf',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n//// SPECIFY TYPE OF TIMELINE HERE\n\nvar timelineType = PV1;\n\n\nvar XLineAttrs = {\n strokeColor: 'black',\n fixed: true,\n strokeWidth: 3,\n straightFirst: false,\n straightLast: false,\n }\n\nvar startEndAttrs = {\n strokeColor: 'black', \n fixed: true, \n strokeWidth: 4\n }\n\n// End point for arrow\nvar endPointX = periods;\n\nif(timelineType.end === 'inf'){\n periods = 11;\n}\n\n// Constrain the graph to 10 periods in width\nif(periods<=10){\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, periods + 0.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n \n var board = div.board;\n board.create('line', [[0,0],[periods,0]], XLineAttrs);\n \n \n\n}\nelse{\n \n \n endPointX = 10;\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, 10.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n var board = div.board;\n \n //time break line segments\n var timeBreakSegmentCoords = [\n [[0,0],[8.4,0]], \n [[8.4,0],[8.5,.3]],\n [[8.5,.3],[8.7,-.4]],\n [[8.7,-.4],[8.8,0]],\n [[8.8,0],[10,0]]\n ]; \n \n board.create('line',timeBreakSegmentCoords[0],XLineAttrs);\n board.create('line',timeBreakSegmentCoords[4],XLineAttrs);\n \n for(i=1;i=10){\n qmarkX = 10;\n \n }\n else{\n qmarkX = periods;\n }\n \n if(timelineType.endPoint=='above'){\n qmarkY = .75;\n }\n else if (timelineType.endPoint=='below'){\n qmarkY = -.75;\n }\n else{\n qmarkY = -.4;\n }\n \n break;\n \n case 'none':\n qmarkRequired = false;\n break;\n}\n\n\n\nif(qmarkRequired === true){\n var qMarkAttrs = {\n anchorX: 'middle',\n fontSize : 28,\n fixed : true,\n }\n \n board.create('text',[qmarkX,qmarkY,'?'],qMarkAttrs); \n \n}\n\n \n\nvar firstTick = true;\nvar lastTick = true;\n\n\n// Draw start/end arrows\nvar startEndLength = .6;\n\nvar startEndTextAttrs = {\n anchorX: 'middle',\n anchorY: 'middle',\n fontSize : 12,\n fixed : true,\n }\n\n\nvar paymentStrStyled = \"

+*

\".replace('*',paymentStr);\n\n\nif((timelineType.startPoint === 'above') || (timelineType.startPoint === 'below')) {\n paymentStrStart = paymentStrStyled.replace('+','Year 0
');\n}\n\nif ((timelineType.endPoint === 'above') || (timelineType.endPoint === 'below')){\n paymentStrEnd = paymentStrStyled.replace('+',['Year ',periods.toString(), '
'].join(''));\n}\n\n\nswitch(timelineType.startPoint){\n \n case 'above':\n \n var startPoint = board.create('arrow',[[0,startEndLength],[0,0]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n firstTick = false;\n }\n break;\n \n case 'below':\n \n var startPoint = board.create('arrow',[[0,0],[0,-startEndLength]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,-.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n firstTick = false;\n }\n break;\n \n}\n\n\n\nswitch(timelineType.endPoint){\n \n case 'above':\n var endPoint = board.create('arrow',[[endPointX,startEndLength],[endPointX,0]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n lastTick = false;\n }\n break;\n \n case 'below':\n var endPoint = board.create('arrow',[[endPointX,0],[endPointX,-startEndLength]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n if(periods<10)\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n lastTick = false;\n }\n break;\n \n}\n\nconsole.log(lastTick);\n\n// Reverse arrow head direction in needed\nif(timelineType.endPointArrow === 'up' && timelineType.endPoint !== 'none'){\n endPoint.setArrow(true,false)\n}\n\nif(timelineType.startPointArrow === 'up' && timelineType.startPoint !== 'none'){\n startPoint.setArrow(true,false)\n}\n\n \n// Insert smaller ticks if needed\nvar tickerStr;\nvar tmp_arrow;\n\n\nvar tickerTextAttrs = {\n anchorX: 'middle',\n anchorY: 'top',\n fontSize : 11,\n fixed : true,\n }\n\nif(timelineType.tickText === 'qMarks'){\n tickerStr = '

\u00a3?

';\n}\nelse if(timelineType.tickText === 'payment'){\n tickerStr = paymentStr;\n}\nelse{\n tickerStr = '';\n}\n\nif(timelineType.ticks !== 'none'){\n \n var lowTextY = .05;\n var textY;\n var smallArrows = true;\n\n switch(timelineType.ticks){\n case 'above':\n textY = 0.45;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below':\n textY = -0.45;\n lowTextY = -.05;\n break;\n case 'above-low':\n textY = .05;\n smallArrows = false;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below-low':\n textY = -.05;\n smallArrows = false;\n break;\n }\n \n\n \n for(i=0;i<=periods;i++){\n \n if(smallArrows === true){\n \n if(timelineType.ticks === 'above'){\n //Check that a first/last tick is needed\n\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='above'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n }\n }\n else{ //ticks below\n //Check that a first/last tick is needed\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='below'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,-.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n\n //tmp_arrow.setArrow(true,false)\n }\n\n }\n }\n \n\n //Count years from 0 as long as the period is 8y or lower. Continue to 10 if there are 10 periods\n //or fewer. For periods over 10 year, add in the last two periods after the 8th.\n if(!(i>8 && periods>10)){\n \n if(i===0){\n if(firstTick===false){\n\n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch1'); tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch1');tickerTextAttrs.anchorY = 'bottom';}\n \n //board.create('text',[i,-lowTextY,'Year 0'],tickerTextAttrs);\n \n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch2');tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch2');tickerTextAttrs.anchorY = 'bottom';}\n\n }\n //else if(timelineType.tickText === 'payment'){\n //board.create('text',[i,textY,'Year 0
\u00a30'],tickerTextAttrs);\n //}\n else{\n \n board.create('text',[i,lowTextY,'Year 0'],tickerTextAttrs);\n \n\n }\n \n \n }\n else if(i===periods && lastTick===false){}\n else{\n \n board.create('text',[i,textY,['Year ',i.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n \n }\n else if(i===9){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',(periods-1).toString(),'
',tickerStr].join('')],tickerTextAttrs); \n }\n }\n else{\n // last period for >10 periods\n if(lastTick===true){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',periods.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n }\n }\n }\n}\n\n\n \nreturn div;\n", "type": "html", "parameters": [["periods", "number"], ["paymentStr", "string"]]}}, "advice": "

The correct formula to use for this question is the Present Value of £1 formula:

\n

\\[\\textrm{Present value of £1} = {(1+i)}^{-n}\\]

\n

Where $i$ is the interest rate and $n$ is the number of periods.

\n

\n

The Present Value of £1 formula is used to obtain the Present Value of an asset with a known Future Value. In other words, you know how much something is going to be worth in the future and want to know what it is worth now. Substituting the relevant numbers into the formula produces the Present Value of £1 for a given number of years and discounting at a given interest rate. Multiplying that number by any other Future Value will give the corresponding Present Value.

\n
    \n
  • Given Variables: Future Value, interest rate, number of years/periods
  • \n
  • Answer: Present Value
  • \n
\n

\n

Let's break it down...

\n

Substituting in the values from the question gives:

\n

\\[{(1+\\var{interest_rate})}^{-\\var{periods}}\\]

\n

\\[{=(\\var{1+interest_rate}})^{-\\var{periods}}\\]

\n

\\[=\\var{dpformat(multiplier,4,\"en\")}\\]

\n

\n

\n

Finally, you need to multiply that number by the $Capital$ to get the final answer:

\n

\\[\\textrm{Present Value} = \\var{dpformat(multiplier,4,\"en\")} \\textrm{*} £\\var{dpformat(future_value,0,\"en\")}\\]

\n

\n

Which is £{sigformat(answer,3,\"en\")} to 3 significant figures. 

\n

", "parts": [{"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "correctAnswerStyle": "plain", "prompt": "

Solve the question using the correct formula.

\n

If you are unsure of how to solve this problem, work through the steps or click 'reveal answer' to view a fully worked solution. When you are finished, use the links on the left to attempt the other questions.

\n

 

\n

In the Class Test you must state the formula, insert the numbers into the formula, show the answer, provide some advice and set out a time diagram. If you get any stages wrong, you may be awarded a mark if you show your working.

", "precision": 0, "precisionType": "dp", "variableReplacements": [], "mustBeReduced": false, "strictPrecision": true, "notationStyles": ["plain", "en", "si-en"], "precisionPartialCredit": 0, "scripts": {}, "marks": "1", "showPrecisionHint": true, "maxValue": "answer+answer*answer_tolerance", "showCorrectAnswer": true, "precisionMessage": "

You need to round your answer to the nearest £1.

", "stepsPenalty": "0", "minValue": "answer-answer*answer_tolerance", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "steps": [{"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

If you get an answer to any of the steps wrong, you can resubmit values until you are correct.

\n

Here is the time diagram:

\n

{timeline(periods,paymentStr)}

", "variableReplacements": [], "scripts": {}}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Name the formula needed to solve this question.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "dropdownlist", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

Amount of £1

", "

Present Value of £1

", "

Amount of £1 per annum

", "

Annual Sinking Fund

", "

Present Value of £1 per annum

", "

YP perp

"], "distractors": ["", "", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, 0, 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Select the correct formula.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "radiogroup", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

\\[{(1 + i)}^{n}\\]

", "

\\[{(1 + i)}^{-n}\\]

", "

\\[\\frac{{(1 + i)}^{n}-1}{i}\\]

", "

\\[\\textrm{Capital *}\\frac{i}{{(1+i)}^{n}-1}\\]

", "

\\[\\frac{1-{(1+i)}^{-n}}{i}\\]

", "

\\[\\frac{1}{i}\\]

"], "distractors": ["", "Correct", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, "0", 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Please input the values that should be substituted into the formula. Please make sure percentages are converted to decimal values (e.g. 4% should be entered as 0.04).

", "variableReplacements": [], "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "interest_rate", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

i = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "interest_rate", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "periods", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

n = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "periods", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

Substitute in the values of $n$ and $i$ and calculate the $multiplier$.

", "precision": "4", "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "mustBeReduced": false, "correctAnswerStyle": "plain", "notationStyles": ["plain", "en", "si-en"], "strictPrecision": true, "scripts": {}, "marks": ".2", "showPrecisionHint": true, "maxValue": "multiplier", "showCorrectAnswer": true, "precisionMessage": "You have not given your answer to the correct precision.", "precisionPartialCredit": "0", "minValue": "multiplier", "precisionType": "dp", "correctAnswerFraction": false}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Finally, you need to multiply that number by the $capital$ to get the final answer.

", "variableReplacements": [], "scripts": {}}]}], "tags": [], "variables": {"answer_tolerance": {"name": "answer_tolerance", "templateType": "number", "description": "", "definition": "0.01", "group": "Ungrouped variables"}, "answer": {"name": "answer", "templateType": "anything", "description": "

Present value

", "definition": "present_value", "group": "Ungrouped variables"}, "random_question": {"name": "random_question", "templateType": "anything", "description": "", "definition": "join(split(join(split(join(split(random_question_gaps, \"[future_value]\"),separatethousands(future_value,\",\")),\"[periods]\"), separatethousands(periods,\"\")),\"[interest_rate]\"),separatethousands(interest_rate*100,\"\"))\n\n\n\n\n\n\n", "group": "Ungrouped variables"}, "random_question_gaps": {"name": "random_question_gaps", "templateType": "anything", "description": "

A question selected at random from the list of questions stored in the variable questions. 

", "definition": "random(questions)", "group": "Ungrouped variables"}, "multiplier": {"name": "multiplier", "templateType": "anything", "description": "", "definition": "(1+interest_rate)^(-1*periods)", "group": "Ungrouped variables"}, "periods": {"name": "periods", "templateType": "randrange", "description": "", "definition": "random(1..25#1)", "group": "Ungrouped variables"}, "questions": {"name": "questions", "templateType": "list of strings", "description": "", "definition": "[ \"If you could receive \u00a3[future_value] in [periods] years, what would you pay for it now, assuming the time value of money is [interest_rate]%?\", \"A contact has alerted you that a prestigeous office property is due to come on the market in [periods] years time for \u00a3[future_value] . What is the present value of this sum, assuming the time value of money is [interest_rate]%?\", \"How much should you save today, in order to have \u00a3[future_value] in [periods] years time, if interest rates are [interest_rate]%?\", \"What is the present value of a future sum of \u00a3[future_value] , receivable in [periods] years, with a discount rate of [interest_rate]%?\", \"If the interest rate is [interest_rate]%, how much would you need to pay today in order to earn the right to receive \u00a3[future_value] in [periods] years? \" ]", "group": "Ungrouped variables"}, "paymentStr": {"name": "paymentStr", "templateType": "anything", "description": "", "definition": "'\u00a3'+separateThousands(future_value,',')", "group": "Ungrouped variables"}, "present_value": {"name": "present_value", "templateType": "anything", "description": "", "definition": "multiplier*future_value", "group": "Ungrouped variables"}, "interest_rate": {"name": "interest_rate", "templateType": "randrange", "description": "", "definition": "random(0.01..0.15#0.0025)", "group": "Ungrouped variables"}, "future_value": {"name": "future_value", "templateType": "randrange", "description": "", "definition": "random(1000000..70000000#500000)", "group": "Ungrouped variables"}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["periods", "interest_rate", "present_value", "answer", "future_value", "questions", "random_question_gaps", "random_question", "answer_tolerance", "multiplier", "paymentStr"], "rulesets": {}, "variable_groups": [], "preamble": {"js": "", "css": ""}, "type": "question"}, {"name": "Present Value of \u00a31", "extensions": ["jsxgraph"], "custom_part_types": [], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "contributors": [{"name": "Rory Shanahan", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/1513/"}], "statement": "

{random_question}

", "metadata": {"description": "", "licence": "None specified"}, "functions": {"timeline": {"language": "javascript", "definition": "//REVISION 20/6/17 1.50pm\n\n// Possible timeline types:\n// - Amount of \u00a31 per annum \n\n\nvar A1PA = {\n \n startPoint : 'none',\n startPointArrow : 'up',\n endPoint : 'below',\n endPointArrow : 'down',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'end',\n \n }; \n\n// - Amount of \u00a31\n\n\nvar A1 = {\n \n startPoint : 'above',\n startPointArrow : 'up',\n startPointText : 'payment_str',\n endPoint : 'below',\n endPointArrow : 'down',\n endPointText : 'none',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'end',\n \n };\n\n\n// - Present value of \u00a31 per annum\n\nvar PV1PA = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n// - Present value of \u00a31\nvar PV1 = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n startPointText : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'start',\n \n };\n\n\n// - Annual sink fund\nvar ASF = {\n \n startPoint : 'none',\n startPointArrow : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'below',\n tickText : 'qMarks',\n qmark : 'none',\n \n };\n\n\n// Years purchase in perpetuity\n\nvar YPP = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'inf',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n//// SPECIFY TYPE OF TIMELINE HERE\n\nvar timelineType = PV1;\n\n\nvar XLineAttrs = {\n strokeColor: 'black',\n fixed: true,\n strokeWidth: 3,\n straightFirst: false,\n straightLast: false,\n }\n\nvar startEndAttrs = {\n strokeColor: 'black', \n fixed: true, \n strokeWidth: 4\n }\n\n// End point for arrow\nvar endPointX = periods;\n\nif(timelineType.end === 'inf'){\n periods = 11;\n}\n\n// Constrain the graph to 10 periods in width\nif(periods<=10){\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, periods + 0.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n \n var board = div.board;\n board.create('line', [[0,0],[periods,0]], XLineAttrs);\n \n \n\n}\nelse{\n \n \n endPointX = 10;\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, 10.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n var board = div.board;\n \n //time break line segments\n var timeBreakSegmentCoords = [\n [[0,0],[8.4,0]], \n [[8.4,0],[8.5,.3]],\n [[8.5,.3],[8.7,-.4]],\n [[8.7,-.4],[8.8,0]],\n [[8.8,0],[10,0]]\n ]; \n \n board.create('line',timeBreakSegmentCoords[0],XLineAttrs);\n board.create('line',timeBreakSegmentCoords[4],XLineAttrs);\n \n for(i=1;i=10){\n qmarkX = 10;\n \n }\n else{\n qmarkX = periods;\n }\n \n if(timelineType.endPoint=='above'){\n qmarkY = .75;\n }\n else if (timelineType.endPoint=='below'){\n qmarkY = -.75;\n }\n else{\n qmarkY = -.4;\n }\n \n break;\n \n case 'none':\n qmarkRequired = false;\n break;\n}\n\n\n\nif(qmarkRequired === true){\n var qMarkAttrs = {\n anchorX: 'middle',\n fontSize : 28,\n fixed : true,\n }\n \n board.create('text',[qmarkX,qmarkY,'?'],qMarkAttrs); \n \n}\n\n \n\nvar firstTick = true;\nvar lastTick = true;\n\n\n// Draw start/end arrows\nvar startEndLength = .6;\n\nvar startEndTextAttrs = {\n anchorX: 'middle',\n anchorY: 'middle',\n fontSize : 12,\n fixed : true,\n }\n\n\nvar paymentStrStyled = \"

+*

\".replace('*',paymentStr);\n\n\nif((timelineType.startPoint === 'above') || (timelineType.startPoint === 'below')) {\n paymentStrStart = paymentStrStyled.replace('+','Year 0
');\n}\n\nif ((timelineType.endPoint === 'above') || (timelineType.endPoint === 'below')){\n paymentStrEnd = paymentStrStyled.replace('+',['Year ',periods.toString(), '
'].join(''));\n}\n\n\nswitch(timelineType.startPoint){\n \n case 'above':\n \n var startPoint = board.create('arrow',[[0,startEndLength],[0,0]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n firstTick = false;\n }\n break;\n \n case 'below':\n \n var startPoint = board.create('arrow',[[0,0],[0,-startEndLength]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,-.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n firstTick = false;\n }\n break;\n \n}\n\n\n\nswitch(timelineType.endPoint){\n \n case 'above':\n var endPoint = board.create('arrow',[[endPointX,startEndLength],[endPointX,0]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n lastTick = false;\n }\n break;\n \n case 'below':\n var endPoint = board.create('arrow',[[endPointX,0],[endPointX,-startEndLength]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n if(periods<10)\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n lastTick = false;\n }\n break;\n \n}\n\nconsole.log(lastTick);\n\n// Reverse arrow head direction in needed\nif(timelineType.endPointArrow === 'up' && timelineType.endPoint !== 'none'){\n endPoint.setArrow(true,false)\n}\n\nif(timelineType.startPointArrow === 'up' && timelineType.startPoint !== 'none'){\n startPoint.setArrow(true,false)\n}\n\n \n// Insert smaller ticks if needed\nvar tickerStr;\nvar tmp_arrow;\n\n\nvar tickerTextAttrs = {\n anchorX: 'middle',\n anchorY: 'top',\n fontSize : 11,\n fixed : true,\n }\n\nif(timelineType.tickText === 'qMarks'){\n tickerStr = '

\u00a3?

';\n}\nelse if(timelineType.tickText === 'payment'){\n tickerStr = paymentStr;\n}\nelse{\n tickerStr = '';\n}\n\nif(timelineType.ticks !== 'none'){\n \n var lowTextY = .05;\n var textY;\n var smallArrows = true;\n\n switch(timelineType.ticks){\n case 'above':\n textY = 0.45;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below':\n textY = -0.45;\n lowTextY = -.05;\n break;\n case 'above-low':\n textY = .05;\n smallArrows = false;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below-low':\n textY = -.05;\n smallArrows = false;\n break;\n }\n \n\n \n for(i=0;i<=periods;i++){\n \n if(smallArrows === true){\n \n if(timelineType.ticks === 'above'){\n //Check that a first/last tick is needed\n\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='above'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n }\n }\n else{ //ticks below\n //Check that a first/last tick is needed\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='below'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,-.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n\n //tmp_arrow.setArrow(true,false)\n }\n\n }\n }\n \n\n //Count years from 0 as long as the period is 8y or lower. Continue to 10 if there are 10 periods\n //or fewer. For periods over 10 year, add in the last two periods after the 8th.\n if(!(i>8 && periods>10)){\n \n if(i===0){\n if(firstTick===false){\n\n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch1'); tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch1');tickerTextAttrs.anchorY = 'bottom';}\n \n //board.create('text',[i,-lowTextY,'Year 0'],tickerTextAttrs);\n \n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch2');tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch2');tickerTextAttrs.anchorY = 'bottom';}\n\n }\n //else if(timelineType.tickText === 'payment'){\n //board.create('text',[i,textY,'Year 0
\u00a30'],tickerTextAttrs);\n //}\n else{\n \n board.create('text',[i,lowTextY,'Year 0'],tickerTextAttrs);\n \n\n }\n \n \n }\n else if(i===periods && lastTick===false){}\n else{\n \n board.create('text',[i,textY,['Year ',i.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n \n }\n else if(i===9){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',(periods-1).toString(),'
',tickerStr].join('')],tickerTextAttrs); \n }\n }\n else{\n // last period for >10 periods\n if(lastTick===true){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',periods.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n }\n }\n }\n}\n\n\n \nreturn div;\n", "type": "html", "parameters": [["periods", "number"], ["paymentStr", "string"]]}}, "advice": "

The correct formula to use for this question is the Present Value of £1 formula:

\n

\\[\\textrm{Present value of £1} = {(1+i)}^{-n}\\]

\n

Where $i$ is the interest rate and $n$ is the number of periods.

\n

\n

The Present Value of £1 formula is used to obtain the Present Value of an asset with a known Future Value. In other words, you know how much something is going to be worth in the future and want to know what it is worth now. Substituting the relevant numbers into the formula produces the Present Value of £1 for a given number of years and discounting at a given interest rate. Multiplying that number by any other Future Value will give the corresponding Present Value.

\n
    \n
  • Given Variables: Future Value, interest rate, number of years/periods
  • \n
  • Answer: Present Value
  • \n
\n

\n

Let's break it down...

\n

Substituting in the values from the question gives:

\n

\\[{(1+\\var{interest_rate})}^{-\\var{periods}}\\]

\n

\\[{=(\\var{1+interest_rate}})^{-\\var{periods}}\\]

\n

\\[=\\var{dpformat(multiplier,4,\"en\")}\\]

\n

\n

\n

Finally, you need to multiply that number by the $Capital$ to get the final answer:

\n

\\[\\textrm{Present Value} = \\var{dpformat(multiplier,4,\"en\")} \\textrm{*} £\\var{dpformat(future_value,0,\"en\")}\\]

\n

\n

Which is £{sigformat(answer,3,\"en\")} to 3 significant figures. 

\n

", "parts": [{"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "correctAnswerStyle": "plain", "prompt": "

Solve the question using the correct formula.

\n

If you are unsure of how to solve this problem, work through the steps or click 'reveal answer' to view a fully worked solution. When you are finished, use the links on the left to attempt the other questions.

\n

 

\n

In the Class Test you must state the formula, insert the numbers into the formula, show the answer, provide some advice and set out a time diagram. If you get any stages wrong, you may be awarded a mark if you show your working.

", "precision": 0, "precisionType": "dp", "variableReplacements": [], "mustBeReduced": false, "strictPrecision": true, "notationStyles": ["plain", "en", "si-en"], "precisionPartialCredit": 0, "scripts": {}, "marks": "1", "showPrecisionHint": true, "maxValue": "answer+answer*answer_tolerance", "showCorrectAnswer": true, "precisionMessage": "

You need to round your answer to the nearest £1.

", "stepsPenalty": "0", "minValue": "answer-answer*answer_tolerance", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "steps": [{"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

If you get an answer to any of the steps wrong, you can resubmit values until you are correct.

\n

Here is the time diagram:

\n

{timeline(periods,paymentStr)}

", "variableReplacements": [], "scripts": {}}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Name the formula needed to solve this question.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "dropdownlist", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

Amount of £1

", "

Present Value of £1

", "

Amount of £1 per annum

", "

Annual Sinking Fund

", "

Present Value of £1 per annum

", "

YP perp

"], "distractors": ["", "", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, 0, 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Select the correct formula.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "radiogroup", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

\\[{(1 + i)}^{n}\\]

", "

\\[{(1 + i)}^{-n}\\]

", "

\\[\\frac{{(1 + i)}^{n}-1}{i}\\]

", "

\\[\\textrm{Capital *}\\frac{i}{{(1+i)}^{n}-1}\\]

", "

\\[\\frac{1-{(1+i)}^{-n}}{i}\\]

", "

\\[\\frac{1}{i}\\]

"], "distractors": ["", "Correct", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, "0", 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Please input the values that should be substituted into the formula. Please make sure percentages are converted to decimal values (e.g. 4% should be entered as 0.04).

", "variableReplacements": [], "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "interest_rate", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

i = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "interest_rate", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "periods", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

n = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "periods", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

Substitute in the values of $n$ and $i$ and calculate the $multiplier$.

", "precision": "4", "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "mustBeReduced": false, "correctAnswerStyle": "plain", "notationStyles": ["plain", "en", "si-en"], "strictPrecision": true, "scripts": {}, "marks": ".2", "showPrecisionHint": true, "maxValue": "multiplier", "showCorrectAnswer": true, "precisionMessage": "You have not given your answer to the correct precision.", "precisionPartialCredit": "0", "minValue": "multiplier", "precisionType": "dp", "correctAnswerFraction": false}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Finally, you need to multiply that number by the $capital$ to get the final answer.

", "variableReplacements": [], "scripts": {}}]}], "tags": [], "variables": {"answer_tolerance": {"name": "answer_tolerance", "templateType": "number", "description": "", "definition": "0.01", "group": "Ungrouped variables"}, "answer": {"name": "answer", "templateType": "anything", "description": "

Present value

", "definition": "present_value", "group": "Ungrouped variables"}, "random_question": {"name": "random_question", "templateType": "anything", "description": "", "definition": "join(split(join(split(join(split(random_question_gaps, \"[future_value]\"),separatethousands(future_value,\",\")),\"[periods]\"), separatethousands(periods,\"\")),\"[interest_rate]\"),separatethousands(interest_rate*100,\"\"))\n\n\n\n\n\n\n", "group": "Ungrouped variables"}, "random_question_gaps": {"name": "random_question_gaps", "templateType": "anything", "description": "

A question selected at random from the list of questions stored in the variable questions. 

", "definition": "random(questions)", "group": "Ungrouped variables"}, "multiplier": {"name": "multiplier", "templateType": "anything", "description": "", "definition": "(1+interest_rate)^(-1*periods)", "group": "Ungrouped variables"}, "periods": {"name": "periods", "templateType": "randrange", "description": "", "definition": "random(1..25#1)", "group": "Ungrouped variables"}, "questions": {"name": "questions", "templateType": "list of strings", "description": "", "definition": "[ \"If you could receive \u00a3[future_value] in [periods] years, what would you pay for it now, assuming the time value of money is [interest_rate]%?\", \"A contact has alerted you that a prestigeous office property is due to come on the market in [periods] years time for \u00a3[future_value] . What is the present value of this sum, assuming the time value of money is [interest_rate]%?\", \"How much should you save today, in order to have \u00a3[future_value] in [periods] years time, if interest rates are [interest_rate]%?\", \"What is the present value of a future sum of \u00a3[future_value] , receivable in [periods] years, with a discount rate of [interest_rate]%?\", \"If the interest rate is [interest_rate]%, how much would you need to pay today in order to earn the right to receive \u00a3[future_value] in [periods] years? \" ]", "group": "Ungrouped variables"}, "paymentStr": {"name": "paymentStr", "templateType": "anything", "description": "", "definition": "'\u00a3'+separateThousands(future_value,',')", "group": "Ungrouped variables"}, "present_value": {"name": "present_value", "templateType": "anything", "description": "", "definition": "multiplier*future_value", "group": "Ungrouped variables"}, "interest_rate": {"name": "interest_rate", "templateType": "randrange", "description": "", "definition": "random(0.01..0.15#0.0025)", "group": "Ungrouped variables"}, "future_value": {"name": "future_value", "templateType": "randrange", "description": "", "definition": "random(1000000..70000000#500000)", "group": "Ungrouped variables"}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["periods", "interest_rate", "present_value", "answer", "future_value", "questions", "random_question_gaps", "random_question", "answer_tolerance", "multiplier", "paymentStr"], "rulesets": {}, "variable_groups": [], "preamble": {"js": "", "css": ""}, "type": "question"}, {"name": "Present Value of \u00a31", "extensions": ["jsxgraph"], "custom_part_types": [], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "contributors": [{"name": "Rory Shanahan", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/1513/"}], "statement": "

{random_question}

", "metadata": {"description": "", "licence": "None specified"}, "functions": {"timeline": {"language": "javascript", "definition": "//REVISION 20/6/17 1.50pm\n\n// Possible timeline types:\n// - Amount of \u00a31 per annum \n\n\nvar A1PA = {\n \n startPoint : 'none',\n startPointArrow : 'up',\n endPoint : 'below',\n endPointArrow : 'down',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'end',\n \n }; \n\n// - Amount of \u00a31\n\n\nvar A1 = {\n \n startPoint : 'above',\n startPointArrow : 'up',\n startPointText : 'payment_str',\n endPoint : 'below',\n endPointArrow : 'down',\n endPointText : 'none',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'end',\n \n };\n\n\n// - Present value of \u00a31 per annum\n\nvar PV1PA = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n// - Present value of \u00a31\nvar PV1 = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n startPointText : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'start',\n \n };\n\n\n// - Annual sink fund\nvar ASF = {\n \n startPoint : 'none',\n startPointArrow : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'below',\n tickText : 'qMarks',\n qmark : 'none',\n \n };\n\n\n// Years purchase in perpetuity\n\nvar YPP = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'inf',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n//// SPECIFY TYPE OF TIMELINE HERE\n\nvar timelineType = PV1;\n\n\nvar XLineAttrs = {\n strokeColor: 'black',\n fixed: true,\n strokeWidth: 3,\n straightFirst: false,\n straightLast: false,\n }\n\nvar startEndAttrs = {\n strokeColor: 'black', \n fixed: true, \n strokeWidth: 4\n }\n\n// End point for arrow\nvar endPointX = periods;\n\nif(timelineType.end === 'inf'){\n periods = 11;\n}\n\n// Constrain the graph to 10 periods in width\nif(periods<=10){\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, periods + 0.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n \n var board = div.board;\n board.create('line', [[0,0],[periods,0]], XLineAttrs);\n \n \n\n}\nelse{\n \n \n endPointX = 10;\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, 10.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n var board = div.board;\n \n //time break line segments\n var timeBreakSegmentCoords = [\n [[0,0],[8.4,0]], \n [[8.4,0],[8.5,.3]],\n [[8.5,.3],[8.7,-.4]],\n [[8.7,-.4],[8.8,0]],\n [[8.8,0],[10,0]]\n ]; \n \n board.create('line',timeBreakSegmentCoords[0],XLineAttrs);\n board.create('line',timeBreakSegmentCoords[4],XLineAttrs);\n \n for(i=1;i=10){\n qmarkX = 10;\n \n }\n else{\n qmarkX = periods;\n }\n \n if(timelineType.endPoint=='above'){\n qmarkY = .75;\n }\n else if (timelineType.endPoint=='below'){\n qmarkY = -.75;\n }\n else{\n qmarkY = -.4;\n }\n \n break;\n \n case 'none':\n qmarkRequired = false;\n break;\n}\n\n\n\nif(qmarkRequired === true){\n var qMarkAttrs = {\n anchorX: 'middle',\n fontSize : 28,\n fixed : true,\n }\n \n board.create('text',[qmarkX,qmarkY,'?'],qMarkAttrs); \n \n}\n\n \n\nvar firstTick = true;\nvar lastTick = true;\n\n\n// Draw start/end arrows\nvar startEndLength = .6;\n\nvar startEndTextAttrs = {\n anchorX: 'middle',\n anchorY: 'middle',\n fontSize : 12,\n fixed : true,\n }\n\n\nvar paymentStrStyled = \"

+*

\".replace('*',paymentStr);\n\n\nif((timelineType.startPoint === 'above') || (timelineType.startPoint === 'below')) {\n paymentStrStart = paymentStrStyled.replace('+','Year 0
');\n}\n\nif ((timelineType.endPoint === 'above') || (timelineType.endPoint === 'below')){\n paymentStrEnd = paymentStrStyled.replace('+',['Year ',periods.toString(), '
'].join(''));\n}\n\n\nswitch(timelineType.startPoint){\n \n case 'above':\n \n var startPoint = board.create('arrow',[[0,startEndLength],[0,0]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n firstTick = false;\n }\n break;\n \n case 'below':\n \n var startPoint = board.create('arrow',[[0,0],[0,-startEndLength]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,-.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n firstTick = false;\n }\n break;\n \n}\n\n\n\nswitch(timelineType.endPoint){\n \n case 'above':\n var endPoint = board.create('arrow',[[endPointX,startEndLength],[endPointX,0]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n lastTick = false;\n }\n break;\n \n case 'below':\n var endPoint = board.create('arrow',[[endPointX,0],[endPointX,-startEndLength]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n if(periods<10)\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n lastTick = false;\n }\n break;\n \n}\n\nconsole.log(lastTick);\n\n// Reverse arrow head direction in needed\nif(timelineType.endPointArrow === 'up' && timelineType.endPoint !== 'none'){\n endPoint.setArrow(true,false)\n}\n\nif(timelineType.startPointArrow === 'up' && timelineType.startPoint !== 'none'){\n startPoint.setArrow(true,false)\n}\n\n \n// Insert smaller ticks if needed\nvar tickerStr;\nvar tmp_arrow;\n\n\nvar tickerTextAttrs = {\n anchorX: 'middle',\n anchorY: 'top',\n fontSize : 11,\n fixed : true,\n }\n\nif(timelineType.tickText === 'qMarks'){\n tickerStr = '

\u00a3?

';\n}\nelse if(timelineType.tickText === 'payment'){\n tickerStr = paymentStr;\n}\nelse{\n tickerStr = '';\n}\n\nif(timelineType.ticks !== 'none'){\n \n var lowTextY = .05;\n var textY;\n var smallArrows = true;\n\n switch(timelineType.ticks){\n case 'above':\n textY = 0.45;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below':\n textY = -0.45;\n lowTextY = -.05;\n break;\n case 'above-low':\n textY = .05;\n smallArrows = false;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below-low':\n textY = -.05;\n smallArrows = false;\n break;\n }\n \n\n \n for(i=0;i<=periods;i++){\n \n if(smallArrows === true){\n \n if(timelineType.ticks === 'above'){\n //Check that a first/last tick is needed\n\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='above'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n }\n }\n else{ //ticks below\n //Check that a first/last tick is needed\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='below'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,-.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n\n //tmp_arrow.setArrow(true,false)\n }\n\n }\n }\n \n\n //Count years from 0 as long as the period is 8y or lower. Continue to 10 if there are 10 periods\n //or fewer. For periods over 10 year, add in the last two periods after the 8th.\n if(!(i>8 && periods>10)){\n \n if(i===0){\n if(firstTick===false){\n\n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch1'); tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch1');tickerTextAttrs.anchorY = 'bottom';}\n \n //board.create('text',[i,-lowTextY,'Year 0'],tickerTextAttrs);\n \n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch2');tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch2');tickerTextAttrs.anchorY = 'bottom';}\n\n }\n //else if(timelineType.tickText === 'payment'){\n //board.create('text',[i,textY,'Year 0
\u00a30'],tickerTextAttrs);\n //}\n else{\n \n board.create('text',[i,lowTextY,'Year 0'],tickerTextAttrs);\n \n\n }\n \n \n }\n else if(i===periods && lastTick===false){}\n else{\n \n board.create('text',[i,textY,['Year ',i.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n \n }\n else if(i===9){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',(periods-1).toString(),'
',tickerStr].join('')],tickerTextAttrs); \n }\n }\n else{\n // last period for >10 periods\n if(lastTick===true){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',periods.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n }\n }\n }\n}\n\n\n \nreturn div;\n", "type": "html", "parameters": [["periods", "number"], ["paymentStr", "string"]]}}, "advice": "

The correct formula to use for this question is the Present Value of £1 formula:

\n

\\[\\textrm{Present value of £1} = {(1+i)}^{-n}\\]

\n

Where $i$ is the interest rate and $n$ is the number of periods.

\n

\n

The Present Value of £1 formula is used to obtain the Present Value of an asset with a known Future Value. In other words, you know how much something is going to be worth in the future and want to know what it is worth now. Substituting the relevant numbers into the formula produces the Present Value of £1 for a given number of years and discounting at a given interest rate. Multiplying that number by any other Future Value will give the corresponding Present Value.

\n
    \n
  • Given Variables: Future Value, interest rate, number of years/periods
  • \n
  • Answer: Present Value
  • \n
\n

\n

Let's break it down...

\n

Substituting in the values from the question gives:

\n

\\[{(1+\\var{interest_rate})}^{-\\var{periods}}\\]

\n

\\[{=(\\var{1+interest_rate}})^{-\\var{periods}}\\]

\n

\\[=\\var{dpformat(multiplier,4,\"en\")}\\]

\n

\n

\n

Finally, you need to multiply that number by the $Capital$ to get the final answer:

\n

\\[\\textrm{Present Value} = \\var{dpformat(multiplier,4,\"en\")} \\textrm{*} £\\var{dpformat(future_value,0,\"en\")}\\]

\n

\n

Which is £{sigformat(answer,3,\"en\")} to 3 significant figures. 

\n

", "parts": [{"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "correctAnswerStyle": "plain", "prompt": "

Solve the question using the correct formula.

\n

If you are unsure of how to solve this problem, work through the steps or click 'reveal answer' to view a fully worked solution. When you are finished, use the links on the left to attempt the other questions.

\n

 

\n

In the Class Test you must state the formula, insert the numbers into the formula, show the answer, provide some advice and set out a time diagram. If you get any stages wrong, you may be awarded a mark if you show your working.

", "precision": 0, "precisionType": "dp", "variableReplacements": [], "mustBeReduced": false, "strictPrecision": true, "notationStyles": ["plain", "en", "si-en"], "precisionPartialCredit": 0, "scripts": {}, "marks": "1", "showPrecisionHint": true, "maxValue": "answer+answer*answer_tolerance", "showCorrectAnswer": true, "precisionMessage": "

You need to round your answer to the nearest £1.

", "stepsPenalty": "0", "minValue": "answer-answer*answer_tolerance", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "steps": [{"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

If you get an answer to any of the steps wrong, you can resubmit values until you are correct.

\n

Here is the time diagram:

\n

{timeline(periods,paymentStr)}

", "variableReplacements": [], "scripts": {}}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Name the formula needed to solve this question.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "dropdownlist", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

Amount of £1

", "

Present Value of £1

", "

Amount of £1 per annum

", "

Annual Sinking Fund

", "

Present Value of £1 per annum

", "

YP perp

"], "distractors": ["", "", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, 0, 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Select the correct formula.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "radiogroup", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

\\[{(1 + i)}^{n}\\]

", "

\\[{(1 + i)}^{-n}\\]

", "

\\[\\frac{{(1 + i)}^{n}-1}{i}\\]

", "

\\[\\textrm{Capital *}\\frac{i}{{(1+i)}^{n}-1}\\]

", "

\\[\\frac{1-{(1+i)}^{-n}}{i}\\]

", "

\\[\\frac{1}{i}\\]

"], "distractors": ["", "Correct", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, "0", 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Please input the values that should be substituted into the formula. Please make sure percentages are converted to decimal values (e.g. 4% should be entered as 0.04).

", "variableReplacements": [], "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "interest_rate", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

i = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "interest_rate", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "periods", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

n = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "periods", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

Substitute in the values of $n$ and $i$ and calculate the $multiplier$.

", "precision": "4", "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "mustBeReduced": false, "correctAnswerStyle": "plain", "notationStyles": ["plain", "en", "si-en"], "strictPrecision": true, "scripts": {}, "marks": ".2", "showPrecisionHint": true, "maxValue": "multiplier", "showCorrectAnswer": true, "precisionMessage": "You have not given your answer to the correct precision.", "precisionPartialCredit": "0", "minValue": "multiplier", "precisionType": "dp", "correctAnswerFraction": false}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Finally, you need to multiply that number by the $capital$ to get the final answer.

", "variableReplacements": [], "scripts": {}}]}], "tags": [], "variables": {"answer_tolerance": {"name": "answer_tolerance", "templateType": "number", "description": "", "definition": "0.01", "group": "Ungrouped variables"}, "answer": {"name": "answer", "templateType": "anything", "description": "

Present value

", "definition": "present_value", "group": "Ungrouped variables"}, "random_question": {"name": "random_question", "templateType": "anything", "description": "", "definition": "join(split(join(split(join(split(random_question_gaps, \"[future_value]\"),separatethousands(future_value,\",\")),\"[periods]\"), separatethousands(periods,\"\")),\"[interest_rate]\"),separatethousands(interest_rate*100,\"\"))\n\n\n\n\n\n\n", "group": "Ungrouped variables"}, "random_question_gaps": {"name": "random_question_gaps", "templateType": "anything", "description": "

A question selected at random from the list of questions stored in the variable questions. 

", "definition": "random(questions)", "group": "Ungrouped variables"}, "multiplier": {"name": "multiplier", "templateType": "anything", "description": "", "definition": "(1+interest_rate)^(-1*periods)", "group": "Ungrouped variables"}, "periods": {"name": "periods", "templateType": "randrange", "description": "", "definition": "random(1..25#1)", "group": "Ungrouped variables"}, "questions": {"name": "questions", "templateType": "list of strings", "description": "", "definition": "[ \"If you could receive \u00a3[future_value] in [periods] years, what would you pay for it now, assuming the time value of money is [interest_rate]%?\", \"A contact has alerted you that a prestigeous office property is due to come on the market in [periods] years time for \u00a3[future_value] . What is the present value of this sum, assuming the time value of money is [interest_rate]%?\", \"How much should you save today, in order to have \u00a3[future_value] in [periods] years time, if interest rates are [interest_rate]%?\", \"What is the present value of a future sum of \u00a3[future_value] , receivable in [periods] years, with a discount rate of [interest_rate]%?\", \"If the interest rate is [interest_rate]%, how much would you need to pay today in order to earn the right to receive \u00a3[future_value] in [periods] years? \" ]", "group": "Ungrouped variables"}, "paymentStr": {"name": "paymentStr", "templateType": "anything", "description": "", "definition": "'\u00a3'+separateThousands(future_value,',')", "group": "Ungrouped variables"}, "present_value": {"name": "present_value", "templateType": "anything", "description": "", "definition": "multiplier*future_value", "group": "Ungrouped variables"}, "interest_rate": {"name": "interest_rate", "templateType": "randrange", "description": "", "definition": "random(0.01..0.15#0.0025)", "group": "Ungrouped variables"}, "future_value": {"name": "future_value", "templateType": "randrange", "description": "", "definition": "random(1000000..70000000#500000)", "group": "Ungrouped variables"}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["periods", "interest_rate", "present_value", "answer", "future_value", "questions", "random_question_gaps", "random_question", "answer_tolerance", "multiplier", "paymentStr"], "rulesets": {}, "variable_groups": [], "preamble": {"js": "", "css": ""}, "type": "question"}, {"name": "Present Value of \u00a31", "extensions": ["jsxgraph"], "custom_part_types": [], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "contributors": [{"name": "Rory Shanahan", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/1513/"}], "statement": "

{random_question}

", "metadata": {"description": "", "licence": "None specified"}, "functions": {"timeline": {"language": "javascript", "definition": "//REVISION 20/6/17 1.50pm\n\n// Possible timeline types:\n// - Amount of \u00a31 per annum \n\n\nvar A1PA = {\n \n startPoint : 'none',\n startPointArrow : 'up',\n endPoint : 'below',\n endPointArrow : 'down',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'end',\n \n }; \n\n// - Amount of \u00a31\n\n\nvar A1 = {\n \n startPoint : 'above',\n startPointArrow : 'up',\n startPointText : 'payment_str',\n endPoint : 'below',\n endPointArrow : 'down',\n endPointText : 'none',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'end',\n \n };\n\n\n// - Present value of \u00a31 per annum\n\nvar PV1PA = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n// - Present value of \u00a31\nvar PV1 = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n startPointText : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'start',\n \n };\n\n\n// - Annual sink fund\nvar ASF = {\n \n startPoint : 'none',\n startPointArrow : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'below',\n tickText : 'qMarks',\n qmark : 'none',\n \n };\n\n\n// Years purchase in perpetuity\n\nvar YPP = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'inf',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n//// SPECIFY TYPE OF TIMELINE HERE\n\nvar timelineType = PV1;\n\n\nvar XLineAttrs = {\n strokeColor: 'black',\n fixed: true,\n strokeWidth: 3,\n straightFirst: false,\n straightLast: false,\n }\n\nvar startEndAttrs = {\n strokeColor: 'black', \n fixed: true, \n strokeWidth: 4\n }\n\n// End point for arrow\nvar endPointX = periods;\n\nif(timelineType.end === 'inf'){\n periods = 11;\n}\n\n// Constrain the graph to 10 periods in width\nif(periods<=10){\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, periods + 0.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n \n var board = div.board;\n board.create('line', [[0,0],[periods,0]], XLineAttrs);\n \n \n\n}\nelse{\n \n \n endPointX = 10;\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, 10.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n var board = div.board;\n \n //time break line segments\n var timeBreakSegmentCoords = [\n [[0,0],[8.4,0]], \n [[8.4,0],[8.5,.3]],\n [[8.5,.3],[8.7,-.4]],\n [[8.7,-.4],[8.8,0]],\n [[8.8,0],[10,0]]\n ]; \n \n board.create('line',timeBreakSegmentCoords[0],XLineAttrs);\n board.create('line',timeBreakSegmentCoords[4],XLineAttrs);\n \n for(i=1;i=10){\n qmarkX = 10;\n \n }\n else{\n qmarkX = periods;\n }\n \n if(timelineType.endPoint=='above'){\n qmarkY = .75;\n }\n else if (timelineType.endPoint=='below'){\n qmarkY = -.75;\n }\n else{\n qmarkY = -.4;\n }\n \n break;\n \n case 'none':\n qmarkRequired = false;\n break;\n}\n\n\n\nif(qmarkRequired === true){\n var qMarkAttrs = {\n anchorX: 'middle',\n fontSize : 28,\n fixed : true,\n }\n \n board.create('text',[qmarkX,qmarkY,'?'],qMarkAttrs); \n \n}\n\n \n\nvar firstTick = true;\nvar lastTick = true;\n\n\n// Draw start/end arrows\nvar startEndLength = .6;\n\nvar startEndTextAttrs = {\n anchorX: 'middle',\n anchorY: 'middle',\n fontSize : 12,\n fixed : true,\n }\n\n\nvar paymentStrStyled = \"

+*

\".replace('*',paymentStr);\n\n\nif((timelineType.startPoint === 'above') || (timelineType.startPoint === 'below')) {\n paymentStrStart = paymentStrStyled.replace('+','Year 0
');\n}\n\nif ((timelineType.endPoint === 'above') || (timelineType.endPoint === 'below')){\n paymentStrEnd = paymentStrStyled.replace('+',['Year ',periods.toString(), '
'].join(''));\n}\n\n\nswitch(timelineType.startPoint){\n \n case 'above':\n \n var startPoint = board.create('arrow',[[0,startEndLength],[0,0]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n firstTick = false;\n }\n break;\n \n case 'below':\n \n var startPoint = board.create('arrow',[[0,0],[0,-startEndLength]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,-.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n firstTick = false;\n }\n break;\n \n}\n\n\n\nswitch(timelineType.endPoint){\n \n case 'above':\n var endPoint = board.create('arrow',[[endPointX,startEndLength],[endPointX,0]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n lastTick = false;\n }\n break;\n \n case 'below':\n var endPoint = board.create('arrow',[[endPointX,0],[endPointX,-startEndLength]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n if(periods<10)\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n lastTick = false;\n }\n break;\n \n}\n\nconsole.log(lastTick);\n\n// Reverse arrow head direction in needed\nif(timelineType.endPointArrow === 'up' && timelineType.endPoint !== 'none'){\n endPoint.setArrow(true,false)\n}\n\nif(timelineType.startPointArrow === 'up' && timelineType.startPoint !== 'none'){\n startPoint.setArrow(true,false)\n}\n\n \n// Insert smaller ticks if needed\nvar tickerStr;\nvar tmp_arrow;\n\n\nvar tickerTextAttrs = {\n anchorX: 'middle',\n anchorY: 'top',\n fontSize : 11,\n fixed : true,\n }\n\nif(timelineType.tickText === 'qMarks'){\n tickerStr = '

\u00a3?

';\n}\nelse if(timelineType.tickText === 'payment'){\n tickerStr = paymentStr;\n}\nelse{\n tickerStr = '';\n}\n\nif(timelineType.ticks !== 'none'){\n \n var lowTextY = .05;\n var textY;\n var smallArrows = true;\n\n switch(timelineType.ticks){\n case 'above':\n textY = 0.45;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below':\n textY = -0.45;\n lowTextY = -.05;\n break;\n case 'above-low':\n textY = .05;\n smallArrows = false;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below-low':\n textY = -.05;\n smallArrows = false;\n break;\n }\n \n\n \n for(i=0;i<=periods;i++){\n \n if(smallArrows === true){\n \n if(timelineType.ticks === 'above'){\n //Check that a first/last tick is needed\n\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='above'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n }\n }\n else{ //ticks below\n //Check that a first/last tick is needed\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='below'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,-.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n\n //tmp_arrow.setArrow(true,false)\n }\n\n }\n }\n \n\n //Count years from 0 as long as the period is 8y or lower. Continue to 10 if there are 10 periods\n //or fewer. For periods over 10 year, add in the last two periods after the 8th.\n if(!(i>8 && periods>10)){\n \n if(i===0){\n if(firstTick===false){\n\n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch1'); tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch1');tickerTextAttrs.anchorY = 'bottom';}\n \n //board.create('text',[i,-lowTextY,'Year 0'],tickerTextAttrs);\n \n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch2');tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch2');tickerTextAttrs.anchorY = 'bottom';}\n\n }\n //else if(timelineType.tickText === 'payment'){\n //board.create('text',[i,textY,'Year 0
\u00a30'],tickerTextAttrs);\n //}\n else{\n \n board.create('text',[i,lowTextY,'Year 0'],tickerTextAttrs);\n \n\n }\n \n \n }\n else if(i===periods && lastTick===false){}\n else{\n \n board.create('text',[i,textY,['Year ',i.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n \n }\n else if(i===9){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',(periods-1).toString(),'
',tickerStr].join('')],tickerTextAttrs); \n }\n }\n else{\n // last period for >10 periods\n if(lastTick===true){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',periods.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n }\n }\n }\n}\n\n\n \nreturn div;\n", "type": "html", "parameters": [["periods", "number"], ["paymentStr", "string"]]}}, "advice": "

The correct formula to use for this question is the Present Value of £1 formula:

\n

\\[\\textrm{Present value of £1} = {(1+i)}^{-n}\\]

\n

Where $i$ is the interest rate and $n$ is the number of periods.

\n

\n

The Present Value of £1 formula is used to obtain the Present Value of an asset with a known Future Value. In other words, you know how much something is going to be worth in the future and want to know what it is worth now. Substituting the relevant numbers into the formula produces the Present Value of £1 for a given number of years and discounting at a given interest rate. Multiplying that number by any other Future Value will give the corresponding Present Value.

\n
    \n
  • Given Variables: Future Value, interest rate, number of years/periods
  • \n
  • Answer: Present Value
  • \n
\n

\n

Let's break it down...

\n

Substituting in the values from the question gives:

\n

\\[{(1+\\var{interest_rate})}^{-\\var{periods}}\\]

\n

\\[{=(\\var{1+interest_rate}})^{-\\var{periods}}\\]

\n

\\[=\\var{dpformat(multiplier,4,\"en\")}\\]

\n

\n

\n

Finally, you need to multiply that number by the $Capital$ to get the final answer:

\n

\\[\\textrm{Present Value} = \\var{dpformat(multiplier,4,\"en\")} \\textrm{*} £\\var{dpformat(future_value,0,\"en\")}\\]

\n

\n

Which is £{sigformat(answer,3,\"en\")} to 3 significant figures. 

\n

", "parts": [{"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "correctAnswerStyle": "plain", "prompt": "

Solve the question using the correct formula.

\n

If you are unsure of how to solve this problem, work through the steps or click 'reveal answer' to view a fully worked solution. When you are finished, use the links on the left to attempt the other questions.

\n

 

\n

In the Class Test you must state the formula, insert the numbers into the formula, show the answer, provide some advice and set out a time diagram. If you get any stages wrong, you may be awarded a mark if you show your working.

", "precision": 0, "precisionType": "dp", "variableReplacements": [], "mustBeReduced": false, "strictPrecision": true, "notationStyles": ["plain", "en", "si-en"], "precisionPartialCredit": 0, "scripts": {}, "marks": "1", "showPrecisionHint": true, "maxValue": "answer+answer*answer_tolerance", "showCorrectAnswer": true, "precisionMessage": "

You need to round your answer to the nearest £1.

", "stepsPenalty": "0", "minValue": "answer-answer*answer_tolerance", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "steps": [{"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

If you get an answer to any of the steps wrong, you can resubmit values until you are correct.

\n

Here is the time diagram:

\n

{timeline(periods,paymentStr)}

", "variableReplacements": [], "scripts": {}}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Name the formula needed to solve this question.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "dropdownlist", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

Amount of £1

", "

Present Value of £1

", "

Amount of £1 per annum

", "

Annual Sinking Fund

", "

Present Value of £1 per annum

", "

YP perp

"], "distractors": ["", "", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, 0, 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Select the correct formula.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "radiogroup", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

\\[{(1 + i)}^{n}\\]

", "

\\[{(1 + i)}^{-n}\\]

", "

\\[\\frac{{(1 + i)}^{n}-1}{i}\\]

", "

\\[\\textrm{Capital *}\\frac{i}{{(1+i)}^{n}-1}\\]

", "

\\[\\frac{1-{(1+i)}^{-n}}{i}\\]

", "

\\[\\frac{1}{i}\\]

"], "distractors": ["", "Correct", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, "0", 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Please input the values that should be substituted into the formula. Please make sure percentages are converted to decimal values (e.g. 4% should be entered as 0.04).

", "variableReplacements": [], "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "interest_rate", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

i = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "interest_rate", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "periods", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

n = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "periods", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

Substitute in the values of $n$ and $i$ and calculate the $multiplier$.

", "precision": "4", "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "mustBeReduced": false, "correctAnswerStyle": "plain", "notationStyles": ["plain", "en", "si-en"], "strictPrecision": true, "scripts": {}, "marks": ".2", "showPrecisionHint": true, "maxValue": "multiplier", "showCorrectAnswer": true, "precisionMessage": "You have not given your answer to the correct precision.", "precisionPartialCredit": "0", "minValue": "multiplier", "precisionType": "dp", "correctAnswerFraction": false}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Finally, you need to multiply that number by the $capital$ to get the final answer.

", "variableReplacements": [], "scripts": {}}]}], "tags": [], "variables": {"answer_tolerance": {"name": "answer_tolerance", "templateType": "number", "description": "", "definition": "0.01", "group": "Ungrouped variables"}, "answer": {"name": "answer", "templateType": "anything", "description": "

Present value

", "definition": "present_value", "group": "Ungrouped variables"}, "random_question": {"name": "random_question", "templateType": "anything", "description": "", "definition": "join(split(join(split(join(split(random_question_gaps, \"[future_value]\"),separatethousands(future_value,\",\")),\"[periods]\"), separatethousands(periods,\"\")),\"[interest_rate]\"),separatethousands(interest_rate*100,\"\"))\n\n\n\n\n\n\n", "group": "Ungrouped variables"}, "random_question_gaps": {"name": "random_question_gaps", "templateType": "anything", "description": "

A question selected at random from the list of questions stored in the variable questions. 

", "definition": "random(questions)", "group": "Ungrouped variables"}, "multiplier": {"name": "multiplier", "templateType": "anything", "description": "", "definition": "(1+interest_rate)^(-1*periods)", "group": "Ungrouped variables"}, "periods": {"name": "periods", "templateType": "randrange", "description": "", "definition": "random(1..25#1)", "group": "Ungrouped variables"}, "questions": {"name": "questions", "templateType": "list of strings", "description": "", "definition": "[ \"If you could receive \u00a3[future_value] in [periods] years, what would you pay for it now, assuming the time value of money is [interest_rate]%?\", \"A contact has alerted you that a prestigeous office property is due to come on the market in [periods] years time for \u00a3[future_value] . What is the present value of this sum, assuming the time value of money is [interest_rate]%?\", \"How much should you save today, in order to have \u00a3[future_value] in [periods] years time, if interest rates are [interest_rate]%?\", \"What is the present value of a future sum of \u00a3[future_value] , receivable in [periods] years, with a discount rate of [interest_rate]%?\", \"If the interest rate is [interest_rate]%, how much would you need to pay today in order to earn the right to receive \u00a3[future_value] in [periods] years? \" ]", "group": "Ungrouped variables"}, "paymentStr": {"name": "paymentStr", "templateType": "anything", "description": "", "definition": "'\u00a3'+separateThousands(future_value,',')", "group": "Ungrouped variables"}, "present_value": {"name": "present_value", "templateType": "anything", "description": "", "definition": "multiplier*future_value", "group": "Ungrouped variables"}, "interest_rate": {"name": "interest_rate", "templateType": "randrange", "description": "", "definition": "random(0.01..0.15#0.0025)", "group": "Ungrouped variables"}, "future_value": {"name": "future_value", "templateType": "randrange", "description": "", "definition": "random(1000000..70000000#500000)", "group": "Ungrouped variables"}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["periods", "interest_rate", "present_value", "answer", "future_value", "questions", "random_question_gaps", "random_question", "answer_tolerance", "multiplier", "paymentStr"], "rulesets": {}, "variable_groups": [], "preamble": {"js": "", "css": ""}, "type": "question"}, {"name": "Present Value of \u00a31", "extensions": ["jsxgraph"], "custom_part_types": [], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "contributors": [{"name": "Rory Shanahan", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/1513/"}], "statement": "

{random_question}

", "metadata": {"description": "", "licence": "None specified"}, "functions": {"timeline": {"language": "javascript", "definition": "//REVISION 20/6/17 1.50pm\n\n// Possible timeline types:\n// - Amount of \u00a31 per annum \n\n\nvar A1PA = {\n \n startPoint : 'none',\n startPointArrow : 'up',\n endPoint : 'below',\n endPointArrow : 'down',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'end',\n \n }; \n\n// - Amount of \u00a31\n\n\nvar A1 = {\n \n startPoint : 'above',\n startPointArrow : 'up',\n startPointText : 'payment_str',\n endPoint : 'below',\n endPointArrow : 'down',\n endPointText : 'none',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'end',\n \n };\n\n\n// - Present value of \u00a31 per annum\n\nvar PV1PA = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n// - Present value of \u00a31\nvar PV1 = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n startPointText : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'start',\n \n };\n\n\n// - Annual sink fund\nvar ASF = {\n \n startPoint : 'none',\n startPointArrow : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'below',\n tickText : 'qMarks',\n qmark : 'none',\n \n };\n\n\n// Years purchase in perpetuity\n\nvar YPP = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'inf',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n//// SPECIFY TYPE OF TIMELINE HERE\n\nvar timelineType = PV1;\n\n\nvar XLineAttrs = {\n strokeColor: 'black',\n fixed: true,\n strokeWidth: 3,\n straightFirst: false,\n straightLast: false,\n }\n\nvar startEndAttrs = {\n strokeColor: 'black', \n fixed: true, \n strokeWidth: 4\n }\n\n// End point for arrow\nvar endPointX = periods;\n\nif(timelineType.end === 'inf'){\n periods = 11;\n}\n\n// Constrain the graph to 10 periods in width\nif(periods<=10){\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, periods + 0.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n \n var board = div.board;\n board.create('line', [[0,0],[periods,0]], XLineAttrs);\n \n \n\n}\nelse{\n \n \n endPointX = 10;\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, 10.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n var board = div.board;\n \n //time break line segments\n var timeBreakSegmentCoords = [\n [[0,0],[8.4,0]], \n [[8.4,0],[8.5,.3]],\n [[8.5,.3],[8.7,-.4]],\n [[8.7,-.4],[8.8,0]],\n [[8.8,0],[10,0]]\n ]; \n \n board.create('line',timeBreakSegmentCoords[0],XLineAttrs);\n board.create('line',timeBreakSegmentCoords[4],XLineAttrs);\n \n for(i=1;i=10){\n qmarkX = 10;\n \n }\n else{\n qmarkX = periods;\n }\n \n if(timelineType.endPoint=='above'){\n qmarkY = .75;\n }\n else if (timelineType.endPoint=='below'){\n qmarkY = -.75;\n }\n else{\n qmarkY = -.4;\n }\n \n break;\n \n case 'none':\n qmarkRequired = false;\n break;\n}\n\n\n\nif(qmarkRequired === true){\n var qMarkAttrs = {\n anchorX: 'middle',\n fontSize : 28,\n fixed : true,\n }\n \n board.create('text',[qmarkX,qmarkY,'?'],qMarkAttrs); \n \n}\n\n \n\nvar firstTick = true;\nvar lastTick = true;\n\n\n// Draw start/end arrows\nvar startEndLength = .6;\n\nvar startEndTextAttrs = {\n anchorX: 'middle',\n anchorY: 'middle',\n fontSize : 12,\n fixed : true,\n }\n\n\nvar paymentStrStyled = \"

+*

\".replace('*',paymentStr);\n\n\nif((timelineType.startPoint === 'above') || (timelineType.startPoint === 'below')) {\n paymentStrStart = paymentStrStyled.replace('+','Year 0
');\n}\n\nif ((timelineType.endPoint === 'above') || (timelineType.endPoint === 'below')){\n paymentStrEnd = paymentStrStyled.replace('+',['Year ',periods.toString(), '
'].join(''));\n}\n\n\nswitch(timelineType.startPoint){\n \n case 'above':\n \n var startPoint = board.create('arrow',[[0,startEndLength],[0,0]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n firstTick = false;\n }\n break;\n \n case 'below':\n \n var startPoint = board.create('arrow',[[0,0],[0,-startEndLength]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,-.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n firstTick = false;\n }\n break;\n \n}\n\n\n\nswitch(timelineType.endPoint){\n \n case 'above':\n var endPoint = board.create('arrow',[[endPointX,startEndLength],[endPointX,0]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n lastTick = false;\n }\n break;\n \n case 'below':\n var endPoint = board.create('arrow',[[endPointX,0],[endPointX,-startEndLength]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n if(periods<10)\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n lastTick = false;\n }\n break;\n \n}\n\nconsole.log(lastTick);\n\n// Reverse arrow head direction in needed\nif(timelineType.endPointArrow === 'up' && timelineType.endPoint !== 'none'){\n endPoint.setArrow(true,false)\n}\n\nif(timelineType.startPointArrow === 'up' && timelineType.startPoint !== 'none'){\n startPoint.setArrow(true,false)\n}\n\n \n// Insert smaller ticks if needed\nvar tickerStr;\nvar tmp_arrow;\n\n\nvar tickerTextAttrs = {\n anchorX: 'middle',\n anchorY: 'top',\n fontSize : 11,\n fixed : true,\n }\n\nif(timelineType.tickText === 'qMarks'){\n tickerStr = '

\u00a3?

';\n}\nelse if(timelineType.tickText === 'payment'){\n tickerStr = paymentStr;\n}\nelse{\n tickerStr = '';\n}\n\nif(timelineType.ticks !== 'none'){\n \n var lowTextY = .05;\n var textY;\n var smallArrows = true;\n\n switch(timelineType.ticks){\n case 'above':\n textY = 0.45;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below':\n textY = -0.45;\n lowTextY = -.05;\n break;\n case 'above-low':\n textY = .05;\n smallArrows = false;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below-low':\n textY = -.05;\n smallArrows = false;\n break;\n }\n \n\n \n for(i=0;i<=periods;i++){\n \n if(smallArrows === true){\n \n if(timelineType.ticks === 'above'){\n //Check that a first/last tick is needed\n\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='above'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n }\n }\n else{ //ticks below\n //Check that a first/last tick is needed\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='below'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,-.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n\n //tmp_arrow.setArrow(true,false)\n }\n\n }\n }\n \n\n //Count years from 0 as long as the period is 8y or lower. Continue to 10 if there are 10 periods\n //or fewer. For periods over 10 year, add in the last two periods after the 8th.\n if(!(i>8 && periods>10)){\n \n if(i===0){\n if(firstTick===false){\n\n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch1'); tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch1');tickerTextAttrs.anchorY = 'bottom';}\n \n //board.create('text',[i,-lowTextY,'Year 0'],tickerTextAttrs);\n \n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch2');tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch2');tickerTextAttrs.anchorY = 'bottom';}\n\n }\n //else if(timelineType.tickText === 'payment'){\n //board.create('text',[i,textY,'Year 0
\u00a30'],tickerTextAttrs);\n //}\n else{\n \n board.create('text',[i,lowTextY,'Year 0'],tickerTextAttrs);\n \n\n }\n \n \n }\n else if(i===periods && lastTick===false){}\n else{\n \n board.create('text',[i,textY,['Year ',i.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n \n }\n else if(i===9){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',(periods-1).toString(),'
',tickerStr].join('')],tickerTextAttrs); \n }\n }\n else{\n // last period for >10 periods\n if(lastTick===true){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',periods.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n }\n }\n }\n}\n\n\n \nreturn div;\n", "type": "html", "parameters": [["periods", "number"], ["paymentStr", "string"]]}}, "advice": "

The correct formula to use for this question is the Present Value of £1 formula:

\n

\\[\\textrm{Present value of £1} = {(1+i)}^{-n}\\]

\n

Where $i$ is the interest rate and $n$ is the number of periods.

\n

\n

The Present Value of £1 formula is used to obtain the Present Value of an asset with a known Future Value. In other words, you know how much something is going to be worth in the future and want to know what it is worth now. Substituting the relevant numbers into the formula produces the Present Value of £1 for a given number of years and discounting at a given interest rate. Multiplying that number by any other Future Value will give the corresponding Present Value.

\n
    \n
  • Given Variables: Future Value, interest rate, number of years/periods
  • \n
  • Answer: Present Value
  • \n
\n

\n

Let's break it down...

\n

Substituting in the values from the question gives:

\n

\\[{(1+\\var{interest_rate})}^{-\\var{periods}}\\]

\n

\\[{=(\\var{1+interest_rate}})^{-\\var{periods}}\\]

\n

\\[=\\var{dpformat(multiplier,4,\"en\")}\\]

\n

\n

\n

Finally, you need to multiply that number by the $Capital$ to get the final answer:

\n

\\[\\textrm{Present Value} = \\var{dpformat(multiplier,4,\"en\")} \\textrm{*} £\\var{dpformat(future_value,0,\"en\")}\\]

\n

\n

Which is £{sigformat(answer,3,\"en\")} to 3 significant figures. 

\n

", "parts": [{"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "correctAnswerStyle": "plain", "prompt": "

Solve the question using the correct formula.

\n

If you are unsure of how to solve this problem, work through the steps or click 'reveal answer' to view a fully worked solution. When you are finished, use the links on the left to attempt the other questions.

\n

 

\n

In the Class Test you must state the formula, insert the numbers into the formula, show the answer, provide some advice and set out a time diagram. If you get any stages wrong, you may be awarded a mark if you show your working.

", "precision": 0, "precisionType": "dp", "variableReplacements": [], "mustBeReduced": false, "strictPrecision": true, "notationStyles": ["plain", "en", "si-en"], "precisionPartialCredit": 0, "scripts": {}, "marks": "1", "showPrecisionHint": true, "maxValue": "answer+answer*answer_tolerance", "showCorrectAnswer": true, "precisionMessage": "

You need to round your answer to the nearest £1.

", "stepsPenalty": "0", "minValue": "answer-answer*answer_tolerance", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "steps": [{"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

If you get an answer to any of the steps wrong, you can resubmit values until you are correct.

\n

Here is the time diagram:

\n

{timeline(periods,paymentStr)}

", "variableReplacements": [], "scripts": {}}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Name the formula needed to solve this question.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "dropdownlist", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

Amount of £1

", "

Present Value of £1

", "

Amount of £1 per annum

", "

Annual Sinking Fund

", "

Present Value of £1 per annum

", "

YP perp

"], "distractors": ["", "", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, 0, 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Select the correct formula.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "radiogroup", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

\\[{(1 + i)}^{n}\\]

", "

\\[{(1 + i)}^{-n}\\]

", "

\\[\\frac{{(1 + i)}^{n}-1}{i}\\]

", "

\\[\\textrm{Capital *}\\frac{i}{{(1+i)}^{n}-1}\\]

", "

\\[\\frac{1-{(1+i)}^{-n}}{i}\\]

", "

\\[\\frac{1}{i}\\]

"], "distractors": ["", "Correct", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, "0", 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Please input the values that should be substituted into the formula. Please make sure percentages are converted to decimal values (e.g. 4% should be entered as 0.04).

", "variableReplacements": [], "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "interest_rate", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

i = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "interest_rate", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "periods", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

n = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "periods", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

Substitute in the values of $n$ and $i$ and calculate the $multiplier$.

", "precision": "4", "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "mustBeReduced": false, "correctAnswerStyle": "plain", "notationStyles": ["plain", "en", "si-en"], "strictPrecision": true, "scripts": {}, "marks": ".2", "showPrecisionHint": true, "maxValue": "multiplier", "showCorrectAnswer": true, "precisionMessage": "You have not given your answer to the correct precision.", "precisionPartialCredit": "0", "minValue": "multiplier", "precisionType": "dp", "correctAnswerFraction": false}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Finally, you need to multiply that number by the $capital$ to get the final answer.

", "variableReplacements": [], "scripts": {}}]}], "tags": [], "variables": {"answer_tolerance": {"name": "answer_tolerance", "templateType": "number", "description": "", "definition": "0.01", "group": "Ungrouped variables"}, "answer": {"name": "answer", "templateType": "anything", "description": "

Present value

", "definition": "present_value", "group": "Ungrouped variables"}, "random_question": {"name": "random_question", "templateType": "anything", "description": "", "definition": "join(split(join(split(join(split(random_question_gaps, \"[future_value]\"),separatethousands(future_value,\",\")),\"[periods]\"), separatethousands(periods,\"\")),\"[interest_rate]\"),separatethousands(interest_rate*100,\"\"))\n\n\n\n\n\n\n", "group": "Ungrouped variables"}, "random_question_gaps": {"name": "random_question_gaps", "templateType": "anything", "description": "

A question selected at random from the list of questions stored in the variable questions. 

", "definition": "random(questions)", "group": "Ungrouped variables"}, "multiplier": {"name": "multiplier", "templateType": "anything", "description": "", "definition": "(1+interest_rate)^(-1*periods)", "group": "Ungrouped variables"}, "periods": {"name": "periods", "templateType": "randrange", "description": "", "definition": "random(1..25#1)", "group": "Ungrouped variables"}, "questions": {"name": "questions", "templateType": "list of strings", "description": "", "definition": "[ \"If you could receive \u00a3[future_value] in [periods] years, what would you pay for it now, assuming the time value of money is [interest_rate]%?\", \"A contact has alerted you that a prestigeous office property is due to come on the market in [periods] years time for \u00a3[future_value] . What is the present value of this sum, assuming the time value of money is [interest_rate]%?\", \"How much should you save today, in order to have \u00a3[future_value] in [periods] years time, if interest rates are [interest_rate]%?\", \"What is the present value of a future sum of \u00a3[future_value] , receivable in [periods] years, with a discount rate of [interest_rate]%?\", \"If the interest rate is [interest_rate]%, how much would you need to pay today in order to earn the right to receive \u00a3[future_value] in [periods] years? \" ]", "group": "Ungrouped variables"}, "paymentStr": {"name": "paymentStr", "templateType": "anything", "description": "", "definition": "'\u00a3'+separateThousands(future_value,',')", "group": "Ungrouped variables"}, "present_value": {"name": "present_value", "templateType": "anything", "description": "", "definition": "multiplier*future_value", "group": "Ungrouped variables"}, "interest_rate": {"name": "interest_rate", "templateType": "randrange", "description": "", "definition": "random(0.01..0.15#0.0025)", "group": "Ungrouped variables"}, "future_value": {"name": "future_value", "templateType": "randrange", "description": "", "definition": "random(1000000..70000000#500000)", "group": "Ungrouped variables"}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["periods", "interest_rate", "present_value", "answer", "future_value", "questions", "random_question_gaps", "random_question", "answer_tolerance", "multiplier", "paymentStr"], "rulesets": {}, "variable_groups": [], "preamble": {"js": "", "css": ""}, "type": "question"}, {"name": "Present Value of \u00a31", "extensions": ["jsxgraph"], "custom_part_types": [], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "contributors": [{"name": "Rory Shanahan", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/1513/"}], "statement": "

{random_question}

", "metadata": {"description": "", "licence": "None specified"}, "functions": {"timeline": {"language": "javascript", "definition": "//REVISION 20/6/17 1.50pm\n\n// Possible timeline types:\n// - Amount of \u00a31 per annum \n\n\nvar A1PA = {\n \n startPoint : 'none',\n startPointArrow : 'up',\n endPoint : 'below',\n endPointArrow : 'down',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'end',\n \n }; \n\n// - Amount of \u00a31\n\n\nvar A1 = {\n \n startPoint : 'above',\n startPointArrow : 'up',\n startPointText : 'payment_str',\n endPoint : 'below',\n endPointArrow : 'down',\n endPointText : 'none',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'end',\n \n };\n\n\n// - Present value of \u00a31 per annum\n\nvar PV1PA = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n// - Present value of \u00a31\nvar PV1 = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n startPointText : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'start',\n \n };\n\n\n// - Annual sink fund\nvar ASF = {\n \n startPoint : 'none',\n startPointArrow : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'below',\n tickText : 'qMarks',\n qmark : 'none',\n \n };\n\n\n// Years purchase in perpetuity\n\nvar YPP = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'inf',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n//// SPECIFY TYPE OF TIMELINE HERE\n\nvar timelineType = PV1;\n\n\nvar XLineAttrs = {\n strokeColor: 'black',\n fixed: true,\n strokeWidth: 3,\n straightFirst: false,\n straightLast: false,\n }\n\nvar startEndAttrs = {\n strokeColor: 'black', \n fixed: true, \n strokeWidth: 4\n }\n\n// End point for arrow\nvar endPointX = periods;\n\nif(timelineType.end === 'inf'){\n periods = 11;\n}\n\n// Constrain the graph to 10 periods in width\nif(periods<=10){\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, periods + 0.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n \n var board = div.board;\n board.create('line', [[0,0],[periods,0]], XLineAttrs);\n \n \n\n}\nelse{\n \n \n endPointX = 10;\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, 10.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n var board = div.board;\n \n //time break line segments\n var timeBreakSegmentCoords = [\n [[0,0],[8.4,0]], \n [[8.4,0],[8.5,.3]],\n [[8.5,.3],[8.7,-.4]],\n [[8.7,-.4],[8.8,0]],\n [[8.8,0],[10,0]]\n ]; \n \n board.create('line',timeBreakSegmentCoords[0],XLineAttrs);\n board.create('line',timeBreakSegmentCoords[4],XLineAttrs);\n \n for(i=1;i=10){\n qmarkX = 10;\n \n }\n else{\n qmarkX = periods;\n }\n \n if(timelineType.endPoint=='above'){\n qmarkY = .75;\n }\n else if (timelineType.endPoint=='below'){\n qmarkY = -.75;\n }\n else{\n qmarkY = -.4;\n }\n \n break;\n \n case 'none':\n qmarkRequired = false;\n break;\n}\n\n\n\nif(qmarkRequired === true){\n var qMarkAttrs = {\n anchorX: 'middle',\n fontSize : 28,\n fixed : true,\n }\n \n board.create('text',[qmarkX,qmarkY,'?'],qMarkAttrs); \n \n}\n\n \n\nvar firstTick = true;\nvar lastTick = true;\n\n\n// Draw start/end arrows\nvar startEndLength = .6;\n\nvar startEndTextAttrs = {\n anchorX: 'middle',\n anchorY: 'middle',\n fontSize : 12,\n fixed : true,\n }\n\n\nvar paymentStrStyled = \"

+*

\".replace('*',paymentStr);\n\n\nif((timelineType.startPoint === 'above') || (timelineType.startPoint === 'below')) {\n paymentStrStart = paymentStrStyled.replace('+','Year 0
');\n}\n\nif ((timelineType.endPoint === 'above') || (timelineType.endPoint === 'below')){\n paymentStrEnd = paymentStrStyled.replace('+',['Year ',periods.toString(), '
'].join(''));\n}\n\n\nswitch(timelineType.startPoint){\n \n case 'above':\n \n var startPoint = board.create('arrow',[[0,startEndLength],[0,0]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n firstTick = false;\n }\n break;\n \n case 'below':\n \n var startPoint = board.create('arrow',[[0,0],[0,-startEndLength]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,-.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n firstTick = false;\n }\n break;\n \n}\n\n\n\nswitch(timelineType.endPoint){\n \n case 'above':\n var endPoint = board.create('arrow',[[endPointX,startEndLength],[endPointX,0]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n lastTick = false;\n }\n break;\n \n case 'below':\n var endPoint = board.create('arrow',[[endPointX,0],[endPointX,-startEndLength]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n if(periods<10)\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n lastTick = false;\n }\n break;\n \n}\n\nconsole.log(lastTick);\n\n// Reverse arrow head direction in needed\nif(timelineType.endPointArrow === 'up' && timelineType.endPoint !== 'none'){\n endPoint.setArrow(true,false)\n}\n\nif(timelineType.startPointArrow === 'up' && timelineType.startPoint !== 'none'){\n startPoint.setArrow(true,false)\n}\n\n \n// Insert smaller ticks if needed\nvar tickerStr;\nvar tmp_arrow;\n\n\nvar tickerTextAttrs = {\n anchorX: 'middle',\n anchorY: 'top',\n fontSize : 11,\n fixed : true,\n }\n\nif(timelineType.tickText === 'qMarks'){\n tickerStr = '

\u00a3?

';\n}\nelse if(timelineType.tickText === 'payment'){\n tickerStr = paymentStr;\n}\nelse{\n tickerStr = '';\n}\n\nif(timelineType.ticks !== 'none'){\n \n var lowTextY = .05;\n var textY;\n var smallArrows = true;\n\n switch(timelineType.ticks){\n case 'above':\n textY = 0.45;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below':\n textY = -0.45;\n lowTextY = -.05;\n break;\n case 'above-low':\n textY = .05;\n smallArrows = false;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below-low':\n textY = -.05;\n smallArrows = false;\n break;\n }\n \n\n \n for(i=0;i<=periods;i++){\n \n if(smallArrows === true){\n \n if(timelineType.ticks === 'above'){\n //Check that a first/last tick is needed\n\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='above'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n }\n }\n else{ //ticks below\n //Check that a first/last tick is needed\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='below'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,-.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n\n //tmp_arrow.setArrow(true,false)\n }\n\n }\n }\n \n\n //Count years from 0 as long as the period is 8y or lower. Continue to 10 if there are 10 periods\n //or fewer. For periods over 10 year, add in the last two periods after the 8th.\n if(!(i>8 && periods>10)){\n \n if(i===0){\n if(firstTick===false){\n\n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch1'); tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch1');tickerTextAttrs.anchorY = 'bottom';}\n \n //board.create('text',[i,-lowTextY,'Year 0'],tickerTextAttrs);\n \n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch2');tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch2');tickerTextAttrs.anchorY = 'bottom';}\n\n }\n //else if(timelineType.tickText === 'payment'){\n //board.create('text',[i,textY,'Year 0
\u00a30'],tickerTextAttrs);\n //}\n else{\n \n board.create('text',[i,lowTextY,'Year 0'],tickerTextAttrs);\n \n\n }\n \n \n }\n else if(i===periods && lastTick===false){}\n else{\n \n board.create('text',[i,textY,['Year ',i.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n \n }\n else if(i===9){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',(periods-1).toString(),'
',tickerStr].join('')],tickerTextAttrs); \n }\n }\n else{\n // last period for >10 periods\n if(lastTick===true){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',periods.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n }\n }\n }\n}\n\n\n \nreturn div;\n", "type": "html", "parameters": [["periods", "number"], ["paymentStr", "string"]]}}, "advice": "

The correct formula to use for this question is the Present Value of £1 formula:

\n

\\[\\textrm{Present value of £1} = {(1+i)}^{-n}\\]

\n

Where $i$ is the interest rate and $n$ is the number of periods.

\n

\n

The Present Value of £1 formula is used to obtain the Present Value of an asset with a known Future Value. In other words, you know how much something is going to be worth in the future and want to know what it is worth now. Substituting the relevant numbers into the formula produces the Present Value of £1 for a given number of years and discounting at a given interest rate. Multiplying that number by any other Future Value will give the corresponding Present Value.

\n
    \n
  • Given Variables: Future Value, interest rate, number of years/periods
  • \n
  • Answer: Present Value
  • \n
\n

\n

Let's break it down...

\n

Substituting in the values from the question gives:

\n

\\[{(1+\\var{interest_rate})}^{-\\var{periods}}\\]

\n

\\[{=(\\var{1+interest_rate}})^{-\\var{periods}}\\]

\n

\\[=\\var{dpformat(multiplier,4,\"en\")}\\]

\n

\n

\n

Finally, you need to multiply that number by the $Capital$ to get the final answer:

\n

\\[\\textrm{Present Value} = \\var{dpformat(multiplier,4,\"en\")} \\textrm{*} £\\var{dpformat(future_value,0,\"en\")}\\]

\n

\n

Which is £{sigformat(answer,3,\"en\")} to 3 significant figures. 

\n

", "parts": [{"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "correctAnswerStyle": "plain", "prompt": "

Solve the question using the correct formula.

\n

If you are unsure of how to solve this problem, work through the steps or click 'reveal answer' to view a fully worked solution. When you are finished, use the links on the left to attempt the other questions.

\n

 

\n

In the Class Test you must state the formula, insert the numbers into the formula, show the answer, provide some advice and set out a time diagram. If you get any stages wrong, you may be awarded a mark if you show your working.

", "precision": 0, "precisionType": "dp", "variableReplacements": [], "mustBeReduced": false, "strictPrecision": true, "notationStyles": ["plain", "en", "si-en"], "precisionPartialCredit": 0, "scripts": {}, "marks": "1", "showPrecisionHint": true, "maxValue": "answer+answer*answer_tolerance", "showCorrectAnswer": true, "precisionMessage": "

You need to round your answer to the nearest £1.

", "stepsPenalty": "0", "minValue": "answer-answer*answer_tolerance", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "steps": [{"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

If you get an answer to any of the steps wrong, you can resubmit values until you are correct.

\n

Here is the time diagram:

\n

{timeline(periods,paymentStr)}

", "variableReplacements": [], "scripts": {}}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Name the formula needed to solve this question.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "dropdownlist", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

Amount of £1

", "

Present Value of £1

", "

Amount of £1 per annum

", "

Annual Sinking Fund

", "

Present Value of £1 per annum

", "

YP perp

"], "distractors": ["", "", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, 0, 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Select the correct formula.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "radiogroup", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

\\[{(1 + i)}^{n}\\]

", "

\\[{(1 + i)}^{-n}\\]

", "

\\[\\frac{{(1 + i)}^{n}-1}{i}\\]

", "

\\[\\textrm{Capital *}\\frac{i}{{(1+i)}^{n}-1}\\]

", "

\\[\\frac{1-{(1+i)}^{-n}}{i}\\]

", "

\\[\\frac{1}{i}\\]

"], "distractors": ["", "Correct", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, "0", 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Please input the values that should be substituted into the formula. Please make sure percentages are converted to decimal values (e.g. 4% should be entered as 0.04).

", "variableReplacements": [], "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "interest_rate", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

i = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "interest_rate", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "periods", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

n = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "periods", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

Substitute in the values of $n$ and $i$ and calculate the $multiplier$.

", "precision": "4", "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "mustBeReduced": false, "correctAnswerStyle": "plain", "notationStyles": ["plain", "en", "si-en"], "strictPrecision": true, "scripts": {}, "marks": ".2", "showPrecisionHint": true, "maxValue": "multiplier", "showCorrectAnswer": true, "precisionMessage": "You have not given your answer to the correct precision.", "precisionPartialCredit": "0", "minValue": "multiplier", "precisionType": "dp", "correctAnswerFraction": false}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Finally, you need to multiply that number by the $capital$ to get the final answer.

", "variableReplacements": [], "scripts": {}}]}], "tags": [], "variables": {"answer_tolerance": {"name": "answer_tolerance", "templateType": "number", "description": "", "definition": "0.01", "group": "Ungrouped variables"}, "answer": {"name": "answer", "templateType": "anything", "description": "

Present value

", "definition": "present_value", "group": "Ungrouped variables"}, "random_question": {"name": "random_question", "templateType": "anything", "description": "", "definition": "join(split(join(split(join(split(random_question_gaps, \"[future_value]\"),separatethousands(future_value,\",\")),\"[periods]\"), separatethousands(periods,\"\")),\"[interest_rate]\"),separatethousands(interest_rate*100,\"\"))\n\n\n\n\n\n\n", "group": "Ungrouped variables"}, "random_question_gaps": {"name": "random_question_gaps", "templateType": "anything", "description": "

A question selected at random from the list of questions stored in the variable questions. 

", "definition": "random(questions)", "group": "Ungrouped variables"}, "multiplier": {"name": "multiplier", "templateType": "anything", "description": "", "definition": "(1+interest_rate)^(-1*periods)", "group": "Ungrouped variables"}, "periods": {"name": "periods", "templateType": "randrange", "description": "", "definition": "random(1..25#1)", "group": "Ungrouped variables"}, "questions": {"name": "questions", "templateType": "list of strings", "description": "", "definition": "[ \"If you could receive \u00a3[future_value] in [periods] years, what would you pay for it now, assuming the time value of money is [interest_rate]%?\", \"A contact has alerted you that a prestigeous office property is due to come on the market in [periods] years time for \u00a3[future_value] . What is the present value of this sum, assuming the time value of money is [interest_rate]%?\", \"How much should you save today, in order to have \u00a3[future_value] in [periods] years time, if interest rates are [interest_rate]%?\", \"What is the present value of a future sum of \u00a3[future_value] , receivable in [periods] years, with a discount rate of [interest_rate]%?\", \"If the interest rate is [interest_rate]%, how much would you need to pay today in order to earn the right to receive \u00a3[future_value] in [periods] years? \" ]", "group": "Ungrouped variables"}, "paymentStr": {"name": "paymentStr", "templateType": "anything", "description": "", "definition": "'\u00a3'+separateThousands(future_value,',')", "group": "Ungrouped variables"}, "present_value": {"name": "present_value", "templateType": "anything", "description": "", "definition": "multiplier*future_value", "group": "Ungrouped variables"}, "interest_rate": {"name": "interest_rate", "templateType": "randrange", "description": "", "definition": "random(0.01..0.15#0.0025)", "group": "Ungrouped variables"}, "future_value": {"name": "future_value", "templateType": "randrange", "description": "", "definition": "random(1000000..70000000#500000)", "group": "Ungrouped variables"}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["periods", "interest_rate", "present_value", "answer", "future_value", "questions", "random_question_gaps", "random_question", "answer_tolerance", "multiplier", "paymentStr"], "rulesets": {}, "variable_groups": [], "preamble": {"js": "", "css": ""}, "type": "question"}, {"name": "Present Value of \u00a31", "extensions": ["jsxgraph"], "custom_part_types": [], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "contributors": [{"name": "Rory Shanahan", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/1513/"}], "statement": "

{random_question}

", "metadata": {"description": "", "licence": "None specified"}, "functions": {"timeline": {"language": "javascript", "definition": "//REVISION 20/6/17 1.50pm\n\n// Possible timeline types:\n// - Amount of \u00a31 per annum \n\n\nvar A1PA = {\n \n startPoint : 'none',\n startPointArrow : 'up',\n endPoint : 'below',\n endPointArrow : 'down',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'end',\n \n }; \n\n// - Amount of \u00a31\n\n\nvar A1 = {\n \n startPoint : 'above',\n startPointArrow : 'up',\n startPointText : 'payment_str',\n endPoint : 'below',\n endPointArrow : 'down',\n endPointText : 'none',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'end',\n \n };\n\n\n// - Present value of \u00a31 per annum\n\nvar PV1PA = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n// - Present value of \u00a31\nvar PV1 = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n startPointText : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'start',\n \n };\n\n\n// - Annual sink fund\nvar ASF = {\n \n startPoint : 'none',\n startPointArrow : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'below',\n tickText : 'qMarks',\n qmark : 'none',\n \n };\n\n\n// Years purchase in perpetuity\n\nvar YPP = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'inf',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n//// SPECIFY TYPE OF TIMELINE HERE\n\nvar timelineType = PV1;\n\n\nvar XLineAttrs = {\n strokeColor: 'black',\n fixed: true,\n strokeWidth: 3,\n straightFirst: false,\n straightLast: false,\n }\n\nvar startEndAttrs = {\n strokeColor: 'black', \n fixed: true, \n strokeWidth: 4\n }\n\n// End point for arrow\nvar endPointX = periods;\n\nif(timelineType.end === 'inf'){\n periods = 11;\n}\n\n// Constrain the graph to 10 periods in width\nif(periods<=10){\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, periods + 0.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n \n var board = div.board;\n board.create('line', [[0,0],[periods,0]], XLineAttrs);\n \n \n\n}\nelse{\n \n \n endPointX = 10;\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, 10.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n var board = div.board;\n \n //time break line segments\n var timeBreakSegmentCoords = [\n [[0,0],[8.4,0]], \n [[8.4,0],[8.5,.3]],\n [[8.5,.3],[8.7,-.4]],\n [[8.7,-.4],[8.8,0]],\n [[8.8,0],[10,0]]\n ]; \n \n board.create('line',timeBreakSegmentCoords[0],XLineAttrs);\n board.create('line',timeBreakSegmentCoords[4],XLineAttrs);\n \n for(i=1;i=10){\n qmarkX = 10;\n \n }\n else{\n qmarkX = periods;\n }\n \n if(timelineType.endPoint=='above'){\n qmarkY = .75;\n }\n else if (timelineType.endPoint=='below'){\n qmarkY = -.75;\n }\n else{\n qmarkY = -.4;\n }\n \n break;\n \n case 'none':\n qmarkRequired = false;\n break;\n}\n\n\n\nif(qmarkRequired === true){\n var qMarkAttrs = {\n anchorX: 'middle',\n fontSize : 28,\n fixed : true,\n }\n \n board.create('text',[qmarkX,qmarkY,'?'],qMarkAttrs); \n \n}\n\n \n\nvar firstTick = true;\nvar lastTick = true;\n\n\n// Draw start/end arrows\nvar startEndLength = .6;\n\nvar startEndTextAttrs = {\n anchorX: 'middle',\n anchorY: 'middle',\n fontSize : 12,\n fixed : true,\n }\n\n\nvar paymentStrStyled = \"

+*

\".replace('*',paymentStr);\n\n\nif((timelineType.startPoint === 'above') || (timelineType.startPoint === 'below')) {\n paymentStrStart = paymentStrStyled.replace('+','Year 0
');\n}\n\nif ((timelineType.endPoint === 'above') || (timelineType.endPoint === 'below')){\n paymentStrEnd = paymentStrStyled.replace('+',['Year ',periods.toString(), '
'].join(''));\n}\n\n\nswitch(timelineType.startPoint){\n \n case 'above':\n \n var startPoint = board.create('arrow',[[0,startEndLength],[0,0]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n firstTick = false;\n }\n break;\n \n case 'below':\n \n var startPoint = board.create('arrow',[[0,0],[0,-startEndLength]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,-.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n firstTick = false;\n }\n break;\n \n}\n\n\n\nswitch(timelineType.endPoint){\n \n case 'above':\n var endPoint = board.create('arrow',[[endPointX,startEndLength],[endPointX,0]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n lastTick = false;\n }\n break;\n \n case 'below':\n var endPoint = board.create('arrow',[[endPointX,0],[endPointX,-startEndLength]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n if(periods<10)\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n lastTick = false;\n }\n break;\n \n}\n\nconsole.log(lastTick);\n\n// Reverse arrow head direction in needed\nif(timelineType.endPointArrow === 'up' && timelineType.endPoint !== 'none'){\n endPoint.setArrow(true,false)\n}\n\nif(timelineType.startPointArrow === 'up' && timelineType.startPoint !== 'none'){\n startPoint.setArrow(true,false)\n}\n\n \n// Insert smaller ticks if needed\nvar tickerStr;\nvar tmp_arrow;\n\n\nvar tickerTextAttrs = {\n anchorX: 'middle',\n anchorY: 'top',\n fontSize : 11,\n fixed : true,\n }\n\nif(timelineType.tickText === 'qMarks'){\n tickerStr = '

\u00a3?

';\n}\nelse if(timelineType.tickText === 'payment'){\n tickerStr = paymentStr;\n}\nelse{\n tickerStr = '';\n}\n\nif(timelineType.ticks !== 'none'){\n \n var lowTextY = .05;\n var textY;\n var smallArrows = true;\n\n switch(timelineType.ticks){\n case 'above':\n textY = 0.45;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below':\n textY = -0.45;\n lowTextY = -.05;\n break;\n case 'above-low':\n textY = .05;\n smallArrows = false;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below-low':\n textY = -.05;\n smallArrows = false;\n break;\n }\n \n\n \n for(i=0;i<=periods;i++){\n \n if(smallArrows === true){\n \n if(timelineType.ticks === 'above'){\n //Check that a first/last tick is needed\n\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='above'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n }\n }\n else{ //ticks below\n //Check that a first/last tick is needed\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='below'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,-.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n\n //tmp_arrow.setArrow(true,false)\n }\n\n }\n }\n \n\n //Count years from 0 as long as the period is 8y or lower. Continue to 10 if there are 10 periods\n //or fewer. For periods over 10 year, add in the last two periods after the 8th.\n if(!(i>8 && periods>10)){\n \n if(i===0){\n if(firstTick===false){\n\n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch1'); tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch1');tickerTextAttrs.anchorY = 'bottom';}\n \n //board.create('text',[i,-lowTextY,'Year 0'],tickerTextAttrs);\n \n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch2');tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch2');tickerTextAttrs.anchorY = 'bottom';}\n\n }\n //else if(timelineType.tickText === 'payment'){\n //board.create('text',[i,textY,'Year 0
\u00a30'],tickerTextAttrs);\n //}\n else{\n \n board.create('text',[i,lowTextY,'Year 0'],tickerTextAttrs);\n \n\n }\n \n \n }\n else if(i===periods && lastTick===false){}\n else{\n \n board.create('text',[i,textY,['Year ',i.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n \n }\n else if(i===9){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',(periods-1).toString(),'
',tickerStr].join('')],tickerTextAttrs); \n }\n }\n else{\n // last period for >10 periods\n if(lastTick===true){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',periods.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n }\n }\n }\n}\n\n\n \nreturn div;\n", "type": "html", "parameters": [["periods", "number"], ["paymentStr", "string"]]}}, "advice": "

The correct formula to use for this question is the Present Value of £1 formula:

\n

\\[\\textrm{Present value of £1} = {(1+i)}^{-n}\\]

\n

Where $i$ is the interest rate and $n$ is the number of periods.

\n

\n

The Present Value of £1 formula is used to obtain the Present Value of an asset with a known Future Value. In other words, you know how much something is going to be worth in the future and want to know what it is worth now. Substituting the relevant numbers into the formula produces the Present Value of £1 for a given number of years and discounting at a given interest rate. Multiplying that number by any other Future Value will give the corresponding Present Value.

\n
    \n
  • Given Variables: Future Value, interest rate, number of years/periods
  • \n
  • Answer: Present Value
  • \n
\n

\n

Let's break it down...

\n

Substituting in the values from the question gives:

\n

\\[{(1+\\var{interest_rate})}^{-\\var{periods}}\\]

\n

\\[{=(\\var{1+interest_rate}})^{-\\var{periods}}\\]

\n

\\[=\\var{dpformat(multiplier,4,\"en\")}\\]

\n

\n

\n

Finally, you need to multiply that number by the $Capital$ to get the final answer:

\n

\\[\\textrm{Present Value} = \\var{dpformat(multiplier,4,\"en\")} \\textrm{*} £\\var{dpformat(future_value,0,\"en\")}\\]

\n

\n

Which is £{sigformat(answer,3,\"en\")} to 3 significant figures. 

\n

", "parts": [{"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "correctAnswerStyle": "plain", "prompt": "

Solve the question using the correct formula.

\n

If you are unsure of how to solve this problem, work through the steps or click 'reveal answer' to view a fully worked solution. When you are finished, use the links on the left to attempt the other questions.

\n

 

\n

In the Class Test you must state the formula, insert the numbers into the formula, show the answer, provide some advice and set out a time diagram. If you get any stages wrong, you may be awarded a mark if you show your working.

", "precision": 0, "precisionType": "dp", "variableReplacements": [], "mustBeReduced": false, "strictPrecision": true, "notationStyles": ["plain", "en", "si-en"], "precisionPartialCredit": 0, "scripts": {}, "marks": "1", "showPrecisionHint": true, "maxValue": "answer+answer*answer_tolerance", "showCorrectAnswer": true, "precisionMessage": "

You need to round your answer to the nearest £1.

", "stepsPenalty": "0", "minValue": "answer-answer*answer_tolerance", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "steps": [{"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

If you get an answer to any of the steps wrong, you can resubmit values until you are correct.

\n

Here is the time diagram:

\n

{timeline(periods,paymentStr)}

", "variableReplacements": [], "scripts": {}}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Name the formula needed to solve this question.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "dropdownlist", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

Amount of £1

", "

Present Value of £1

", "

Amount of £1 per annum

", "

Annual Sinking Fund

", "

Present Value of £1 per annum

", "

YP perp

"], "distractors": ["", "", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, 0, 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Select the correct formula.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "radiogroup", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

\\[{(1 + i)}^{n}\\]

", "

\\[{(1 + i)}^{-n}\\]

", "

\\[\\frac{{(1 + i)}^{n}-1}{i}\\]

", "

\\[\\textrm{Capital *}\\frac{i}{{(1+i)}^{n}-1}\\]

", "

\\[\\frac{1-{(1+i)}^{-n}}{i}\\]

", "

\\[\\frac{1}{i}\\]

"], "distractors": ["", "Correct", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, "0", 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Please input the values that should be substituted into the formula. Please make sure percentages are converted to decimal values (e.g. 4% should be entered as 0.04).

", "variableReplacements": [], "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "interest_rate", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

i = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "interest_rate", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "periods", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

n = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "periods", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

Substitute in the values of $n$ and $i$ and calculate the $multiplier$.

", "precision": "4", "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "mustBeReduced": false, "correctAnswerStyle": "plain", "notationStyles": ["plain", "en", "si-en"], "strictPrecision": true, "scripts": {}, "marks": ".2", "showPrecisionHint": true, "maxValue": "multiplier", "showCorrectAnswer": true, "precisionMessage": "You have not given your answer to the correct precision.", "precisionPartialCredit": "0", "minValue": "multiplier", "precisionType": "dp", "correctAnswerFraction": false}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Finally, you need to multiply that number by the $capital$ to get the final answer.

", "variableReplacements": [], "scripts": {}}]}], "tags": [], "variables": {"answer_tolerance": {"name": "answer_tolerance", "templateType": "number", "description": "", "definition": "0.01", "group": "Ungrouped variables"}, "answer": {"name": "answer", "templateType": "anything", "description": "

Present value

", "definition": "present_value", "group": "Ungrouped variables"}, "random_question": {"name": "random_question", "templateType": "anything", "description": "", "definition": "join(split(join(split(join(split(random_question_gaps, \"[future_value]\"),separatethousands(future_value,\",\")),\"[periods]\"), separatethousands(periods,\"\")),\"[interest_rate]\"),separatethousands(interest_rate*100,\"\"))\n\n\n\n\n\n\n", "group": "Ungrouped variables"}, "random_question_gaps": {"name": "random_question_gaps", "templateType": "anything", "description": "

A question selected at random from the list of questions stored in the variable questions. 

", "definition": "random(questions)", "group": "Ungrouped variables"}, "multiplier": {"name": "multiplier", "templateType": "anything", "description": "", "definition": "(1+interest_rate)^(-1*periods)", "group": "Ungrouped variables"}, "periods": {"name": "periods", "templateType": "randrange", "description": "", "definition": "random(1..25#1)", "group": "Ungrouped variables"}, "questions": {"name": "questions", "templateType": "list of strings", "description": "", "definition": "[ \"If you could receive \u00a3[future_value] in [periods] years, what would you pay for it now, assuming the time value of money is [interest_rate]%?\", \"A contact has alerted you that a prestigeous office property is due to come on the market in [periods] years time for \u00a3[future_value] . What is the present value of this sum, assuming the time value of money is [interest_rate]%?\", \"How much should you save today, in order to have \u00a3[future_value] in [periods] years time, if interest rates are [interest_rate]%?\", \"What is the present value of a future sum of \u00a3[future_value] , receivable in [periods] years, with a discount rate of [interest_rate]%?\", \"If the interest rate is [interest_rate]%, how much would you need to pay today in order to earn the right to receive \u00a3[future_value] in [periods] years? \" ]", "group": "Ungrouped variables"}, "paymentStr": {"name": "paymentStr", "templateType": "anything", "description": "", "definition": "'\u00a3'+separateThousands(future_value,',')", "group": "Ungrouped variables"}, "present_value": {"name": "present_value", "templateType": "anything", "description": "", "definition": "multiplier*future_value", "group": "Ungrouped variables"}, "interest_rate": {"name": "interest_rate", "templateType": "randrange", "description": "", "definition": "random(0.01..0.15#0.0025)", "group": "Ungrouped variables"}, "future_value": {"name": "future_value", "templateType": "randrange", "description": "", "definition": "random(1000000..70000000#500000)", "group": "Ungrouped variables"}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["periods", "interest_rate", "present_value", "answer", "future_value", "questions", "random_question_gaps", "random_question", "answer_tolerance", "multiplier", "paymentStr"], "rulesets": {}, "variable_groups": [], "preamble": {"js": "", "css": ""}, "type": "question"}, {"name": "Present Value of \u00a31", "extensions": ["jsxgraph"], "custom_part_types": [], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "contributors": [{"name": "Rory Shanahan", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/1513/"}], "statement": "

{random_question}

", "metadata": {"description": "", "licence": "None specified"}, "functions": {"timeline": {"language": "javascript", "definition": "//REVISION 20/6/17 1.50pm\n\n// Possible timeline types:\n// - Amount of \u00a31 per annum \n\n\nvar A1PA = {\n \n startPoint : 'none',\n startPointArrow : 'up',\n endPoint : 'below',\n endPointArrow : 'down',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'end',\n \n }; \n\n// - Amount of \u00a31\n\n\nvar A1 = {\n \n startPoint : 'above',\n startPointArrow : 'up',\n startPointText : 'payment_str',\n endPoint : 'below',\n endPointArrow : 'down',\n endPointText : 'none',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'end',\n \n };\n\n\n// - Present value of \u00a31 per annum\n\nvar PV1PA = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'periods',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n// - Present value of \u00a31\nvar PV1 = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n startPointText : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'above-low',\n tickText : 'none',\n qmark : 'start',\n \n };\n\n\n// - Annual sink fund\nvar ASF = {\n \n startPoint : 'none',\n startPointArrow : 'none',\n endPoint : 'above',\n endPointArrow : 'up',\n endPointText : 'payment_str',\n end : 'periods',\n ticks : 'below',\n tickText : 'qMarks',\n qmark : 'none',\n \n };\n\n\n// Years purchase in perpetuity\n\nvar YPP = {\n \n startPoint : 'below',\n startPointArrow : 'down',\n endPoint : 'none',\n endPointArrow : 'none',\n end : 'inf',\n ticks : 'above',\n tickText : 'payment',\n qmark : 'start',\n \n };\n\n//// SPECIFY TYPE OF TIMELINE HERE\n\nvar timelineType = PV1;\n\n\nvar XLineAttrs = {\n strokeColor: 'black',\n fixed: true,\n strokeWidth: 3,\n straightFirst: false,\n straightLast: false,\n }\n\nvar startEndAttrs = {\n strokeColor: 'black', \n fixed: true, \n strokeWidth: 4\n }\n\n// End point for arrow\nvar endPointX = periods;\n\nif(timelineType.end === 'inf'){\n periods = 11;\n}\n\n// Constrain the graph to 10 periods in width\nif(periods<=10){\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, periods + 0.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n \n var board = div.board;\n board.create('line', [[0,0],[periods,0]], XLineAttrs);\n \n \n\n}\nelse{\n \n \n endPointX = 10;\n \n var div = Numbas.extensions.jsxgraph.makeBoard('800px','200px',\n {boundingBox: [-.5, 1, 10.5, -1],\n showNavigation: false,\n axis: false,\n grid: true,\n });\n \n var board = div.board;\n \n //time break line segments\n var timeBreakSegmentCoords = [\n [[0,0],[8.4,0]], \n [[8.4,0],[8.5,.3]],\n [[8.5,.3],[8.7,-.4]],\n [[8.7,-.4],[8.8,0]],\n [[8.8,0],[10,0]]\n ]; \n \n board.create('line',timeBreakSegmentCoords[0],XLineAttrs);\n board.create('line',timeBreakSegmentCoords[4],XLineAttrs);\n \n for(i=1;i=10){\n qmarkX = 10;\n \n }\n else{\n qmarkX = periods;\n }\n \n if(timelineType.endPoint=='above'){\n qmarkY = .75;\n }\n else if (timelineType.endPoint=='below'){\n qmarkY = -.75;\n }\n else{\n qmarkY = -.4;\n }\n \n break;\n \n case 'none':\n qmarkRequired = false;\n break;\n}\n\n\n\nif(qmarkRequired === true){\n var qMarkAttrs = {\n anchorX: 'middle',\n fontSize : 28,\n fixed : true,\n }\n \n board.create('text',[qmarkX,qmarkY,'?'],qMarkAttrs); \n \n}\n\n \n\nvar firstTick = true;\nvar lastTick = true;\n\n\n// Draw start/end arrows\nvar startEndLength = .6;\n\nvar startEndTextAttrs = {\n anchorX: 'middle',\n anchorY: 'middle',\n fontSize : 12,\n fixed : true,\n }\n\n\nvar paymentStrStyled = \"

+*

\".replace('*',paymentStr);\n\n\nif((timelineType.startPoint === 'above') || (timelineType.startPoint === 'below')) {\n paymentStrStart = paymentStrStyled.replace('+','Year 0
');\n}\n\nif ((timelineType.endPoint === 'above') || (timelineType.endPoint === 'below')){\n paymentStrEnd = paymentStrStyled.replace('+',['Year ',periods.toString(), '
'].join(''));\n}\n\n\nswitch(timelineType.startPoint){\n \n case 'above':\n \n var startPoint = board.create('arrow',[[0,startEndLength],[0,0]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n firstTick = false;\n }\n break;\n \n case 'below':\n \n var startPoint = board.create('arrow',[[0,0],[0,-startEndLength]],startEndAttrs);\n if(timelineType.startPointText === 'payment_str'){\n board.create('text',[0,-.72,paymentStrStart],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n firstTick = false;\n }\n break;\n \n}\n\n\n\nswitch(timelineType.endPoint){\n \n case 'above':\n var endPoint = board.create('arrow',[[endPointX,startEndLength],[endPointX,0]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'above' || timelineType.ticks === 'above-low'){\n lastTick = false;\n }\n break;\n \n case 'below':\n var endPoint = board.create('arrow',[[endPointX,0],[endPointX,-startEndLength]],startEndAttrs);\n if(timelineType.endPointText === 'payment_str'){\n var endTextX;\n if(periods>10){endTextX=10;}else{endTextX=periods;}\n if(periods<10)\n board.create('text',[endTextX,.72,paymentStrEnd],startEndTextAttrs);\n \n }\n if(timelineType.ticks === 'below'|| timelineType.ticks === 'below-low'){\n lastTick = false;\n }\n break;\n \n}\n\nconsole.log(lastTick);\n\n// Reverse arrow head direction in needed\nif(timelineType.endPointArrow === 'up' && timelineType.endPoint !== 'none'){\n endPoint.setArrow(true,false)\n}\n\nif(timelineType.startPointArrow === 'up' && timelineType.startPoint !== 'none'){\n startPoint.setArrow(true,false)\n}\n\n \n// Insert smaller ticks if needed\nvar tickerStr;\nvar tmp_arrow;\n\n\nvar tickerTextAttrs = {\n anchorX: 'middle',\n anchorY: 'top',\n fontSize : 11,\n fixed : true,\n }\n\nif(timelineType.tickText === 'qMarks'){\n tickerStr = '

\u00a3?

';\n}\nelse if(timelineType.tickText === 'payment'){\n tickerStr = paymentStr;\n}\nelse{\n tickerStr = '';\n}\n\nif(timelineType.ticks !== 'none'){\n \n var lowTextY = .05;\n var textY;\n var smallArrows = true;\n\n switch(timelineType.ticks){\n case 'above':\n textY = 0.45;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below':\n textY = -0.45;\n lowTextY = -.05;\n break;\n case 'above-low':\n textY = .05;\n smallArrows = false;\n tickerTextAttrs.anchorY = 'bottom';\n break;\n case 'below-low':\n textY = -.05;\n smallArrows = false;\n break;\n }\n \n\n \n for(i=0;i<=periods;i++){\n \n if(smallArrows === true){\n \n if(timelineType.ticks === 'above'){\n //Check that a first/last tick is needed\n\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='above'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n }\n }\n else{ //ticks below\n //Check that a first/last tick is needed\n if(!((i===0)||((i===periods)&&(lastTick==false))||((((periods>10)&&(i==10)))&&timelineType.endPoint==='below'))){\n tmp_arrow = board.create('arrow',[[i,0],[i,-.4]],{\n strokeColor: 'grey',\n fixed: true,\n strokeWidth: 1,\n });\n\n //tmp_arrow.setArrow(true,false)\n }\n\n }\n }\n \n\n //Count years from 0 as long as the period is 8y or lower. Continue to 10 if there are 10 periods\n //or fewer. For periods over 10 year, add in the last two periods after the 8th.\n if(!(i>8 && periods>10)){\n \n if(i===0){\n if(firstTick===false){\n\n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch1'); tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch1');tickerTextAttrs.anchorY = 'bottom';}\n \n //board.create('text',[i,-lowTextY,'Year 0'],tickerTextAttrs);\n \n //if(tickerTextAttrs.anchorY === 'bottom'){console.log('switch2');tickerTextAttrs.anchorY = 'top';}\n //else{console.log('switch2');tickerTextAttrs.anchorY = 'bottom';}\n\n }\n //else if(timelineType.tickText === 'payment'){\n //board.create('text',[i,textY,'Year 0
\u00a30'],tickerTextAttrs);\n //}\n else{\n \n board.create('text',[i,lowTextY,'Year 0'],tickerTextAttrs);\n \n\n }\n \n \n }\n else if(i===periods && lastTick===false){}\n else{\n \n board.create('text',[i,textY,['Year ',i.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n \n }\n else if(i===9){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',(periods-1).toString(),'
',tickerStr].join('')],tickerTextAttrs); \n }\n }\n else{\n // last period for >10 periods\n if(lastTick===true){\n if(timelineType.end==='inf'){\n board.create('text',[i,textY,['Perp
',tickerStr].join('')],tickerTextAttrs);\n }\n else{\n board.create('text',[i,textY,['Year ',periods.toString(),'
',tickerStr].join('')],tickerTextAttrs);\n }\n }\n }\n }\n}\n\n\n \nreturn div;\n", "type": "html", "parameters": [["periods", "number"], ["paymentStr", "string"]]}}, "advice": "

The correct formula to use for this question is the Present Value of £1 formula:

\n

\\[\\textrm{Present value of £1} = {(1+i)}^{-n}\\]

\n

Where $i$ is the interest rate and $n$ is the number of periods.

\n

\n

The Present Value of £1 formula is used to obtain the Present Value of an asset with a known Future Value. In other words, you know how much something is going to be worth in the future and want to know what it is worth now. Substituting the relevant numbers into the formula produces the Present Value of £1 for a given number of years and discounting at a given interest rate. Multiplying that number by any other Future Value will give the corresponding Present Value.

\n
    \n
  • Given Variables: Future Value, interest rate, number of years/periods
  • \n
  • Answer: Present Value
  • \n
\n

\n

Let's break it down...

\n

Substituting in the values from the question gives:

\n

\\[{(1+\\var{interest_rate})}^{-\\var{periods}}\\]

\n

\\[{=(\\var{1+interest_rate}})^{-\\var{periods}}\\]

\n

\\[=\\var{dpformat(multiplier,4,\"en\")}\\]

\n

\n

\n

Finally, you need to multiply that number by the $Capital$ to get the final answer:

\n

\\[\\textrm{Present Value} = \\var{dpformat(multiplier,4,\"en\")} \\textrm{*} £\\var{dpformat(future_value,0,\"en\")}\\]

\n

\n

Which is £{sigformat(answer,3,\"en\")} to 3 significant figures. 

\n

", "parts": [{"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "correctAnswerStyle": "plain", "prompt": "

Solve the question using the correct formula.

\n

If you are unsure of how to solve this problem, work through the steps or click 'reveal answer' to view a fully worked solution. When you are finished, use the links on the left to attempt the other questions.

\n

 

\n

In the Class Test you must state the formula, insert the numbers into the formula, show the answer, provide some advice and set out a time diagram. If you get any stages wrong, you may be awarded a mark if you show your working.

", "precision": 0, "precisionType": "dp", "variableReplacements": [], "mustBeReduced": false, "strictPrecision": true, "notationStyles": ["plain", "en", "si-en"], "precisionPartialCredit": 0, "scripts": {}, "marks": "1", "showPrecisionHint": true, "maxValue": "answer+answer*answer_tolerance", "showCorrectAnswer": true, "precisionMessage": "

You need to round your answer to the nearest £1.

", "stepsPenalty": "0", "minValue": "answer-answer*answer_tolerance", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "steps": [{"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

If you get an answer to any of the steps wrong, you can resubmit values until you are correct.

\n

Here is the time diagram:

\n

{timeline(periods,paymentStr)}

", "variableReplacements": [], "scripts": {}}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Name the formula needed to solve this question.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "dropdownlist", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

Amount of £1

", "

Present Value of £1

", "

Amount of £1 per annum

", "

Annual Sinking Fund

", "

Present Value of £1 per annum

", "

YP perp

"], "distractors": ["", "", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, 0, 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "1_n_2", "shuffleChoices": true, "prompt": "

Select the correct formula.

", "minMarks": 0, "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "displayColumns": 0, "displayType": "radiogroup", "maxMarks": 0, "showCorrectAnswer": true, "choices": ["

\\[{(1 + i)}^{n}\\]

", "

\\[{(1 + i)}^{-n}\\]

", "

\\[\\frac{{(1 + i)}^{n}-1}{i}\\]

", "

\\[\\textrm{Capital *}\\frac{i}{{(1+i)}^{n}-1}\\]

", "

\\[\\frac{1-{(1+i)}^{-n}}{i}\\]

", "

\\[\\frac{1}{i}\\]

"], "distractors": ["", "Correct", "", "", "", ""], "scripts": {}, "matrix": ["0", ".2", "0", 0, "0", 0]}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Please input the values that should be substituted into the formula. Please make sure percentages are converted to decimal values (e.g. 4% should be entered as 0.04).

", "variableReplacements": [], "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "interest_rate", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

i = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "interest_rate", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"marks": ".2", "showFeedbackIcon": true, "maxValue": "periods", "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

n = 

", "mustBeReduced": false, "notationStyles": ["plain", "en", "si-en"], "variableReplacements": [], "allowFractions": false, "correctAnswerFraction": false, "minValue": "periods", "correctAnswerStyle": "plain", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}}, {"showFeedbackIcon": true, "allowFractions": false, "type": "numberentry", "mustBeReducedPC": 0, "prompt": "

Substitute in the values of $n$ and $i$ and calculate the $multiplier$.

", "precision": "4", "variableReplacementStrategy": "originalfirst", "variableReplacements": [], "mustBeReduced": false, "correctAnswerStyle": "plain", "notationStyles": ["plain", "en", "si-en"], "strictPrecision": true, "scripts": {}, "marks": ".2", "showPrecisionHint": true, "maxValue": "multiplier", "showCorrectAnswer": true, "precisionMessage": "You have not given your answer to the correct precision.", "precisionPartialCredit": "0", "minValue": "multiplier", "precisionType": "dp", "correctAnswerFraction": false}, {"marks": 0, "showFeedbackIcon": true, "type": "information", "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "prompt": "

Finally, you need to multiply that number by the $capital$ to get the final answer.

", "variableReplacements": [], "scripts": {}}]}], "tags": [], "variables": {"answer_tolerance": {"name": "answer_tolerance", "templateType": "number", "description": "", "definition": "0.01", "group": "Ungrouped variables"}, "answer": {"name": "answer", "templateType": "anything", "description": "

Present value

", "definition": "present_value", "group": "Ungrouped variables"}, "random_question": {"name": "random_question", "templateType": "anything", "description": "", "definition": "join(split(join(split(join(split(random_question_gaps, \"[future_value]\"),separatethousands(future_value,\",\")),\"[periods]\"), separatethousands(periods,\"\")),\"[interest_rate]\"),separatethousands(interest_rate*100,\"\"))\n\n\n\n\n\n\n", "group": "Ungrouped variables"}, "random_question_gaps": {"name": "random_question_gaps", "templateType": "anything", "description": "

A question selected at random from the list of questions stored in the variable questions. 

", "definition": "random(questions)", "group": "Ungrouped variables"}, "multiplier": {"name": "multiplier", "templateType": "anything", "description": "", "definition": "(1+interest_rate)^(-1*periods)", "group": "Ungrouped variables"}, "periods": {"name": "periods", "templateType": "randrange", "description": "", "definition": "random(1..25#1)", "group": "Ungrouped variables"}, "questions": {"name": "questions", "templateType": "list of strings", "description": "", "definition": "[ \"If you could receive \u00a3[future_value] in [periods] years, what would you pay for it now, assuming the time value of money is [interest_rate]%?\", \"A contact has alerted you that a prestigeous office property is due to come on the market in [periods] years time for \u00a3[future_value] . What is the present value of this sum, assuming the time value of money is [interest_rate]%?\", \"How much should you save today, in order to have \u00a3[future_value] in [periods] years time, if interest rates are [interest_rate]%?\", \"What is the present value of a future sum of \u00a3[future_value] , receivable in [periods] years, with a discount rate of [interest_rate]%?\", \"If the interest rate is [interest_rate]%, how much would you need to pay today in order to earn the right to receive \u00a3[future_value] in [periods] years? \" ]", "group": "Ungrouped variables"}, "paymentStr": {"name": "paymentStr", "templateType": "anything", "description": "", "definition": "'\u00a3'+separateThousands(future_value,',')", "group": "Ungrouped variables"}, "present_value": {"name": "present_value", "templateType": "anything", "description": "", "definition": "multiplier*future_value", "group": "Ungrouped variables"}, "interest_rate": {"name": "interest_rate", "templateType": "randrange", "description": "", "definition": "random(0.01..0.15#0.0025)", "group": "Ungrouped variables"}, "future_value": {"name": "future_value", "templateType": "randrange", "description": "", "definition": "random(1000000..70000000#500000)", "group": "Ungrouped variables"}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["periods", "interest_rate", "present_value", "answer", "future_value", "questions", "random_question_gaps", "random_question", "answer_tolerance", "multiplier", "paymentStr"], "rulesets": {}, "variable_groups": [], "preamble": {"js": "", "css": ""}, "type": "question"}]}], "showQuestionGroupNames": false, "feedback": {"showactualmark": true, "intro": "

Use the links on the left side of the screen to select questions.

", "feedbackmessages": [], "showanswerstate": false, "advicethreshold": 0, "allowrevealanswer": true, "showtotalmark": false}, "name": "Cath's copy of Present Value of \u00a31", "type": "exam", "contributors": [{"name": "Cath Jackson", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/1484/"}, {"name": "Rory Shanahan", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/1513/"}], "extensions": ["jsxgraph"], "custom_part_types": [], "resources": []}