Как построить эту интегральную функцию с границей бесконечности?

Я пытаюсь построить функцию Маркума, которая является интегралом функции Гаусса на границе.

Это функция:

<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 — значение с плавающей запятой, которое должен ввести пользователь. Я написал код для вычисления этой функции при желаемом значении. Однако то, что я собираюсь построить, выглядит примерно так:

!https://ibb.co/SRMsfY3

Вот код для вычисления значения 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? Определите все, что нужно людям для запуска вашего кода. Поскольку вы, кажется, новичок в Stack Overflow, прочтите Как задать хороший вопрос?

Sheldore 10.06.2019 18:49

Спасибо за ответ. я добавил x_data

Majid 10.06.2019 18:56
i не определен в коде, который вы здесь показываете. Но ошибка говорит вам, что i равно 400, что слишком много для массива с 400 значениями (поскольку 400-е значение имеет индекс 399).
ImportanceOfBeingErnest 10.06.2019 18:58

@Majid: Вам нужно сначала узнать для себя, каким должно быть входное значение y. Затем вам нужно убедиться, что при печати len(x_data) и len(z_data) вы получите одно и то же число.

Sheldore 10.06.2019 19:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
251
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Векторизуйте свою функцию и график:

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, а вся правая сторона была заштрихована.

Majid 10.06.2019 19:17

Пожалуйста, посмотрите мой обновленный ответ. Это не совсем то же самое, что и ваше примерное изображение, но я думаю, вы поймете, что за ним стоит.

PythonNoob 10.06.2019 19:48

Большое спасибо. Это очень похоже на то, что я ожидал. так ценится. Мне нужно уменьшить размер линии, сместить аннотацию и немного увеличить заштрихованную область.

Majid 10.06.2019 20:14

Другие вопросы по теме