Гауссова функция Монте-Карло с петлями

#python #function #loops

Вопрос:

Я пытаюсь выполнить домашнее задание для класса и испытываю проблемы с выполнением этой функции. В нашей лаборатории мы создали monte_carlo_chisquared вот так:

 import math

def chisquared(x, degrees_of_freedom):
    k = degrees_of_freedom
    return (1 / ( (2 ** (k / 2)) * (math.gamma(k/2)) )) * (x ** ((k/2)- 1)) * (math.e ** (-x/2))
    
def plotcho(x: list, degrees_of_freedom: int):
    import matplotlib.pyplot as plt
    y = [chisquared(xi, degrees_of_freedom) for xi in x]
    plt.plot(x,y)
    plt.show()
    pass

def under_curve(x, y, degrees_of_freedom):
    """
    >>> under_curve(1, 0.15, 3)
    True
    
    >>> under_curve(4, 0.2, 3)
    False
    
    """
    fx = chisquared(x, degrees_of_freedom)
    if (0 <= y) and (y <= fx):
        return True
    else:
        return False
    
def less_than(x,b):
    return x < b

def monte_carlo_chisquared(b: float, degrees_of_freedom: int, n: int):
    import numpy as np
    x = np.random.uniform(low=0.0, high=b, size=n)
    y = np.random.uniform(low=0.0, high=b, size=n)
    
    i = 0 
    ndartsunder = 0
    ndarts = 0 
    for xi in x:
        yi = y[i]
        
        if less_than(xi, b):
            ndartsunder = ndartsunder   1*under_curve(xi, yi, degrees_of_freedom)
            ndarts  = 1
        i  = 1
    prob_under_curve = ndartsunder / ndarts
    return b*prob_under_curve
 

Теперь мне нужно создать monte_carlo_gaussian. До сих пор у меня это есть, но это не работает. Я скопировал и вставил monte_carlo_chisquared и внес несколько изменений, но я думаю, что мне нужно сделать еще больше, я просто не уверен, что делать.

введите описание изображения здесь

 
import math

def gaussian(x):
    return ((1 / math.sqrt(2 * math.pi) * math.e) ** ( (-x ** 2) / 2))

# Problem 2.

def under_curve(x, y):
    if 0 <= y <= gaussian(x):
        return True
    else:
        return False

# Problem 3.

def greater_than(x, a):
    if x > a:
        return True
    else:
        return False

# Problem 4.

def less_than(x, b):
    if x < b:
        return True
    else:
        return False

# Problem 5.

def monte_carlo_gaussian(a, b, n):
    import numpy as np
    x = np.random.uniform(low=a, high=b, size=n)
    y = np.random.uniform(low=a, high=b, size=n)
    
    i = 0 
    ndartsunder = 0
    ndarts = 0 
    for xi in x:
        yi = y[i]
        
        if less_than(xi, b) is True and greater_than(xi, a) is True:
            ndartsunder = ndartsunder   1 * under_curve(xi, yi)
            ndarts  = 1
        i  = 1
    prob_under_curve = ndartsunder / ndarts
    return b * prob_under_curve
 

Я был бы признателен за любую помощь/советы, которые помогут мне двигаться в правильном направлении для создания этой функции. Большое вам спасибо!

Комментарии:

1. Знаете ли вы, как, по идее, должна работать эта функция? Если нет, то у вас еще нет вопроса по теме переполнения стека. Если вы это сделаете и у вас возникнет конкретная проблема при его программировании, то ваш пост должен содержать описание указанной проблемы.

2. ФУ-У-У. Похоже, у вас неправильная скобка в функции Гаусса. Если вы построите график, он должен достичь пика только около 0,4. Что-то вроде (math.e ** ((-x ** 2) / 2)) / math.sqrt(2 * math.pi) этого будет работать лучше.

Ответ №1:

Кажется, что в строках:

         if less_than(xi, b) is True and greater_than(xi, a) is True:
            ndartsunder = ndartsunder   1 * under_curve(xi, yi)
            ndarts  = 1
 

Вы хотите суммировать значения, вычисленные с помощью функции Гаусса. Но ваша функция Гаусса возвращает значение true или false, а не значение, заданное функцией Гаусса.

Комментарии:

1. Я не совсем уверен, что мне следует для этого делать. Могу ли я изменить строку «если»?

2. Вы должны изменить свою функцию under_curve(x, y). Есть еще много вещей, которые необходимо сделать, чтобы исправить это, но это ваш первый шаг. Затем вы должны распечатать результат и сравнить его с ожидаемым результатом, чтобы увидеть, что вам нужно делать дальше.