init commit
This commit is contained in:
85
MonteCarlo_python.py
Normal file
85
MonteCarlo_python.py
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
import random
|
||||||
|
import time
|
||||||
|
|
||||||
|
from scipy.integrate import quad
|
||||||
|
|
||||||
|
|
||||||
|
class Point:
|
||||||
|
x: float
|
||||||
|
y: float
|
||||||
|
|
||||||
|
def __init__(self, point: (float, float)):
|
||||||
|
self.x, self.y = point
|
||||||
|
|
||||||
|
|
||||||
|
class LinearBounds:
|
||||||
|
lower: float
|
||||||
|
higher: float
|
||||||
|
|
||||||
|
def __init__(self, lower: float, higher: float):
|
||||||
|
self.lower = lower
|
||||||
|
self.higher = higher
|
||||||
|
|
||||||
|
def length(self) -> float:
|
||||||
|
return self.higher - self.lower
|
||||||
|
|
||||||
|
def get_random_value(self) -> float:
|
||||||
|
return random.uniform(self.lower, self.higher)
|
||||||
|
|
||||||
|
|
||||||
|
class Bounds:
|
||||||
|
x: LinearBounds
|
||||||
|
y: LinearBounds
|
||||||
|
|
||||||
|
def __init__(self, x: LinearBounds, y: LinearBounds):
|
||||||
|
self.x = x
|
||||||
|
self.y = y
|
||||||
|
|
||||||
|
def area(self) -> float:
|
||||||
|
return self.x.length() * self.y.length()
|
||||||
|
|
||||||
|
def get_random_point(self) -> Point:
|
||||||
|
return Point((self.x.get_random_value(), self.y.get_random_value()))
|
||||||
|
|
||||||
|
|
||||||
|
def function(x: float) -> float:
|
||||||
|
return x**4-4*x**3+18*x**2-12*x-69
|
||||||
|
|
||||||
|
|
||||||
|
def getIsInside(p: Point) -> bool:
|
||||||
|
y_0: float = function(p.x)
|
||||||
|
if abs(y_0) > abs(p.y) and y_0*p.y >= 0:
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def getRealIntegral(bounds: LinearBounds) -> float:
|
||||||
|
return quad(function, bounds.lower, bounds.higher)[0]
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
startTime = time.time()
|
||||||
|
pointsInside: int = 0
|
||||||
|
samples: int = 1000000
|
||||||
|
bounds = Bounds(LinearBounds(0, 20), LinearBounds(-100, 150000))
|
||||||
|
|
||||||
|
for i in range(samples):
|
||||||
|
toTestPoint = bounds.get_random_point()
|
||||||
|
if getIsInside(toTestPoint):
|
||||||
|
pointsInside += 1
|
||||||
|
|
||||||
|
integral = (pointsInside / samples) * bounds.area()
|
||||||
|
print(f"The approximated Integral of the function is: {integral:.2f}")
|
||||||
|
|
||||||
|
real_value: float = getRealIntegral(bounds.x)
|
||||||
|
print(f"The real Integral of the function is: {real_value:.2f}")
|
||||||
|
|
||||||
|
error: float = abs(real_value-integral)
|
||||||
|
print(f"That's an error of {error:.2f} or {(error/real_value)*100:.5f}% ")
|
||||||
|
|
||||||
|
print(f"And the whole thing took {time.time()-startTime:.5f} Seconds for {samples} samples")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user