我一直在尝试生成看起来像这是我到目前为止: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')
我得到的结果:
添加回答
举报
0/150
提交
取消