Fourierreihen in R

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
MathHam
Beiträge: 5
Registriert: Sa Jan 22, 2022 3:31 pm

Fourierreihen in R

Beitrag von MathHam »

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?
Benutzeravatar
student
Beiträge: 675
Registriert: Fr Okt 07, 2016 9:52 am

Re: Fourierreihen in R

Beitrag von student »

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)
MathHam
Beiträge: 5
Registriert: Sa Jan 22, 2022 3:31 pm

Re: Fourierreihen in R

Beitrag von MathHam »

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:
IMG_1258.jpg
IMG_1259.jpg
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Fourierreihen in R

Beitrag von bigben »

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

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(...)
Gehen wir es zeilenweise durch

Code: Alles auswählen

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.

Code: Alles auswählen

a <- sqrt(2)*cos(j*pi*X)
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.

Code: Alles auswählen

 for(X in (1:n)){
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?

Code: Alles auswählen

    for(X in (1:n)){
        return(...)
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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
MathHam
Beiträge: 5
Registriert: Sa Jan 22, 2022 3:31 pm

Re: Fourierreihen in R

Beitrag von MathHam »

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 :D !


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.
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.


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...
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Fourierreihen in R

Beitrag von bigben »

Hallo MathHam,
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.
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.

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)
Betrachte folgende Vereinfachung des Codes soweit:

Code: Alles auswählen

X <- rnorm(10)
j <- 1
       
a <- sqrt(2)*cos(j*pi*X)
print(a)
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.

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]
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.

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...
[/quote]

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
MathHam
Beiträge: 5
Registriert: Sa Jan 22, 2022 3:31 pm

Re: Fourierreihen in R

Beitrag von MathHam »

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
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Fourierreihen in R

Beitrag von bigben »

Hallo MathHam,
MathHam hat geschrieben: Di Jan 25, 2022 11:57 am

Code: 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
Das ließe sich m. E. in einem Einzeiler wie folgt zusammenfassen:

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

Code: Alles auswählen

#phi_j<-sqrt(2)*cos(j*pi*x) mit x = x-Achse (keine Zufallsvariable!)
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

xs <- seq(0,10,.01)
ys <- sapply(xs, \(x) s_c(1, x))
plot(xs, ys, type = "l", main = "j = 1")
So, ich muss jetzt erstmal ein wenig für meine Firma arbeiten, ein Anfang scheint damit ja gemacht zu sein.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
MathHam
Beiträge: 5
Registriert: Sa Jan 22, 2022 3:31 pm

Re: Fourierreihen in R

Beitrag von MathHam »

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
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Fourierreihen in R

Beitrag von bigben »

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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten