Fourierreihen in R
Fourierreihen in R
Ich versuche eine Fourierreihe zu erstellen welche eine Funktion annähert.
Welche Funktionen ich dafür in R-Programmieren muss sind:
c_j=(1/n)∑Φ_j(X_l) wobei Φ eine Orthonormalbasis und die X_l beschreiben "l" Beobachtungen einer Zufallsvariable
und anschließend:
f(x)=∑c_j*Φ(x), wobei x nun einfach ein reell durchlaufender Parameter ist.
Damit sollen wahrscheinlichkeitsdichtefunktionen angenähert werden. Schon mehrere Stunden erhalte ich keine akzeptable Annäherung (bin ein völliger Anfänger in R).
Gibt es jemanden der mir hier unter die Arme greifen könnte?
Welche Funktionen ich dafür in R-Programmieren muss sind:
c_j=(1/n)∑Φ_j(X_l) wobei Φ eine Orthonormalbasis und die X_l beschreiben "l" Beobachtungen einer Zufallsvariable
und anschließend:
f(x)=∑c_j*Φ(x), wobei x nun einfach ein reell durchlaufender Parameter ist.
Damit sollen wahrscheinlichkeitsdichtefunktionen angenähert werden. Schon mehrere Stunden erhalte ich keine akzeptable Annäherung (bin ein völliger Anfänger in R).
Gibt es jemanden der mir hier unter die Arme greifen könnte?
Re: Fourierreihen in R
Das letzte Mal habe ich mit der Fourier-Analyse vor ein paar Wochen beschäftigt und da ich mir kaum etwas merken kann, hier ein Link (den Du vermutlich schon kennst): http://www.di.fc.ul.pt/~jpn/r/fourier/fourier.html Vielleicht hilft er weiter...
Viele Grüße,
Student
-----------------------------------------------------------------------------------------------------------------------
faes.de, Datenanalyse mit R & das Ad-Oculos-Projekt
Das Ad-Oculos-Projekt auf YouTube
Habe Mut, dich deines eigenen Verstandes zu bedienen! (Kant)
Student
-----------------------------------------------------------------------------------------------------------------------
faes.de, Datenanalyse mit R & das Ad-Oculos-Projekt
Das Ad-Oculos-Projekt auf YouTube
Habe Mut, dich deines eigenen Verstandes zu bedienen! (Kant)
Re: Fourierreihen in R
Hallo student,
ja auf diese Seite bin ich bereits gestoßen bei meiner Suche nach Hilfe! Ich glaube mein Hauptproblem ist, dass ich nicht weiß wie man eine Rechnung mit einer sehr großen Anzahl an Termen in R beschreibt. Also gibt es die Möglichkeit sowas wie einen durchlaufenden Parameter zu definieren?
Ich habe nochmal versucht mein Problem deutlicher darzustellen:
ja auf diese Seite bin ich bereits gestoßen bei meiner Suche nach Hilfe! Ich glaube mein Hauptproblem ist, dass ich nicht weiß wie man eine Rechnung mit einer sehr großen Anzahl an Termen in R beschreibt. Also gibt es die Möglichkeit sowas wie einen durchlaufenden Parameter zu definieren?
Ich habe nochmal versucht mein Problem deutlicher darzustellen:
Re: Fourierreihen in R
Hallo MathHam,
meine Mathematikausbildung war mit dem Abitur abgeschlossen und ich weiß nicht, was eine Orthonormalbasis ist. Ich werde also Dein Problem nicht lösen. Trotzdem möchte ich mich zum Code in Deinem ersten Bildschirmfoto äußern.
Da steht
Gehen wir es zeilenweise durch
Ich vermute, dass s_c_y eine Funktion von j und von X sein soll, da X ja in der Funktion verwendet wird. Daher würde ich hier allgemein s_c_j <- function(j, X) schreiben.
Hier sollte in a schon zehn Ergebnisse zu den zehn Werten in X stehen. Ich vermute, dass die for-Schleife dazu gedacht war, zehnmal was mit den einzelnen Werten von X zu machen. Wenn ja, dann ist sie wahrscheinlich unnötig. Schwer zu sagen, weil der Rest nicht soviel Sinn macht.
Alarm! Hier wird X neu definiert und das ist bestimmt nicht gut. Bis hierhin war X eine Serie von zehn Zufallszahlen, jetzt wird X für den Rest der Funktion die Zahlen von eins bis zehn und wenn wir die Funktion verlassen ist X schon wieder die Serie mit Zufallszahlen. Wenn das so gewollt ist, halte ich das für einen irreführenden Programmierstil, wahrscheinlich ist es aber nicht so gemeint?
Also eine for-Schleife ist dazu da, einen Anweisungsblock mehrfach zu wiederholen. Eine Funktion endet aber beim ersten Aufruf eines return, sodass ein mehrfaches Ausführen von return von vorneherein unmöglich ist.
Wie gesagt, ich werde Dein Problem nicht lösen, aber vielleicht hilft es ja auch schon zu erklären, warum R nicht macht, was Du denkst, dass es das machen sollte.
Im zweiten Screenshot fällt rasch auf, dass ein kleingeschriebenes x genutzt wird. In dem zuvor gezeigten Code gab es nur großgeschriebenes x. Beachte, dass R zwischen x und X unterscheidet wie zwischen x und y.
LG,
Bernhard
meine Mathematikausbildung war mit dem Abitur abgeschlossen und ich weiß nicht, was eine Orthonormalbasis ist. Ich werde also Dein Problem nicht lösen. Trotzdem möchte ich mich zum Code in Deinem ersten Bildschirmfoto äußern.
Da steht
Code: Alles auswählen
n <- 10
X <- rnorm(n)
...
s_c_j <- function(j){
a <- sqrt(2)*cos(j*pi*X)
for(X in (1:n)){
return(...)
Code: Alles auswählen
s_c_j <- function(j){
Code: Alles auswählen
a <- sqrt(2)*cos(j*pi*X)
Code: Alles auswählen
for(X in (1:n)){
Code: Alles auswählen
for(X in (1:n)){
return(...)
Wie gesagt, ich werde Dein Problem nicht lösen, aber vielleicht hilft es ja auch schon zu erklären, warum R nicht macht, was Du denkst, dass es das machen sollte.
Im zweiten Screenshot fällt rasch auf, dass ein kleingeschriebenes x genutzt wird. In dem zuvor gezeigten Code gab es nur großgeschriebenes x. Beachte, dass R zwischen x und X unterscheidet wie zwischen x und y.
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Fourierreihen in R
Hallo bigben,
zunächst Vielen Dank für Ihre Antwort, ich bin sicher mein Code ist etwas mühsam für jemanden der mehr Ahnung von R hat !
Nein, in a ist das Ergebnis nur eine Zahl. Hier werden die Realisationen von X in die Funktion c_j eingesetzt und aufsummiert. Das Ergebnis wird dann durch die Anzahl von Realisationen geteilt. Also als Antwort erhalte ich hier eine Zahl (mein Code gibt auch die richtige Zahl aus)
Ich glaube hier liegt mein Problem. Die verschiedenen s_c_j die nun für jedes j separat berechnet wurden sind nun sozusagen ein konstanter Faktor und in das phi_j setze ich nun ein variables x ein. Also das ist keine Zufallszahl mehr sondern soll einfach eine Variable sein damit ich davon einen Graphen zeichnen lassen kann.
Jedoch muss eigentlich erst die ganze Summe s_c_j*phi_j ausgeschrieben werden und dann kann man das für jedes einzelne x=seq(...) auswerten.
Haben Sie mit den zusätzlichen Informationen eine Ahnung wie ich meine Funktion plotten kann? Es ist nicht so leicht das Thema hier schriftlich zu erläutern...
zunächst Vielen Dank für Ihre Antwort, ich bin sicher mein Code ist etwas mühsam für jemanden der mehr Ahnung von R hat !
Ich dachte es wäre hier sinnvoll, nur das j in der Funktion anzugeben da sich das X dann sowieso anpasst, sobald ich den Vektor X ändere.Gehen wir es zeilenweise durch
s_c_j <- function(j){
Ich vermute, dass s_c_y eine Funktion von j und von X sein soll, da X ja in der Funktion verwendet wird. Daher würde ich hier allgemein s_c_j <- function(j, X) schreiben.
Hier sollte in a schon zehn Ergebnisse zu den zehn Werten in X stehen. Ich vermute, dass die for-Schleife dazu gedacht war, zehnmal was mit den einzelnen Werten von X zu machen. Wenn ja, dann ist sie wahrscheinlich unnötig. Schwer zu sagen, weil der Rest nicht soviel Sinn macht.
Nein, in a ist das Ergebnis nur eine Zahl. Hier werden die Realisationen von X in die Funktion c_j eingesetzt und aufsummiert. Das Ergebnis wird dann durch die Anzahl von Realisationen geteilt. Also als Antwort erhalte ich hier eine Zahl (mein Code gibt auch die richtige Zahl aus)
Alarm! Hier wird X neu definiert und das ist bestimmt nicht gut. Bis hierhin war X eine Serie von zehn Zufallszahlen, jetzt wird X für den Rest der Funktion die Zahlen von eins bis zehn und wenn wir die Funktion verlassen ist X schon wieder die Serie mit Zufallszahlen. Wenn das so gewollt ist, halte ich das für einen irreführenden Programmierstil, wahrscheinlich ist es aber nicht so gemeint?
Ich glaube hier liegt mein Problem. Die verschiedenen s_c_j die nun für jedes j separat berechnet wurden sind nun sozusagen ein konstanter Faktor und in das phi_j setze ich nun ein variables x ein. Also das ist keine Zufallszahl mehr sondern soll einfach eine Variable sein damit ich davon einen Graphen zeichnen lassen kann.
Jedoch muss eigentlich erst die ganze Summe s_c_j*phi_j ausgeschrieben werden und dann kann man das für jedes einzelne x=seq(...) auswerten.
Also eine for-Schleife ist dazu da, einen Anweisungsblock mehrfach zu wiederholen. Eine Funktion endet aber beim ersten Aufruf eines return, sodass ein mehrfaches Ausführen von return von vorneherein unmöglich ist.
Haben Sie mit den zusätzlichen Informationen eine Ahnung wie ich meine Funktion plotten kann? Es ist nicht so leicht das Thema hier schriftlich zu erläutern...
Re: Fourierreihen in R
Hallo MathHam,
An der Stelle enthält a zehn Rechenergebnisse für die zehnmal ein Kosinus bestimmt und mit der Wurzel aus zwei multipliziert wurde. Ich wollte nur sicherstellen, dass Dir das bewusst ist. Mehr nicht.
Wir Du-zen uns im Forum. Ich bin der Bernhard. Wenn es geschafft ist, eine Funktion zu erstellen, dann ist das plotten mit R oft das geringste Problem. Was die Schwierigkeit des schriftlicihen Erläuterns angeht, so hast Du sicher Recht. Ist beim Antworten auch so. In einem schriftbasierten Internetforum führt da aber kein Weg dran vorbei.
LG,
Bernhard
Das ist sicher der geringste Kritikpunkt, den ich angebracht habe. Du kannst das so machen. Die Erfahrung zeigt aber, dass man später dann doch oft noch verschiedene X untersuchen möchte (beispielsweise um Bootstrapping zu betreiben) oder sich wundert, dass die Funktion heute nicht mehr funktioniert, obwohl sie doch gestern noch funktioniert hat, ohne dass man was an der Funktion geändert hat. Man sieht halt bei der Fehlersuche der Funktion nicht unbedingt an, dass Sie Daten mit einem bestimmten Namen in einer bestimmten Form braucht, die ihr nicht übergeben werden. Ist aber mehr eine Stilfrage, sicher kein Fehler.MathHam hat geschrieben: ↑Di Jan 25, 2022 10:36 amGehen wir es zeilenweise durch
s_c_j <- function(j){
Ich vermute, dass s_c_y eine Funktion von j und von X sein soll, da X ja in der Funktion verwendet wird. Daher würde ich hier allgemein s_c_j <- function(j, X) schreiben.
Ich dachte es wäre hier sinnvoll, nur das j in der Funktion anzugeben da sich das X dann sowieso anpasst, sobald ich den Vektor X ändere.
Betrachte folgende Vereinfachung des Codes soweit:Hier sollte in a schon zehn Ergebnisse zu den zehn Werten in X stehen. Ich vermute, dass die for-Schleife dazu gedacht war, zehnmal was mit den einzelnen Werten von X zu machen. Wenn ja, dann ist sie wahrscheinlich unnötig. Schwer zu sagen, weil der Rest nicht soviel Sinn macht.
Nein, in a ist das Ergebnis nur eine Zahl. Hier werden die Realisationen von X in die Funktion c_j eingesetzt und aufsummiert. Das Ergebnis wird dann durch die Anzahl von Realisationen geteilt. Also als Antwort erhalte ich hier eine Zahl (mein Code gibt auch die richtige Zahl aus)
Code: Alles auswählen
X <- rnorm(10)
j <- 1
a <- sqrt(2)*cos(j*pi*X)
print(a)
Ab hier kann ich Dir nicht mehr folgen. Bis hierhin wurden nicht mehrere s_c_j berechnet, sondern nur eine Funktion diesen Namens unvollständig definiert und phi_j kommt im ersten Screenshot noch gar nicht vor. Ist vielleicht auch nicht so wichtig, ob ich das verstehe. Wenn Du jetzt besser verstehst, wo Dein Problem liegt, ist das ja schon mal ein Schritt voran.Alarm! Hier wird X neu definiert und das ist bestimmt nicht gut. Bis hierhin war X eine Serie von zehn Zufallszahlen, jetzt wird X für den Rest der Funktion die Zahlen von eins bis zehn und wenn wir die Funktion verlassen ist X schon wieder die Serie mit Zufallszahlen. Wenn das so gewollt ist, halte ich das für einen irreführenden Programmierstil, wahrscheinlich ist es aber nicht so gemeint?
Ich glaube hier liegt mein Problem. Die verschiedenen s_c_j die nun für jedes j separat berechnet wurden sind nun sozusagen ein konstanter Faktor und in das phi_j [...9]
[/quote]Haben Sie mit den zusätzlichen Informationen eine Ahnung wie ich meine Funktion plotten kann? Es ist nicht so leicht das Thema hier schriftlich zu erläutern...
Wir Du-zen uns im Forum. Ich bin der Bernhard. Wenn es geschafft ist, eine Funktion zu erstellen, dann ist das plotten mit R oft das geringste Problem. Was die Schwierigkeit des schriftlicihen Erläuterns angeht, so hast Du sicher Recht. Ist beim Antworten auch so. In einem schriftbasierten Internetforum führt da aber kein Weg dran vorbei.
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Fourierreihen in R
Hallo Bernhard,
ich habe versucht ein Beispiel zu generieren:
#Beispiel
X<-rnorm(10)
s_c_1<-sqrt(2)*cos(1*pi*X) #alle 10 Realisierungen von s_c_1
s_c_1done<-(sum(s_c_1)/10) #fertiger Wert für s_c_1
s_c_2<-sqrt(2)*cos(2*pi*X) #alle 10 Realisierungen von s_c_2
s_c_2done<-(sum(s_c_2)/10) #fertiger Wert für s_c_2
s_c_3<-sqrt(2)*cos(3*pi*X) #alle 10 Realisierungen von s_c_2
s_c_3done<-(sum(s_c_3)/10) #fertiger Wert für s_c_2
#phi_j<-sqrt(2)*cos(j*pi*x) mit x = x-Achse (keine Zufallsvariable!)
phi_1<-sqrt(2)*cos(1*pi*x)
phi_2<-sqrt(2)*cos(2*pi*x)
phi_3<-sqrt(2)*cos(3*pi*x)
#Funktion mit 3 Termen wäre:
s_c_1done*phi_1+s_c_2done*phi_2+s_c_3done+phi_3
Also meine s_c_jdone sind dann jeweils Konstante werte die mit den Zufallsvariablen erstellt wurden. Diese werden mit den einzelnen phi_j multipliziert und dann zusammen addiert. Ich bräuchte einen Code der mir ermöglicht diese Summe zu plotten und zwar für eine beliebig große Anzahl von Termen.
Also falls ich nicht nur 3 habe sondern beispielsweise 100000 kann ich das ja nicht mehr abtippen.
Konnte ich damit meine Frage besser erläutern?
Grüße
Andi
ich habe versucht ein Beispiel zu generieren:
#Beispiel
X<-rnorm(10)
s_c_1<-sqrt(2)*cos(1*pi*X) #alle 10 Realisierungen von s_c_1
s_c_1done<-(sum(s_c_1)/10) #fertiger Wert für s_c_1
s_c_2<-sqrt(2)*cos(2*pi*X) #alle 10 Realisierungen von s_c_2
s_c_2done<-(sum(s_c_2)/10) #fertiger Wert für s_c_2
s_c_3<-sqrt(2)*cos(3*pi*X) #alle 10 Realisierungen von s_c_2
s_c_3done<-(sum(s_c_3)/10) #fertiger Wert für s_c_2
#phi_j<-sqrt(2)*cos(j*pi*x) mit x = x-Achse (keine Zufallsvariable!)
phi_1<-sqrt(2)*cos(1*pi*x)
phi_2<-sqrt(2)*cos(2*pi*x)
phi_3<-sqrt(2)*cos(3*pi*x)
#Funktion mit 3 Termen wäre:
s_c_1done*phi_1+s_c_2done*phi_2+s_c_3done+phi_3
Also meine s_c_jdone sind dann jeweils Konstante werte die mit den Zufallsvariablen erstellt wurden. Diese werden mit den einzelnen phi_j multipliziert und dann zusammen addiert. Ich bräuchte einen Code der mir ermöglicht diese Summe zu plotten und zwar für eine beliebig große Anzahl von Termen.
Also falls ich nicht nur 3 habe sondern beispielsweise 100000 kann ich das ja nicht mehr abtippen.
Konnte ich damit meine Frage besser erläutern?
Grüße
Andi
Re: Fourierreihen in R
Hallo MathHam,
So, ich muss jetzt erstmal ein wenig für meine Firma arbeiten, ein Anfang scheint damit ja gemacht zu sein.
LG,
Bernhard
Das ließe sich m. E. in einem Einzeiler wie folgt zusammenfassen:MathHam hat geschrieben: ↑Di Jan 25, 2022 11:57 amCode: Alles auswählen
#Beispiel X<-rnorm(10) s_c_1<-sqrt(2)*cos(1*pi*X) #alle 10 Realisierungen von s_c_1 s_c_1done<-(sum(s_c_1)/10) #fertiger Wert für s_c_1 s_c_2<-sqrt(2)*cos(2*pi*X) #alle 10 Realisierungen von s_c_2 s_c_2done<-(sum(s_c_2)/10) #fertiger Wert für s_c_2 s_c_3<-sqrt(2)*cos(3*pi*X) #alle 10 Realisierungen von s_c_2 s_c_3done<-(sum(s_c_3)/10) #fertiger Wert für s_c_2
Code: Alles auswählen
X <- rnorm(10)
s_c <- function(j, v = X) mean(sqrt(2)*cos(j*pi*v))
print(s_c(1))
print(s_c(2))
print(s_c(3))
Ich sehe da gerade den Unterschied nicht zwischen s_c_j und phi_j. Sieht für mich beides gleich aus, außer dass jetzt ein kleines x Werte auf der x-Achse darstellt. Da ich die s_c Funktion flexibel genug geschrieben habe, dass sie mit Vektoren von mehreren Zufallswerte und gegebenen Einzelwerten gleich gut umgehen kann, können wir die hier einfach nutzen, um einen Graphen zu zeichnen. In einem ersten Schritt:Code: Alles auswählen
#phi_j<-sqrt(2)*cos(j*pi*x) mit x = x-Achse (keine Zufallsvariable!)
Code: Alles auswählen
xs <- seq(0,10,.01)
ys <- sapply(xs, \(x) s_c(1, x))
plot(xs, ys, type = "l", main = "j = 1")
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Fourierreihen in R
Lieber Bernhard,
ich verstehe die Verwirrung: die s_c_j und die phi_j hängen eng zusammen. Unterschiede sind wie du bereits genannt hast, dass man die s_c_j mit den Realisierungen einer ZV befüllt und den Mittelwert aller Berechnungen bildet und die phi_j werden mit einer Variable x befüllt.
Der Plot der aus deinem Code hervorgeht ist das phi_j wenn man für j den gewünschten Wert einsetzt.
Jedoch ist mein Ziel eine Summe mit vielen Termen, also nicht einen Plot für jedes einzelne phi_j, sondern einen Plot für:
s_c_1*phi_1(x)+s_c_2*phi_2(x)+s_c_3+phi_3(x)+...+s_c_J*phi_J(x) mit J = irgendeine beliebige natürliche Zahl
Deine bisherigen Ansätze bringen mich schon deutlich weiter, alleine weil ich meinen Code eleganter formulieren kann, jedoch habe ich den Code für die engültige Summe noch immer nicht generieren können.
Grüße
Andi
ich verstehe die Verwirrung: die s_c_j und die phi_j hängen eng zusammen. Unterschiede sind wie du bereits genannt hast, dass man die s_c_j mit den Realisierungen einer ZV befüllt und den Mittelwert aller Berechnungen bildet und die phi_j werden mit einer Variable x befüllt.
Der Plot der aus deinem Code hervorgeht ist das phi_j wenn man für j den gewünschten Wert einsetzt.
Jedoch ist mein Ziel eine Summe mit vielen Termen, also nicht einen Plot für jedes einzelne phi_j, sondern einen Plot für:
s_c_1*phi_1(x)+s_c_2*phi_2(x)+s_c_3+phi_3(x)+...+s_c_J*phi_J(x) mit J = irgendeine beliebige natürliche Zahl
Deine bisherigen Ansätze bringen mich schon deutlich weiter, alleine weil ich meinen Code eleganter formulieren kann, jedoch habe ich den Code für die engültige Summe noch immer nicht generieren können.
Grüße
Andi
Re: Fourierreihen in R
Hallo Andi,
ich melde mich gerne nochmal zu Deinem Problem, wenn es kein anderer tut. Bin aber zur Zeit ein wenig unter Druck, morgen wird es wohl nicht klappen.
LG,
Bernhard
ich melde mich gerne nochmal zu Deinem Problem, wenn es kein anderer tut. Bin aber zur Zeit ein wenig unter Druck, morgen wird es wohl nicht klappen.
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte