Я пытаюсь построить функцию Маркума, которая является интегралом функции Гаусса на границе.
Это функция:
<a href = "https://www.codecogs.com/eqnedit.php?latex=Q(y)=\int_{y}^{\infty}\frac{1}{2\pi}\exp(-\frac{x^2}{2})~dx" target = "_blank"><img src = "https://latex.codecogs.com/gif.latex?Q(y)=\int_{y}^{\infty}\frac{1}{2\pi}\exp(-\frac{x^2}{2})~dx" title = "Q(y)=\int_{y}^{\infty}\frac{1}{2\pi}\exp(-\frac{x^2}{2})~dx" /></a>
y — значение с плавающей запятой, которое должен ввести пользователь. Я написал код для вычисления этой функции при желаемом значении. Однако то, что я собираюсь построить, выглядит примерно так:
Вот код для вычисления значения Q(y):
from scipy.integrate import quad
import scipy, numpy, math
from scipy import integrate
def integrand(x):
Q_y = (1/(math.sqrt(2*math.pi)))*math.exp((-x**2)/2)
return Q_y
y = input('y=')
ans, err = quad(integrand, float(y), math.inf)
print(ans)
Я попытался построить его, используя следующий код:
x_data=np.arange(-20,20,0.1)
z_data=np.arange(float(y),1000,1)
ans, err = quad(integrand, float(y), math.inf)
print(ans)
for item in x_data:
z_data[i]=integrand(x_data[i])[0]
i+=1
fig = plt.figure(1, figsize=(4,4))
plt.plot(x_data,z_data,color= 'blue',linestyle='--', label=label1)
который возвращает следующую ошибку:
File "C:/Users/m.rafiee/.spyder-py3/temp.py", line 59, in <module>
z_data[i]=integrand(x_data[i])[0]
IndexError: index 400 is out of bounds for axis 0 with size 400
Я также не знаю, как добавить аннотации, показанные на рисунке, и заштрихованную область на графике.
Я очень благодарен за любую помощь заранее.
Спасибо за ответ. я добавил x_data
i
не определен в коде, который вы здесь показываете. Но ошибка говорит вам, что i
равно 400, что слишком много для массива с 400 значениями (поскольку 400-е значение имеет индекс 399).
@Majid: Вам нужно сначала узнать для себя, каким должно быть входное значение y
. Затем вам нужно убедиться, что при печати len(x_data)
и len(z_data)
вы получите одно и то же число.
Векторизуйте свою функцию и график:
from scipy.integrate import quad
import scipy as sc, numpy as np, math
from scipy import integrate
import matplotlib.pyplot as plt
def integrand(x):
Q_y = (1/(math.sqrt(2*math.pi)))*math.exp((-x**2)/2)
return Q_y
func = np.vectorize(integrand)
x = np.arange(-3, 3, 0.1)
fig = plt.figure()
ax = plt.gca()
y = input('y=')
y = float(y)
result = integrand(y)
x_user = np.arange(y, 3, 0.1)
ax.axvline(y, color='green', lw=2, alpha=0.5)
ax.fill_between(x_user, func(x_user), facecolor = "none", hatch = "/", edgecolor = "red")
ax.annotate('Q({0}) = {1}'.format(y, round(result, 2)), xy=(0, result), xytext=(0, result))
ax.plot(x, func(x))
Спасибо. Это сработало. Не могли бы вы помочь мне и во второй части моего вопроса. Как я могу добавить штриховку и маркер к этому графику в соответствии со значением y, которое вводит пользователь? Например, пользователь вводит 2, и я хочу, чтобы на графике была показана вертикальная линия с номером 2 по оси x, а вся правая сторона была заштрихована.
Пожалуйста, посмотрите мой обновленный ответ. Это не совсем то же самое, что и ваше примерное изображение, но я думаю, вы поймете, что за ним стоит.
Большое спасибо. Это очень похоже на то, что я ожидал. так ценится. Мне нужно уменьшить размер линии, сместить аннотацию и немного увеличить заштрихованную область.
Предоставьте исполняемый код со всеми определенными переменными. Что такое
x_data
? Определите все, что нужно людям для запуска вашего кода. Поскольку вы, кажется, новичок в Stack Overflow, прочтите Как задать хороший вопрос?