Как построить биномиальную функцию? - PullRequest
2 голосов
/ 24 января 2020
def fac(n):
    value = 1
    for i in range(2,n+1):
        value = value * i
    return value

def C(n,k):
    return fac(n)/(fac(k) * (fac(n-k)))

for k in range(1,100):
    for n in [10,20,30]:
        F=C(n,k)
plt.plot(k,F)
plt.legend()
plt.show()

Я хочу построить биномиальную функцию как функцию в k для определенных значений n, скажем, для n = 10, 20, 30, ...

Однако я не знаю, как это построить.

Ответы [ 2 ]

3 голосов
/ 24 января 2020

Я подозреваю, что есть конкретная c причина не использовать NumPy, поэтому вот решение с использованием простого Python.

Если вы говорите о биномиальное распределение , тогда в формулу необходимо включить вероятность p . Я добавил это в коде ниже. (Если вы на самом деле хотите иметь только биномический коэффициент , удалите два члена pow.)

В общем, для построения графика вам необходимо собрать x и y значений в некоторых массивах (скажем, X и Y), так что вы можете использовать plt.plot(X, Y) для построения всей функции.

В вашем примере вы также нужно переключить два цикла, потому что вы хотите иметь три функции, каждая для k = [1 ... 100].

Это было бы моим решением:

from matplotlib import pyplot as plt

def fac(n):
    value = 1
    for i in range(2, n+1):
        value = value * i
    return value

def C(n, k, p):
    return fac(n)/(fac(k) * (fac(n-k))) * pow(p, k) * pow(1-p, n-k)

for N in [10, 20, 30]:
    X = []
    Y = []
    for K in range(1, 100):
        X.append(K)
        Y.append(C(N, K, 0.5))
    plt.plot(X, Y)
plt.legend(('N = 10', 'N = 20', 'N = 30'))
plt.show()

Сгенерированный вывод будет выглядеть следующим образом :

Output

Надеюсь, это поможет!

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.1
Matplotlib:  3.2.0rc1
----------------------------------------
1 голос
/ 24 января 2020

Хороший вопрос!

«Типичным» способом построения функции является вычисление 2 векторов (списков). Одно из значений х и один из f (x), а затем построить их. Вы можете либо ввести свои значения x, либо использовать одну из нескольких удобных функций, таких как numpy.linspace, для их создания. Вы можете (и должны) также использовать понимание списка для получения значений y. Вот игрушечный пример:

from matplotlib import pyplot as plt
def f(x):  # just return x squared
    return x**2
x = range(10)
y = [f(t) for t in x]
plt.plot(x,y)

производит:

enter image description here

Если вы хотите сделать график более плавным и использовать много значений для x, затем используйте numpy.linspace, возможно, примерно так:

import numpy as np
x = np.linspace(0,20,1000)  # low, high, number of pts
y = [np.sin(4*t) for t in x]
plt.plot(x,y)

enter image description here

Вы должны иметь возможность использовать любую функцию, которую хотите вычислить вы у-значения и использовать эту структуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...