Montecarlo Matlab
This commit is contained in:
27
Bounds.m
Normal file
27
Bounds.m
Normal file
@@ -0,0 +1,27 @@
|
||||
classdef Bounds
|
||||
%BOUNDS Summary of this class goes here
|
||||
% Detailed explanation goes here
|
||||
|
||||
properties
|
||||
x LinearBounds
|
||||
y LinearBounds
|
||||
end
|
||||
|
||||
methods
|
||||
function obj = Bounds(xIn,yIn) %BOUNDS Construct an instance of this class
|
||||
% Detailed explanation goes here
|
||||
obj.x = xIn;
|
||||
obj.y = yIn;
|
||||
end
|
||||
|
||||
function outputArg = area(obj)
|
||||
%METHOD1 Summary of this method goes here
|
||||
% Detailed explanation goes here
|
||||
outputArg = obj.x.length * obj.y.length;
|
||||
end
|
||||
function outputArg = getRandomPoint(obj)
|
||||
outputArg = Point(obj.x.getRandomValue, obj.y.getRandomValue);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
25
LinearBounds.m
Normal file
25
LinearBounds.m
Normal file
@@ -0,0 +1,25 @@
|
||||
classdef LinearBounds
|
||||
%LINEARBOUNDS Summary of this class goes here
|
||||
% Detailed explanation goes here
|
||||
|
||||
properties
|
||||
lower double
|
||||
higher double
|
||||
end
|
||||
|
||||
methods
|
||||
function obj = LinearBounds(lowerIn,higherIn)
|
||||
obj.lower = lowerIn;
|
||||
obj.higher = higherIn;
|
||||
end
|
||||
|
||||
function outputArg = length(obj)
|
||||
outputArg = abs(obj.higher-obj.lower);
|
||||
end
|
||||
|
||||
function outputArg = getRandomValue(obj)
|
||||
outputArg = obj.lower + (rand() * obj.length);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
47
MonteCarloMatlab.m
Normal file
47
MonteCarloMatlab.m
Normal file
@@ -0,0 +1,47 @@
|
||||
tic;
|
||||
samples = 10000000;
|
||||
xBounds = LinearBounds(0,20);
|
||||
yBounds = LinearBounds(-10,150000);
|
||||
bounds = Bounds(xBounds,yBounds);
|
||||
pointsInside = 0;
|
||||
realValue = realIntegral(bounds.x);
|
||||
|
||||
for i = 0:samples
|
||||
toTestPoint = bounds.getRandomPoint;
|
||||
if getIsInside(toTestPoint)
|
||||
pointsInside = pointsInside+1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
format longG
|
||||
integral = (pointsInside/samples)*bounds.area
|
||||
realValue
|
||||
error = abs(realValue-integral)
|
||||
samples
|
||||
toc
|
||||
|
||||
|
||||
|
||||
function out = mainFunction(x)
|
||||
out = x^4-4*x^3+18*x^2-12*x-69;
|
||||
end
|
||||
|
||||
function out = indefiniteIntegral(x)
|
||||
out = (1/5)* x^5 - x^4 + 6* x^3 - 6*x^2 - 69*x;
|
||||
end
|
||||
|
||||
function out = getIsInside(p)
|
||||
arguments
|
||||
p Point
|
||||
end
|
||||
y_0 = mainFunction(p.x);
|
||||
out = abs(y_0) > abs(p.y) && y_0 * p.y >= 0;
|
||||
end
|
||||
|
||||
function out = realIntegral(bounds)
|
||||
arguments
|
||||
bounds LinearBounds
|
||||
end
|
||||
out = indefiniteIntegral(bounds.higher) - indefiniteIntegral(bounds.lower);
|
||||
end
|
||||
Reference in New Issue
Block a user