瑞利测试,仅从函数中得到一个答案(Python3)

我一直在尝试生成看起来像

http://img2.mukewang.com/614049f30001d06306490218.jpg

这是我到目前为止:


import numpy as np

import matplotlib.pyplot as plt

from scipy.optimize import curve_fit


def rayleightest(t, f):

    pi = np.pi

    n = 528

    z = (1.0/n)*((np.sum(np.cos(2.0*pi*f*t)))**2+(np.sum(np.sin(2.0*pi*f*t)))**2)

    return z


def main():

    file = 'Rayleighdata.dat'


    t0 = np.loadtxt(file, usecols=(0,))

    t = np.array(t0)


    Pmax = 90

    Pmin = 1.5

    fmin = 1/Pmax

    fmax = 1/Pmin

    t1 = 1.08

    tn = 359.393

    T = tn - t1

    f0 = 1/T

    OFAC = 2.245

    fstep = f0/OFAC

    M = int((fmax-fmin)/fstep)

    j = 2348

    fj = fmin + j*fstep


    fk = np.arange(fmin, fmax, fstep)

    f = np.array(fk)



    list1 = list(map(rayleightest,t,f))


    x = np.linspace(fmin, fmax, fstep)


    plt.plot(x, list1, marker='o', linestyle='--', label='data')



    plt.legend()

    plt.show()





if __name__ == "__main__":

main() 

现在,如果我打印 list1,我得到的只有一个数字的完整列表。这是为什么?在此之前,如果我使用 sum 而不是 np.sum,则会出现 float64 错误。我只是不知道如何调用该 rayleightest 函数并以每个频率迭代文件中的所有数字(n = 528)。


如果我只是打电话


z = rayleightest(t, f)

我只得到了第一个答案t1。


红颜莎娜
浏览 261回答 1
1回答

手掌心

您的main()函数包含list1 = list(map(rayleightest,t,f)). 这就是您如何在和 中获得每对值一个答案t并f因此获得一堆值。换句话说,代码计算rayleightest(t[0], f[0]),然后rayleightest(t[1], f[1]),依此类推。当您使用代码时,z = rayleightest(t, f)您会传递 2 个 numpy 数组而不是 2 个数字。结果是单个值,因为中的公式rayleightest()包含np.sum()- 您将数组中的所有值汇总为一个值。因此,公式是您为不同的输入数据获得单一值的原因。如果这是计算过程的预期行为,则由您来回答问题。现在回答为什么在第一种情况下在列表中获得相同值的问题。因为对于每对数字,你基本上计算sin(x * y) ** 2 + cos(x * y) ** 2它总是1如此zinrayleightest等于 just 1 / n。编辑现在,当您提供了尝试用代码实现的原始公式时,问题实际上是什么就变得更加清楚了。我所做的修改:(1) list1 = [rayleightest(t, val) for val in f](2) x = np.arange(fmin, fmax, fstep)(3) plt.plot(x, list1, 'r-', label='data')我得到的结果:
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python