2015-05-07 2 views
1

Я пытаюсь построить функцию в R, представляющую квадратные и пилообразные волны со 100 Гц в диапазоне [0,1]. Я попытался это:Программирование прямоугольной волны и пилообразной волны в R

squarewave <- function (t) { 

    # 0.01 == 100Hz(=2Pi) -> 1 Period of the Squarewave 
    # 0.005 == Pi   -> Half Period of the Squarewave 
    # if t smaller than a half period -> 1 
    # if t greater or equal than half a period -> 0 

    if ((t %% 0.01) < 0.005) 
    return (1) 
    else if ((t %% 0.01) >= 0.005) 
    return (0) 

} 

Когда я пытаюсь построить эту функцию:

plot(squarewave) 

Я получаю следующее сообщение об ошибке:

> plot(squarewave) 
Error in curve(expr = x, from = from, to = to, xlim = xlim, ylab = ylab, : 
    'expr' has not been evaluated to an object of length 'n' 
In addition: Warning message: 
In if ((t%%0.01) < 0.005) return(1) else if ((t%%0.01) >= 0.005) return(0) : 
    the condition has length > 1 and only the first element will be used 

Так почему это не работает?

+0

Сообщите свою ошибку на английском языке, а не по-немецки. – Naruto

+1

Вы не передаёте какие-либо параметры 'squarewave' при его построении. Вы не можете напрямую строить такую ​​функцию. –

ответ

2

Вам необходимо передать векторную функцию в plot. Поэтому либо используйте Vectorize, чтобы сделать это автоматически, либо используйте ifelse вместо if.

plot(Vectorize(squarewave)) 

или

squarewave2 <- function (t) { 

    # 0.01 == 100Hz(=2Pi) -> 1 Period of the Squarewave 
    # 0.005 == Pi   -> Half Period of the Squarewave 
    # if t smaller than a half period -> 1 
    # if t greater or equal than half a period -> 0 

    ifelse(((t %% 0.01) < 0.005),1,0) 
} 

plot(squarewave2) 

Чтобы увеличить разрешение plot, используйте параметр n см ?curve для деталей.

+0

Извините, я понял это и удалил свой комментарий, прежде чем заметил, что вы ответили. Во всяком случае, я предложил 'n', как вы сказали, и все получилось отлично. Я не знал этого раньше, поэтому я узнал что-то сегодня из вашего ответа. – TARehman

+0

Вот в чем смысл! При использовании ifelse-Statement функция появляется в виде векторизованной функции, которая может быть построена. Затем сюжет казался трапецией. Чтобы сюжет выглядел как настоящая квадратная волна, вам нужно увеличить n-значение графика функции. Спасибо Джеймсу! – tbol

0

Первоначально я был неправ, хотел обновить.

Если не указано, это правильно векторизованное, вы не можете построить необработанную функцию и вместо этого построить график функции. Ниже приведен простой способ сделать это с помощью вашей конкретной функции.

sequence <- seq(from = 0,to = 0.01, by = 0.00001) 
plot(sapply(X = sequence,FUN = squarewave),type = "o") 
+0

это не так: cos64hz <- функция (т) { возврата (соз (2 * 64 * пи * т)) } отлично работает с: участка (cos64hz, тип = "л", xlim = c (0,1/20), ylim = c (-1,1,5), col = "blue", ylab = "Amplitude", xlab = "Zeit [sec]") – tbol

+0

Не могли бы вы уточнить? Я произвел очень приятную квадратную волну, используя ее. – TARehman

+0

@AlexA. Функция, написанная, не примет вектор в качестве аргумента, следовательно, использование 'sapply()' для получения вектора. – TARehman

Смежные вопросы