Возврат «традиционных» обозначений функций в контексте интерполяции Фурье

в численном анализе мы, студенты, обязаны реализовать код в 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$

где M обозначает матрицу ДПФ, а y обозначает серию эквидистантных значений функции с

$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)
 } 

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


person DwayneHart    schedule 14.06.2016    source источник


Ответы (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
person Therkel    schedule 14.06.2016