Fourier-Transformation

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Antworten
Uemlaeuetmaenn
Beiträge: 4
Registriert: Do Sep 24, 2020 6:20 pm

Fourier-Transformation

Beitrag von Uemlaeuetmaenn »

Ich muss von einer gegebenen Funktion die Fourier-Transformation berechnen (Genau genommen die Fourier-Rücktransformation, aber das ist ja quasi das gleiche). Meine Versuche diesbezüglich sind jedoch alle gescheitert. Hat jemand einen Vorschlag für mich, wie ich das am besten umsetzen kann? Dafür wäre ich sehr dankbar.
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Fourier-Transformation

Beitrag von jogo »

Hallo Uemlaeuetmaenn,

willkommen im Forum!
Wenn Du dies im Sinne der Analysis (mathematisches Teilgebiet) meinst, dann hat dies nichts mit R zu tun.
Falls es etwas mit R zu tun hat, liefere uns bitte entsprechendes Futter (Daten und Code).

Gruß, Jörg
Uemlaeuetmaenn
Beiträge: 4
Registriert: Do Sep 24, 2020 6:20 pm

Re: Fourier-Transformation

Beitrag von Uemlaeuetmaenn »

Hallo Jörg,

ich weiß wie in der Theorie eine Fourier-Transformation und eine Fourier-Rücktransformation funktionieren. Meine konkrete Fourier-Transformierte ist nur leider ein konvergentes unendliches Produkt. Daher kann ich das Integral, das in der Berechnung der entsprechenden Rücktransformationsformel auftaucht, nicht exakt analytisch berechnen. Daher approximiere ich meine Foruieretransformierte mit 1.500 Faktoren. Auf diese Approximation möchte ich nun die Fourier-Rücktransformationsformel werfen, um eine Approximation der gesuchten Funktion zu bekommen. Hier ist mein Code dazu:

Code: Alles auswählen

phi_fourier <- function(x)
{
    product=1
    for(count in 1:1500)
    {product = product*m_0(x/(2**count))}
    return(product)
} %Dieser Teil scheint noch zu funktionieren soweit ich das erkennen kann. Ich kann diese Funktion plotten.

phi <- function(x)
{
    z <- 1/sqrt(2*pi)*myintegrate(function(t){y <- exp(1i*t*x)*phi_fourier(t); return(y)},lower=-Inf,upper=Inf)
    return(z)
} % Dieser Code selbst gibt mir noch keine Fehlermeldung. Diese bekomme ich aber, wenn ich versuche die Funktion zu plotten. 
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Fourier-Transformation

Beitrag von jogo »

Hallo Uemlaeuetmaenn,
Hier ist mein Code dazu: ...
Was verbirgt sich hinter der Funktion myintegrate(). Ohne diese Funktion ist Dein Code nicht reproduzierbar.
Auch die Definition der Funktion m_0() hast Du nicht mitgeliefert.
Wenn die Funktion m_0() mit Vektoren gut umgehen kann, dann kannst Du die Funktion phi_fourier() auch so definieren

Code: Alles auswählen

phi_fourier <- function(x)
{
  count <- -(1:1500)
  prod(m_0(x^count))
} 
% Dieser Code selbst gibt mir noch keine Fehlermeldung. Diese bekomme ich aber, wenn ich versuche die Funktion zu plotten.
Kannst Du bitte auch zeigen, wie Dein Code für das Plotten aussieht (... Du weißt ... wegen der Reproduzierbarkeit)?

Gruß, Jörg
Uemlaeuetmaenn
Beiträge: 4
Registriert: Do Sep 24, 2020 6:20 pm

Re: Fourier-Transformation

Beitrag von Uemlaeuetmaenn »

Hallo Jörg,

das mit myintegrate wollte ich eigentlich noch schreiben, habs dann aber vergessen. Die Funktion ist aus dem package"elliptic". Ich habe sie statt "integrate" verwendet, weil ein Freund meinte "integrate" kommt nicht mit komplexwertigen Funktionen klar, "myintegrate" dagegen schon.
Hier der restliche Code.

Code: Alles auswählen

function(x)
{z <- 1/sqrt(2)*(0.482963*exp(-1i*1*x)+0.836516*exp(-1i*2*x)+0.224144*exp(-1i*3*x)-0.12941*exp(-1i*4*x));
return(z)}

plot(phi)
Mit freundlichen Grüßen,

Uemlaeuetmaenn
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Fourier-Transformation

Beitrag von jogo »

Hallo Uemlaeuetmaenn,

Code: Alles auswählen

library("elliptic")

m_0 <- function(x) {
  1/sqrt(2)*(0.482963*exp(-1i*1*x)+0.836516*exp(-1i*2*x)+0.224144*exp(-1i*3*x)-0.12941*exp(-1i*4*x))
  # return(z)
}

phi_fourier <- function(x) {
  product=1
  for(count in 1:1500)  product = product*m_0(x/(2**count))
  return(product)
} # Dieser Teil scheint noch zu funktionieren soweit ich das erkennen kann. Ich kann diese Funktion plotten.
plot(phi_fourier)

x <- seq(0, 1, .02)
y <- phi_fourier(x)
plot(x, Re(y), type="l")


phi <- function(x) {
  z <- 1/sqrt(2*pi) * 
    myintegrate(function(t) {y <- exp(1i*t*x)*phi_fourier(t); return(y)},lower=-Inf,upper=Inf)
  return(z)
} 
# Dieser Code selbst gibt mir noch keine Fehlermeldung. 
# Diese bekomme ich aber, wenn ich versuche die Funktion zu plotten. 

plot(phi) # error, weil plot() einen Vektor an die Funktion schickt

# so geht es:
x <- seq(0, 1, .02)
y <- sapply(x, phi)
plot(x, Re(y), type="l")
... und es ist wahr, integrate() kann nicht mit komplexwertigen Funktionen umgehen:
https://stackoverflow.com/questions/383 ... wrong-type

Mein Versuch einer Lösung mit Vectorize() erzeugt im ersten Anlauf auch einen Fehler:

Code: Alles auswählen

plot(Vectorize(phi)) # error: maximum number of subdivisions reached 
weitere Infos zu diesem Fehler gibt es hier:
https://stackoverflow.com/questions/239 ... ns-reached

Gruß, Jörg
Uemlaeuetmaenn
Beiträge: 4
Registriert: Do Sep 24, 2020 6:20 pm

Re: Fourier-Transformation

Beitrag von Uemlaeuetmaenn »

Ok vielen Dank Jörg,

wenn ich das richtig verstehe lag das Problem tatsächlich "nur" im Plotten der Funktion (was ich eigentlich nur machen wollte, um zu sehen, ob der Rest geklappt hat)!? Ich kann also mit dem Rest weiterarbeiten!?

Liebe Grüße,

Ümläütmänn
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Fourier-Transformation

Beitrag von jogo »

Hallo Ümläütmänn,
Uemlaeuetmaenn hat geschrieben: Mo Sep 28, 2020 12:38 pm wenn ich das richtig verstehe lag das Problem tatsächlich "nur" im Plotten der Funktion (was ich eigentlich nur machen wollte, um zu sehen, ob der Rest geklappt hat)!? Ich kann also mit dem Rest weiterarbeiten!?
im Prinzip schon. Gelegentlich muss Du Dir des Problems der nichtvektorisierten Funktionen bewusst sein.
(also solcher Funktionen, die augelegt wurden, um nur eine einzelne Zahl zu verarbeiten, und mit einem Vektor nicht zurecht kommen)

Gruß, Jörg
Antworten