Тест Рэлея, получение только одного ответа от функции (Python3) - PullRequest
0 голосов
/ 11 декабря 2018

Я пытался сгенерировать график, который выглядит как

Это то, что у меня есть:

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Я получил полный список только одного номера.Это почему?До этого я получал ошибку float64, если я использовал сумму вместо np.sum.Я просто не знаю, как вызвать эту релейную функцию и перебрать все числа (n = 528) из файла с каждой частотой.

Если я просто вызову

z = rayleightest(t, f)

, я получил толькопервый ответ с t1.

1 Ответ

0 голосов
/ 11 декабря 2018

Ваша main() функция содержит list1 = list(map(rayleightest,t,f)).Вот как вы получаете один ответ на пару значений в t и f и получаете в результате несколько значений.Другими словами, код вычисляет rayleightest(t[0], f[0]), затем rayleightest(t[1], f[1]) и т. Д.

Когда вы используете код z = rayleightest(t, f), вы передаете 2 массива вместо 2 чисел.Результатом является одно значение, потому что формула в rayleightest() содержит np.sum() - вы суммируете все значения в массивах в одно значение.

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

Теперь вопрос, почему вы получаете те же значения в списке в первом случае.Потому что для каждой пары чисел вы в основном вычисляете sin(x * y) ** 2 + cos(x * y) ** 2, который всегда 1, поэтому z в rayleightest равняется просто 1 / n.

EDIT

Теперь, когда вы предоставили оригинальную формулу, которую пытаетесь реализовать с помощью кода, стало более понятно, в чем проблема на самом деле.

Изменения, которые я сделал:

(1) list1 = [rayleightest(t, val) for val in f]

(2) x = np.arange(fmin, fmax, fstep)

(3) plt.plot(x, list1, 'r-', label='data')

Результат, который я получаю:

enter image description here

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