Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1520to1524
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Makro zur Fourier-Reihenentwickung

Makro zur Fourier-Reihenentwickung
19.10.2016 16:08:26
Klaus
Liebe Gemeinde,
ich schreibe seit Tagen erfolglos an einem Makro, einer xla oder etwas ähnlichem, um mit Excel 2007 eine Fourier-Reihe auszuwerten. Excel möge sich alle Konstanten T0, TS, K, ... t, bis r aus vordefinierten Zellen abholen. n "wandert" von 1 bis 100, oder weniger ( z.B. 10 = aus einer weitere Zelle).
Der erste Term "(-1) hoch ( ... )" nach dem Summenzeichen tickert 1, (-1), 1, (-1), ....
Tricky wird's ab e^ ... Zur notwendigen Summenbildung brauche ich also Summe aller 2 mal (T0-TS) mal e^ ... + TS. All das möglichst elegant und variabel. Heißt : ich möchte mit allen Variablen/Konstanten "spielen" können und im folgenden zweiten Schritt dann aus allen Tc als Funktion von t eine Tabelle und eine Grafik erstellen können.
Eine halbwegs "intelligente" (Punkt?)-Grafik, die nur die wirklich vorhandenen Werte der x-Achse proportional anzeigt, wäre genial.
Ich hoffe, die jpgs aus dem Anhang erklären, was ich meine. Ich lese zudem, daß Excel allenfalls bis 10^+/-15 genau rechnet. Richtig ?
Ihr schaut bitte Userbild
und Userbild
Danke vorab Klaus Reich

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro zur Fourier-Reihenentwickung
20.10.2016 13:33:40
Klaus
Guten Mittag Fennek,
toll, aber sicher nicht kostenlos ...
Gruß Klaus
AW: Makro zur Fourier-Reihenentwickung
19.10.2016 20:58:02
Michael
Hi Klaus,
nette Sache...
Allerdings würde es mich interessieren, wo Du die Formel herhast: in Wiki habe ich sie so nicht gefunden (Fourier-Reihe, -Analyse). Wo steht das Ding?
Wenn Du uns jetzt noch Deine Tabelle mit Beispielwerten hochlädst, steht einer Bearbeitung nichts mehr im Wege.
Mir ist nämlich unklar, ob Du mit n die Iterationen der "Summe" meinst oder was anderes.
Naja, ich habe mal was gebastelt. Fast hätte ich das "-" bei dem e hoch (Term) übersehen; das Vorhandensein sorgt aber immerhin dafür, daß das Ding konvergiert (alles außer n hoch 2 ist konstant, und das überwiegt "irgendwann").
Das mit der Rechengenauigkeit ist so: Excel rechnet mit 15 oder 16 signifikanten Stellen, allerdings im Bereich von rund +/- 10 hoch 300nochwas.
Bei der Berechnung in der Beispieldatei sieht es aber mit meinen "nächstbesten" Beispielwerten so aus, daß 12 Werte addiert werden (sollen), die so wild auf "Nachkommastellenbereiche" verteilt sind, daß alles ab n=4 gelöscht werden kann (goldener Bereich), ohne daß sich das Ergebnis ändert.
Allerdings: K=1 ist offensichtlich viel zu groß: bei K=1/100000 konvergiert sooo schnell nix.
Naja, vielleicht mal als Ansatz... https://www.herber.de/bbs/user/108899.xlsx
Schöne Grüße,
Michael
Anzeige
AW: Makro zur Fourier-Reihenentwickung
20.10.2016 13:30:59
Klaus
Hi Michael,
anbei die Herkunft der Formel ( https://www.researchgate.net/publication/243489314_Heat_diffusion_in_a_solid_sphere_and_Fourier_theory_An_elementary_practical_example ) und meine bisherigen Versuche in Excel : die Zeit in min. gibs't Du bitte in I23 ein. In O40 erhälst Du dann die Kern-Temperatur, die ich händisch - eine nach der anderen - nach T4 bis T21 geschoben habe. Analog für den Fall : Kugel kalt, Wasser heiß in H52.
Deine Riesentabelle schau ich mir ein Mal genauer an ! Mein Ziel war aber, genau das, bzw. das Verschieben einer einzelnen Temp. in eine weitere Tabelle ( T4 - T21 ) zu vermeiden. So war die Idee entstanden, eine Art Makro zu entwickeln, das alles ab sigma aufsummiert, mit 2 x ( ... ) multipliziert und dann TS addiert und alle Ergebnisse in T4 bis Tx kopiert.
Noch ungeklärt ist, warum selbst mit mehreren hundert Iterationen alle Werte bis etwa 12,5 min einfach Schrott sind.
https://www.herber.de/bbs/user/108911.xlsx
Danke soweit, Klaus
Anzeige
AW: Makro zur Fourier-Reihenentwickung
20.10.2016 18:02:07
Fennek
Hallo,
Excel hat als mitgeliefertes Tool (das aber von Hand aktiviert werden muss) "Analytic Tools", die auch die Fourier-Methode anbieten.
mfg
AW: Makro zur Fourier-Reihenentwickung
21.10.2016 14:19:09
Klaus
Ihr Lieben,
ich habe nun eine primitiv-Lösung mit einem Makro gefunden, komme jedoch noch ein Mal längsseits : das Thema ist mögl.weise ein anderes. Der Admin möge es dann verschieben.
Frage : die aktuelle x-Achse ( hier : 0 bis 10 min. in zweier-Schritten, danach in 10-ner-Schritten bis 60 min ) steht in Q4 bis Q...( schaut Euch bitte die jpg an ), kann aber auch bis x = 500, äußerst flexibel bis zur Zelle Qxxx laufen. Danach könnten zudem in der Spalte Q oberhalb der Zeile 4 oder unterhalb der Zeile xxx auch noch diverse Kommentare oder Daten/Konstanten folgen.
Wie kann ich so die Anzahl aller Zeilen der Spalte Q mit numerischem Inhalt, also den ( numerischen Werten ) der x-Achse Inhalt via VBA ermitteln ? Q4 und Qxxx sollten nicht konstant sein : ober- und unterhalb vom letzter Eintrag der x-Achse könnten weitere x-Daten stehen. VBA sollte "wissen", wo die benötigten x-Werte beginnen und enden. Geht da was mit Typ, Hintergrundfarbe, Schriftart ?
Danke und schönes Wochenende, Klaus
Anzeige
AW: Makro zur Fourier-Reihenentwickung
21.10.2016 15:46:04
Michael
Hi Klaus,
das kannst Du z.B. so ermitteln:
Option Explicit
Sub bereichAufrufen()
Dim ergebnis
ergebnis = bereich("Q")  ' oben und unten Text, dazwischen Zahlen
MsgBox ergebnis(1) & " : " & ergebnis(2)
ergebnis = bereich("T")  ' nur Text
MsgBox ergebnis(1) & " : " & ergebnis(2)
ergebnis = bereich("U")  ' alles Text, nur eine Zahl
MsgBox ergebnis(1) & " : " & ergebnis(2)
End Sub
Function bereich(spalte$)
Dim r As Range
Dim i&, uFix&, oFix& ' & = as long
Dim vonbis&(1 To 2)
Set r = Intersect(UsedRange, Columns(spalte))
bereich = vonbis
If Not r Is Nothing Then
oFix = r(1).Row
uFix = r(r.Count).Row
i = oFix
While i = oFix And (Not IsNumeric(r(i).Value) Or r(i).Value = ""): i = i - 1: Wend
If i = oFix - 1 Then Exit Function
vonbis(2) = oFix + i - 1
bereich = vonbis
End If
End Function
Ansonsten kann ich Berechnungen in Deiner Beispieldatei nicht recht nachvollziehen: in L37 ziehst Du 30 von 150 ab, in L53 umgekehrt.
Da die "Stellen" mitunter recht flott davongaloppieren und oft ab einem gewissen n Excels Wertebereich für double überschreiten, könntest Du in Deinem Makro den 10er-Exponenten ermitteln (als Formel: =log10(100) ergibt z.B. 2) und vergleichen, und wenn die Differenz mehr als 15 beträgt (die verfügbaren, signifikanten Stellen) kannst Du die Iteration abbrechen.
Übrigens habe ich mal Deine Werte in "meine" Formeln eingesetzt und mich gewundert, daß bei Dir in O62 eine 0 steht und bei mir #ZAHL; das liegt daran, daß ich mit dem Ergebnis "weiterrechne". Abstrakt ausgedrückt, ergibt =EXP(-große Zahl) =0, aber =1/Exp(große Zahl) einen Fehler.
Daß Deine Ergebnisse (zumindest die in der Datei) nicht passen, ist nicht verwunderlich: Du stellst das +/- zwar z.B. in N53:N62 dar, berechnest aber in O63 einfach die Summe, ohne das Vorzeichen zu beachten (also nur +).
Schöne Grüße,
Michael
Anzeige
AW: Makro zur Fourier-Reihenentwickung
21.10.2016 17:56:14
Klaus
Oha Michael, 'ne halbe Doktor-Arbeit von Dir !
ich hatte gemeint, für die Zeitachse in Spalte Q : erstezeile = 4 ( willkürlich festgelegt ) und letztezeile = ActiveSheet.Cells(1048576, 17).End(xlUp).Row wäre es. Meine Beispieldatei ist einfach erklärt : ich habe eigentlich die Arbeit von Unsworth ( Kugel 150 Grad kühlt in 30-grädigem Wasser ab ) auf den Fall "Kugel = 30 Grad und wird in einer 150-Grad-Flüssigkeit erhitzt" projizieren wollen. Nach welcher Zeit setllt sich welche Kerntemperatur Tc in der Mitte der Kugel ein ? Mit 10-ner-Potenzen geht's leider nicht : ich möchte sowohl 'mal eben eine Kurzbetrachtung ( wie sieht's denn bei 100 min. aus ?), sekundengenau einen Detailbereich von 600 bis 900 sek, aber auch ein mal einen langen Zeitraum 50 ... 500 min im 10-Minuten-Takt berechnen können.
Deinen Vorschlag, abzubrechen werde ich noch einbauen. Ein "Teilwert" ( signifikante Stellen ), der die Summe um weniger eine Sekunde ändert, wäre das Abbruchkriterium.
Danke für Deinen Hinweis "Daß Deine Ergebnisse ... " nicht passen - das werde ich sofort prüfen. Beginend mit n = 1 sollten für alle ungraden n +e^... und für alle graden n +e^... die Vorzeichen wechseln und mit richtigem Vorzeichen nur noch aufaddiert werden müssen.
Thanks, Klaus
Anzeige
AW: Makro zur Fourier-Reihenentwickung
21.10.2016 18:13:46
Michael
Hi Klaus,
naja, das intersect mit usedrange und Spaltenbuchstaben macht (fast) das Gleiche wie die Konstruktion mit dem xlup.
Schlimmstenfalls werden halt ein paar Einträge mehr durchgenudelt, weil der Startwert (4 wie Q4) nicht berücksichtigt wird.
Aber: mit dem log10 würde ich schon arbeiten: sagen wir, der erste Wert ist 1,02, der zweite 0,06, die nachfolgenden dann x0E-06, x1E-15 und x2E-30, dann brauchst Du den letzten gar nicht mehr addieren, weil er "rechts" neben/hinter den signifikanten Stellen des ersten Werts liegt - da macht Excel nix mehr.
Die nachfolgenden Werte MÜSSEN ja auch nochmal kleiner sein, sonst wäre das Ding nicht konvergent. Und wenn es nicht konvergent wäre, müßtest Du logischerweise bis n=∞ rechnen - das wird oft schwierig.
Schöne Grüße,
Michael
Anzeige
AW: Makro zur Fourier-Reihenentwickung
21.10.2016 20:24:15
Klaus
Guten Abend Michael,
Thanks für Deinen Hinweis ! Wat bin ich blöd ! Ich hatte den Algorithmus nur aufaddiert, das wechselnde Vorzeichen jedoch nicht berücksichtigt.
Den Vorteil, Dein vorgeschlagenes Abbruchkriterium vom log abhängig zu machen, habe ich nicht wirlich verstanden. Meine Denke : wenn überhaupt ein Abbruch bei delta_t = e^ ... kleiner 1 sek in Frage käme, bringt mir das maybe 1/100, gar 1/1000 Sekunde Rechenzeit. Bis dahin suche ich noch nach einer Lösung Excel zu erklären : die Zeit laufe nur alle numerischen Werte z.B. R4 bis Rxxx oder einer beliebigen anderen Spalte, die ich - wie auch immer - zur Datentabelle erkläre.
best regards, Klaus
Anzeige
AW: Makro zur Fourier-Reihenentwickung
22.10.2016 16:25:45
Michael
Hallo Klaus,
der Knackpunkt ist, daß Excel eben besagte 15-16 signifikante Stellen hat.
Wenn Du Werte hast, die sehr weit auseinanderliegen (unten in der Grafik sind das die aus Deiner Tabelle von O53:O57 für n=1..5), und diese addieren (oder subtrahieren, das spielt in dem Zusammenhang keine Rolle) willst:
Userbild
liegen die Werte ab n=3 bereits völlig außerhalb dessen, was Excel noch verarbeitet, weil die signifikanten Stellen bereits durch den größten Wert bei n=1 festgelegt worden sind.
Verstehst?
Übrigens schließt eine Abbruchbedingung ja die andere nicht aus: if Delta_t kleiner Or log10-erstes_log10 größer 16 (größer? hier mit Vorzeichen aufpassen).
Ansonsten kannst Du ja nochmal ne Datei mit Makro hochladen, vielleicht läßt sich da was optimieren.
Schöne Grüße,
Michael
Anzeige
AW: Makro zur Fourier-Reihenentwickung
23.10.2016 11:45:02
Klaus
Guten Morgen Michael,
meine Sorge um Excel's signif. Stellen war unnötig. Es braucht kein Abbruchkriterium : die Ergebnisse sind ausreichend genau. Unbefriedgend ist nur mein Tabellenblatt. Einfach "quick and dirty", ohne jedwede "Eleganz", vollkommen starr und unflexibel ( wie halt meine VBA-Kenntnisse ). Füge ich z.B. eine zus. Zeile oder Spalte ein, findet das Makro die Eingangswerte nicht mehr. Maybe hast Du eine Idee, das ein wenig "geschmeidiger" zu machen ? Schön wäre, nicht mit fest zementierten Zeiten ( T33 bis T42 und T50 bis T59 ) arbeiten zu müssen, sondern auch mal eben einen Zwischenwert ( z.B. "25 min." ) einzuschieben. Die lezten Einträge wären dann T43/T60. Geht da was mit xla ?
https://www.herber.de/bbs/user/108975.xlsm
Schönes Rest-WE, Klaus
Anzeige
AW: Makro zur Fourier-Reihenentwickung
23.10.2016 17:09:28
Michael
Hi Klaus,
ich habe die Geschichte mal etwas aufgepäppelt:
a) Einsatz meiner Function Bereich
b) Du hast ja unterschiedliche Startwerte in den Zeilen 25 und 26; deshalb habe ich die Nummern dieser Zeilen in die gelbe Spalte gesteckt, so daß immer die komplette Spalte Q durchgeackert wird, und zwar mit den jeweils passenden Startwerten.
c) der Algorithmus ist optimiert (überflüssige Berechnungen aus dem Exp() rausgenommen: war übrigens bereits in meiner ersten Datei schon so als reine Formel optimiert.
d) zwei Varianten: n=1..10 und insbesondere mit variablem n: letzterer rechnet bis max. n=1000 (eigentlich 999, weil "kleiner") - mit dem Wert kannst Du mal spielen - und es wird log10 ausgewertet als Abbruchbedingung.
Du schreibst ja schon so schön: Für kleine Zeiten sind deutlich mehr als 10 Iterationen erforderlich! Stimmt genau: Du wirst sehen...
Das Skript habe ich einigermaßen dokumentiert; was für Dich neu sein dürfte, ist der Einsatz von Arrays, da kannst Du Dich mal einlesen: http://www.online-excel.de/excel/singsel_vba.php?f=152
Die Schleife bricht ab, sobald die Differenz von log10(1. Wert) und log10(akt. Wert) größer als 15 ist: in dem Fall "rutscht" der aktuelle Wert aus den signifikanten Stellen des 1. (und größten) Werts "heraus"; bei sehr "galoppierenden" Stellenverschiebungen ist das schon bei n=4 so.
Die Datei: https://www.herber.de/bbs/user/108979.xlsm
Damit man unsere Werte vergleichen kann, erfolgt meine Ausgabe erst Mal in Spalte U (Const SpE = "U"), das kannst Du ja dann ändern.
Ich habe einige Testwerte geändert (wegen der "sehr kleinen Zeiten"); die sind grün markiert. Deine Originalwerte habe ich nach rechts kopiert (ab Spalte ").
Schöne Grüße,
Michael

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige