2016-06-14 13 views
4

в численном анализе мы, ученики, обязаны реализовать код в R, который задает функцию f (x), находит свою интерполяцию Фурье tN (x) и вычисляет интерполяционную ошибкуВозвращая «традиционные» обозначения функций в контексте интерполяции Фурье

$||f(x)-t_{N}(x)||=\int_{0}^{2\pi}$ $|f(x)-t_{N}(x)|^2$ 

или множество различных $ N я впервые попытался вычислить D-коэффициенты в соответствии с этим формуляром:

$d = \frac 1N M y$ 

с М, обозначающим матрицу DFT и у обозначей ряд равноудаленной функции значения с

$y_j = f(x_j)$ and 
$x_j = e^{\frac{2*pi*i}N*j}$ 
for $j = 1,..,N-1$. 

Моя цель состояла в том, чтобы придумать сумму, которая может быть описана:

$t_{N}(x) = \Sigma_{k=0}^{N-1} d_k * e^{i*k*x}$ 

Какой бы легче потом интегрироваться в своего рода в дальнейшем аддитивной записи.

f <- function(x) 3/(6+4*cos(x)) #first function to compare with 
g <- function(x) sin(32*x) #second one 
xj <- function(x,n) 2*pi*x/n 

M <- function(n){ 
    w = exp(-2*pi*1i/n) 
    m = outer(0:(n-1),0:(n-1)) 
    return(w^m) 
} 

y <- function(n){ 
    f(xj(0:(n-1),n)) 
} 
transformFunction <- function(n, f){ 
    d = 1/n * t(M(n)) %*% f(xj(0:(n-1),n)) 
    script <- paste(d[1]) 
    for(i in 2:n) 
    script <- paste0(script,paste0("+",d[i],"*exp(1i*x*",i,")")) 
    #trans <- sum(d[1:n] * exp(1i*x*(0:(n-1)))) 
    return(script) 
} 

Основной целью функции преобразования была, на начальном этапе, чтобы вернуть функцию - или, вернее: математическое выражение - которое затем может быть использовано для того, чтобы declarate моей Фурье Интерполяции функции. Проблема заключается, исходя из моих довольно ограниченных знаний, в том, что я не могу интегрировать функции, у которых все еще есть вложенные в них суммы (поэтому я прокомментировал соответствующую строку в коде). Из абсолютного отчаяния я затем попытался вставить каждое из слагаемых в виде текста в дальнейшем, чтобы снова проанализировать их как выражение. Итак, главный вопрос: как мне вернуть математические выражения так, чтобы они могли использовать их как функцию, а затем интегрировать их? Я искренне сожалею о любых недоразумениях или путанице, а также о моем, казалось бы, дилетантском кодировании. Спасибо заранее!

ответ

1

Функция в R может возвращать любой класс, а также объекты класса function. Следовательно, вы можете сделать trans функцией x и вернуть это.

Поскольку функция integrate требует векторизованной функции, мы используем Vectorize перед выдачей.

transformFunction <- function(n, f){ 
    d = 1/n * t(M(n)) %*% f(xj(0:(n-1),n)) 

    ## Output function 
    trans <- function(x) sum(d[1:n] * exp(1i*x*(0:(n-1)))) 
    ## Vectorize output for the integrate function 
    Vectorize(trans) 
} 

Для интеграции, теперь просто сделать новую переменную с выходом transformFunction:

myint <- transformFunction(n = 10,f = f) 

Тест: (integrate может обрабатывать только вещественные функции)

integrate(function(x) Re(myint(x)),0,2)$value + 
    1i*integrate(function(x) Im(myint(x)),0,2)$value 
# [1] 1.091337-0.271636i