为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

红颜莎娜 2021-09-14 15:06:04
我一直在尝试生成看起来像这是我到目前为止:import numpy as npimport matplotlib.pyplot as pltfrom scipy.optimize import curve_fitdef 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 zdef 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。
查看完整描述

1 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

您的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')


我得到的结果:

//img1.sycdn.imooc.com//61404a050001795a10930543.jpg

查看完整回答
反对 回复 2021-09-14
  • 1 回答
  • 0 关注
  • 225 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信