A grassy field is in the shape of a circle of radius 100m and is enclosed by a circular fence.
A goat is attached by a rope to a hook at a fixed point on the fence.
To stop the goat getting too fat, the farmer wants to make sure that the goat can only reach half the grass in the field.
How long should the rope be?
Today in our math class, us student teachers were given a puzzle and had to decide what year level it would be appropriate for. After a minute or so of working, it became clear that the solution could only be found numerically. I started by working out the math involved in finding the area and then searched for someone elses solution which I found here. I made that solution in JavaScript which you can play with here.
The code that runs when “Calculate!” is pressed is below.
function calculateRadius() {
// Get the input variables
var originalRadius = document.forms["goat"]["originalRadius"].value;
var answerPrecisionDecimals = document.forms["goat"]["precision"].value;
var howMuchOfOriginalArea = document.forms["goat"]["newAreaPercentage"].value;
// Check validity
if (isNaN(originalRadius) || isNaN(answerPrecisionDecimals) || isNaN(howMuchOfOriginalArea)) {
document.getElementById("goatResult").innerHTML = "ERROR: input values are not numbers.";
return;
}
if (originalRadius <= 0) {
document.getElementById("goatResult").innerHTML = "ERROR: Circular Field Radius < 0.";
return;
}
if (howMuchOfOriginalArea <= 0 || howMuchOfOriginalArea >= 1) {
document.getElementById("goatResult").innerHTML = "ERROR: Fraction of original area is out of range. If it goes out of bounds, the solution wont be found by the program.";
return;
}
if (answerPrecisionDecimals >=20 || answerPrecisionDecimals < 1) {
document.getElementById("goatResult").innerHTML = "ERROR: Answer precision out of range. Floating point numbers can do strange thing if you ask for too much precision.";
return;
}
// Calculate areas from the input
var originalArea = Math.PI * Math.pow(originalRadius, 2);
var errorAllowed = 1.0/Math.pow(10,answerPrecisionDecimals);
var newArea = howMuchOfOriginalArea * originalArea;
// From our starting variables, define the edges of our solution search
var upperRadius = 2 * originalRadius;
var lowerRadius = 0.0;
var midRadius = lowerRadius + (upperRadius - lowerRadius)/2;
var prevMidRadius = 0;
var calculatedArea = 0;
var iterations = 0;
// Binary search for solution
var output = "------------------------------------------------------------------\n" + "Area of the field = " + originalArea.toFixed(answerPrecisionDecimals).toString() + "\nArea that the goat can eat (" + howMuchOfOriginalArea.toString() + " of the field) = " + newArea.toFixed(answerPrecisionDecimals).toString() +"\n" + "------------------------------------------------------------------\n";
while (Math.abs(midRadius - prevMidRadius) > errorAllowed) {
// Assume the midRadius is the right radius and calculate the area
calculatedArea = Math.pow(midRadius, 2) * Math.acos(midRadius/(2 * originalRadius)) + Math.pow(originalRadius, 2) * Math.acos((2 * Math.pow(originalRadius, 2) - Math.pow(midRadius, 2))/(2 * Math.pow(originalRadius, 2))) - 0.5 * midRadius * Math.sqrt((4 * Math.pow(originalRadius, 2) - Math.pow(midRadius, 2)));
if (calculatedArea > newArea) {
// The mid radius is too big, so change the upper bounds
upperRadius = midRadius;
} else {
// The mid radius is too small, so change the lower bounds
lowerRadius = midRadius;
}
// Update our previous mid radius, mid radius, counter and output string
prevMidRadius = midRadius;
midRadius = lowerRadius + (upperRadius - lowerRadius)/2;
iterations++;
output += "Step " + iterations.toString() + ": Radius = " + midRadius.toFixed(answerPrecisionDecimals).toString() + ", Area = " + calculatedArea.toFixed(answerPrecisionDecimals).toString() + "\n";
}
output += "------------------------------------------------------------------\nThe goat's rope needs to be " + midRadius.toFixed(answerPrecisionDecimals).toString() + " long.";
// Solution has been found. Lets display it
document.getElementById("goatResult").innerHTML = output;
}