Monte Carlo integration of the function
We sample
then we approximate
where in this case
Monte Carlo integration of the function
We sample
then we approximate
where in this case
<!DOCTYPE html> | |
<meta charset="utf-8"> | |
<html> | |
<head> | |
<title>MC Integration</title> | |
<script src="http://d3js.org/d3.v3.min.js"></script> | |
<style> | |
/* Colors | |
White: rgba(245,243,242,1); | |
Black: rgba(53,48,47,1); | |
Red: rgba(189,54,19,1); | |
Grey: rgba(113,107,105,1); | |
Light: rgba(208,199,198,1); | |
*/ | |
body { | |
font-family: "Helvetica", sans-serif; | |
font-size: 10px; | |
} | |
.axis { | |
font: 10px sans-serif; | |
} | |
.axis path, | |
.axis line { | |
fill: none; | |
stroke: #000; | |
shape-rendering: crispEdges; | |
} | |
.point { | |
fill: rgba(189,54,19,1); | |
stroke: white; | |
} | |
.point-fade { | |
fill: rgba(208,199,198,0.5); | |
stroke: white; | |
} | |
.path { | |
fill: none; | |
stroke: rgba(113,107,105,1); | |
stroke-width: 2px; | |
} | |
</style> | |
<body> | |
<script> | |
(function() { | |
// Function to integrate | |
function f(x) { return x*x; } | |
// function f(x) { return Math.sqrt(1 - x*x); } | |
var num_points = 1000; | |
var num_path_steps = 100; | |
var path_step = 1.0/num_path_steps; | |
var drawDelay = 1000; | |
var minDrawDelay = 1; | |
var fadeDur = 500; | |
var margin = {top: 20, right: 20, bottom: 40, left: 40}, | |
width = 944 - margin.left - margin.right, // was 512 | |
height = 480 - margin.top - margin.bottom; | |
var x = d3.scale.linear() | |
.range([0, width]) | |
.domain([0, 1]); | |
var y = d3.scale.linear() | |
.range([height, 0]) | |
.domain([0, 1]); | |
var xAxis = d3.svg.axis() | |
.scale(x) | |
.orient("bottom"); | |
var yAxis = d3.svg.axis() | |
.scale(y) | |
.orient("left"); | |
// Draw SVG | |
var svg = d3.select("body").append("svg") | |
.attr("width", width + margin.left + margin.right) | |
.attr("height", height + margin.top + margin.bottom) | |
.append("g") | |
.attr("transform", "translate(" + margin.left + "," + margin.top + ")"); | |
// X axis | |
svg.append("g") | |
.attr("class", "x axis") | |
.attr("transform", "translate(0," + height + ")") | |
.call(xAxis); | |
// Y axis | |
svg.append("g") | |
.attr("class", "y axis") | |
.call(yAxis); | |
// Path | |
path_xy = d3.range(num_path_steps+1) | |
.map(function(i) { return [i*path_step, f(i*path_step)]; }); | |
// Accessor function | |
var lineFunction = d3.svg.line() | |
.x(function(d) { return x(d[0]); }) | |
.y(function(d) { return y(d[1]); }) | |
.interpolate("cardinal"); | |
svg.append("path") | |
.datum(path_xy) | |
.attr("class", "path") | |
.attr("d", lineFunction); | |
var data_xy = d3.range(num_points) | |
.map(function() { return [Math.random(), Math.random()]; }); | |
var data_under = d3.range(num_points) | |
.map(function(i) { | |
return data_xy[i][1] < f(data_xy[i][0]); }); | |
// Sum values in an array via reduce() | |
var sum = data_under.reduce((a, b) => a + b); | |
console.log(sum); | |
var success = 0; | |
// Walker number in top right | |
var trialsText = svg.append("text") | |
.attr("id", "trials-text") | |
.attr("class", "svg-small-text") | |
.style("text-anchor", "start") | |
.attr("x", 20) | |
.attr("y", 4); | |
// Walker number in top right | |
var intText = svg.append("text") | |
.attr("id", "int-text") | |
.attr("class", "svg-small-text") | |
.style("text-anchor", "start") | |
.attr("x", 20) | |
.attr("y", 24); | |
function drawPoints(data_xy, data_under, j) { | |
setTimeout(function() { | |
d3.select('#trials-text').text("Trials: " + (j+1)); | |
d3.select('#int-text').text("Integral: " + (success/(j+1)).toFixed(4)); | |
// console.log("Point:" + j); | |
// console.log("Under?" + data_under[j]); | |
// console.log("delay " + drawDelay); | |
var circle = svg.append("svg:circle") | |
.transition() | |
.ease("bounce") | |
.attr("class", "point") | |
.attr("cx", function () { return x(data_xy[j][0]); } ) | |
.attr("cy", function () { return y(data_xy[j][1]); } ) | |
.attr("r", 8); | |
if (data_under[j]) { | |
circle.transition() | |
.duration(fadeDur) | |
.attr("r", 4); | |
success++; | |
} | |
else { | |
circle.transition() | |
.duration(fadeDur) | |
.style("opacity", 0.25) | |
.attr("r", 4); | |
} | |
j++; | |
if (j < data_xy.length) { | |
drawPoints(data_xy, data_under, j); | |
} | |
// Accelerate by shrinking drawDelay on each step. | |
drawDelay = Math.max(minDrawDelay, Math.floor(drawDelay*0.95)); | |
}, drawDelay); | |
} | |
drawPoints(data_xy, data_under, 0); | |
})(); | |
</script> | |
</body> | |
</html> |