#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). Есть еще много вещей, которые необходимо сделать, чтобы исправить это, но это ваш первый шаг. Затем вы должны распечатать результат и сравнить его с ожидаемым результатом, чтобы увидеть, что вам нужно делать дальше.