2016-09-15 9 views
2

У меня возникли проблемы с интеграционной функцией в R. Я пытаюсь построить интегральную волю, но кажется, что я делаю неправильно.R встроенный интегральный

t <- seq(0, 0.04, 0.0001) 
vi <- function(x) {5 * sin(2 * pi * 50 * x)} 
vo <- function(x) {integrate(vi, lower=0, upper=x)$value} 

test_vect = Vectorize(vo, vectorize.args='x') 
plot(t, vo(t)) # should be a cosine wave 
plot(t, vi(t)) # sine wave 

vo должна быть синусоида, но с использованием test_vect дает мне неправильный участок и использование vo непосредственно дает ошибку «х» и «у» длины отличаются. Может ли кто-нибудь помочь мне в этом вопросе?

ответ

5

Вы уже здесь. Просто используйте plot(t, test_vect(t)). Вы не можете использовать vo, так как integrate не является векторизованной функцией. Нет никакой проблемы, чтобы оценить одну точку, например vo(0.002), но вы не можете ее подарить вектором vo(t). Вот почему мы хотим Vectorize(vo)(t).

enter image description here

Вы сказали, что test_vect не дает правильный участок. Конечно? Мы можем аналитически вычислить интеграл:

v <- function (x) (1-cos(100*pi*x))/(20*pi) 

Тогда давайте сравним:

sum(abs(v(t) - test_vect(t))) 
# [1] 2.136499e-15 

Они же!

+0

Вы абсолютно правы. Большое спасибо за ответ. –