如何为x = 5,6,...,50绘制我的函数?

时间:2018-02-19 08:45:40

标签: python-3.x matplotlib

我正在研究secretary problem,我写了以下代码:

import numpy as np
import matplotlib.pyplot as plt
def calc_probability(r,n):
    sum = 0
    for x in range(r,n):
        sum += 1 / (x - 1)
    return sum*((r - 1)/n)

def calc_optimal_k(n):
    k = 0
    probability_k = 0
    for r in range(2,n):
        if (calc_probability(r,n) > probability_k):
            probability_k = calc_probability(r,n)
            k = r
    return k

x = np.arange(5,50,1)
plt.plot(x,calc_optimal_k(x))
plt.show()

我想为n = 5,...,50绘制calc_optimal_k(),但是当我运行此脚本时,我收到以下错误:

line 12, in calc_optimal_k 
   for r in range(2,n):
TypeError: only integer scalar arrays can be converted to a scalar index

显然我的x表格不正确。我查看了下面的example,我读到x需要是一系列标量,所以我不明白我做错了什么。如果x = [5,6,...]那么函数calc_optimal_k应该可以正常工作吗? (我显然错了)

我尝试过不同的方法来编写x,但似乎没有任何帮助。当我定义x = 5时,我没有收到错误,但我的图表看起来像这样

"Graph" when x = 5

哪不能让我到处..

问题:如何绘制我的函数calc_optimal_k for x = 5,6,...,50?

谢谢!

1 个答案:

答案 0 :(得分:1)

您正在使用numpy数组调用函数,但它需要标量n。您可以通过使用标量调用它来解决此问题:

import numpy as np
import matplotlib.pyplot as plt

def calc_probability(r,n):
    sum = 0
    for x in range(r,n):
        sum += 1 / (x - 1)
    return sum*((r - 1)/n)

def calc_optimal_k(n):
    k = 0
    probability_k = 0
    for r in range(2,n):
        if (calc_probability(r,n) > probability_k):
            probability_k = calc_probability(r,n)
            k = r
    return k

x = np.arange(5,50,1)
y = np.array([calc_optimal_k(n) for n in x])
plt.plot(x, y)
plt.show()

我不确定,为什么x(因此我的y)首先是一个numpy数组。如果要使用矢量化方法,则必须在被调用函数中使用numpy's math library。否则,数学库将尝试将数组转换为标量,只有长度为1的数组才能使用。