HTML5 Icon 10 Jahre Thailand 

Projekt kalkulierter thailändischer Kalender Tag (11-12)

by Nudels


Posted on Mittwoch Mai 13, 2020 at 10:18PM in Technik - Programmierung


Die Chronologie systematischer Software-Entwicklung


Ein Projektüberblick – Datenmodel & Algorithmen (Tag 11- 12)


Der Zeitplan hierzu ist knapp, aber er sollte ausreichen. Ich werde hier nur kurz, aber dafür klar verständlich skizzieren was in den beiden Tagen passiert. Die ausführliche Dokumentation gibt es dann später in gedruckter Form.


Die Objekte


Wir halten ein Teil der Daten in einer Datenbank vor. Dieses ermöglicht uns später flexibel zu sein. Die Datenmodellierung wird nach den Regeln der Normalisierung durchgeführt. Die Entitäten sollten nach Möglichkeit eineindeutig sein. Das war jetzt kein Tippfehler, sondern ein mathematischer Begriff.  Ziel ist es, aus der Struktur eine isomorphe Menge zu erzeugen. Eine Erklärung als Beispiel:



Das Jahr und der Feiertag sind autarke Objekte, weil aus dem  Jahre alleine, kein inverser Feiertag erzeugt werden kann. Es fehlen die Bedingungen einer bijektiven Abbildung. Im Klartext:
Wenn das Objekt Feiertag eine Property Jahr hätte, hätte eine Liste von n Feiertagen auch n-mal die gleichen Properties des Jahres und das ist der springende Punkt: Aus dem Jahr lässt sich kein eindeutiger Rückschluss auf einen Feiertag abbilden. Das schließt dann auch eindeutige Mengenoperationen auf das Objekt aus.
Wie sieht es denn mit den anderen Eigenschaften aus, z.B. mit dem Datum?  Wie oft kommt es in einer Liste von n Feiertagen vor? Im Intervall eines Jahres, in der Regel nur ein mal. Es gibt seltene Ausnahmen, die wir jetzt nicht berücksichtigen. Was ist mit den Vorlauf- und Nachlauftagen? Die können doch im Jahresintervall häufiger vorkommen. Das ist richtig, und somit gehören sie eigentlich nicht zu einem Feiertag. Sie sind ein Kompromiss um Rechenzeit zu sparen, und zwar für Feiertage der Form: Das Robenfest ist 1 Tag nach Oog Phansa.  Es ist somit einfacher auf den Feiertag Oog Phansa einen Tag aufzuaddieren, als den Feiertag vollständig zu berechnen. Solche Hinweise gehören natürlich in das Dokumentensystem. Ich denke damit ist die Motivation der Datenmodellierung hinreichend erklärt. In der nächsten Abbildung sehen wir das kleine Datenbankmodell, das so 1 zu 1 auf die Objekte der Anwendung abgebildet wird. Es kommen weitere Objekte dazu.







Datenmodell

Das Datenmodell beschreibt die Beziehung der Objekte untereinander. Spring gibt uns hier eine kompromisslose Vorlage und das ist gut so, denn es ist die Vorlage der MVC-Architektur. Unsere Datenobjekte sind reine Plain-Old-Java-Objects. Sie verfügen nur über ihre Eigenschaften und als einzige Methoden die Zugriffsoperaturen Get und Set. Die Methoden der Datenmanipulation befinden sich in den dazugehörigen Managern. Zwischen den Benutzer–Interface und  den Managern stehen die Controller, die über handler das IO-Management übernehmen. Die Pfeile in der nächsten Abbildung beschreiben die Datenflussrichtung. Wir erkennen auf einen Blick, die fehlende Bijektivität zwischen Feiertag und Jahr. Das Objekt Zeitrechnung ist eine lib, die alle Methoden der Kalendersynchronisation und der Zeitrechnung enthält. Sie ist aus technischen Gründen ausgelagert.








Aus dem Modell ergibt sich dann die Aufteilung nach MVC – Präsentation – Berechnung – Daten. In der folgenden Aufschlüsselung findest Du mehr Objekte als in der Abbildung. Die fehlenden stecken in der Zeitberechnungs-lib und sind nach dem gleichen Muster entwickelt, wie oben beschrieben ist.


Präsentation (View)


Feiertagliste, Jahr


Datenflusssteuerung (Controller)


Feiertagscontroller, Jahrcontroller


Berechnung (Businesslogic)


Feiertagmanager, Jahrmanager, Tiermanager, Astrowertmanager, Monatmanager, Wochentagmanager, Mondmanager, Sonnemanager, Zeitmanager


Daten (Model)


Feiertag, Jahr, Tier, Astrowerte, Monat, Wochentag, Mond, Sonne, Zeit



Algorithmen


Wir kommen jetzt zu den Algorithmen. Die Aufgabe ist es aus den Anforderungen den Lösungsweg klar zu definieren. Am besten eignet sich hierzu ein Top-Down-Modell von der Zieldefinition bis runter auf eine allgemeine algebraische Ausdrucksform. Die Bedingungen und Beziehungen müssen ebenfalls klar definiert werden. Dieses Projekt ist winzig und es sollte uns nicht schwer fallen dieses im Zeitplan zu erledigen.


Die Zieldefinition ist:


Abbildung des Thailändischen Kalenders auf den gregorianischen Kalender mit Wochentag, Tag, Monat und Jahr für das Feiertagsdatum. Als Eingaben werden fixe Datum, Datum der Form: letzes Wochenende im Monat und Zeitangaben der Form: Vollmond im 8. Mond verwendet.


Die Bedingungen sind:


Der gregorianische Kalender beschreibt den Zeitraum eines Sonnenjahres aufgeteilt in 4 Jahreszeiten mit jeweils 3 Monaten. Der Jahreszeitenwechsel wird durch ein eindeutiges Regelwerk für Schaltteile konstant gehalten. Die Länge eines Jahres hat dadurch 365 oder 366 Tage.


Der Lunissolarkalender wird aus den periodischen Durchläufen von Mond und Sonne berechnet. Ein Mondjahr hat 12 Monde und beginnt bei Neumond zwischen November und Dezember. Ein Sonnenjahr hat ebenfalls eine Duzend-Teilung. Ein Teil beschreibt den vollständigen Durchlauf durch einen Tierkreiszeichen. Mondkalender und Sonnenkalender werden synchronisiert um die Tag- und Nachtgleiche einigermaßen konstant zu halten. Das Regelwerk ist der Metonzyklus. Die Anwendung des Metonzyklus auf den thailändischen Kalender ist allerdings eine grobe Orientierung. Die Länge eines Jahres hat 354, 355 oder 384 Tage.


Die Beziehungen sind:


Auch wenn die Jahre unterschiedliche Längen in Tagen haben, ist dieses für uns die verlässliche Größe: Der Tag ist in beiden Systemen gleich lang. Da die größte Dynamik im thailändischen Kalender liegt, müssen wir dieses System als folgend festlegen und der gregorianische Kalender führt.


Zielvorhaben:


Die Monphasen nach Mondzahlen werden auf den gregorianischen abgebildet. Die Monphasenvorgabe (Bezugspunkt) kommt aus dem gregorianischen Kalender. Die Rechengrundlage ist der Abstand in Tagen von einem Bezugspunkt. Der Bezugspunkt ist in der Regel hypothetisch gefolgt von einer Korrektur (siehe Metonzyklus). Dieses Ergebnis wird dann in den gregorianischen Kalender zurück transformiert.


Das Verfahren:


Die astronomische Berechnung der Sonnenstände scheint im Vergleich zum Mond relativ einfach. Die sekundengenauen Ergebnisse sind eher für die Navigation geeignet. Für unsere Anwendung reicht ein tagesgenaues Ergebnis. Die Grundlage hierzu bieten die beiden mittleren Perioden, die verhältnismäßig konstant sind. Hieraus bilden wir Ordnungsrelationen, die wir auf das gregorianische Model abbilden. Das gregorianische Kalendermodell ist leider, bedingt durch die unregelmäßigen Monatslängen, ungeeignet für eine Ordnungsrelation. Hier müssen wir ein Korrekturverfahren entwickeln. Schematisch dargestellt ist das Verfahren in der nächsten Abbildung.








Die farbigen Quader stellen die Monate dar. Der Solarkalendar ist perfekt als Ordnungsrelation geeignet. Alle Quader haben eine eindeutige Vorgänger und Nachfolger Abbildung. Für den Mondkalender kann man das auch eingeschränkt sagen. Wir brauchen nur eine Korrektur in gleicher Größe. Da wir den thailändischen Kalender nicht abbilden, sondern mit den annähernd konstanten Monden rechnen, brauchen wir keine hohlen und vollen Monate und machen die Korrekturen nur nach dem Meton-Modell zwischen Mond und Sonne durch die Verdoppelung des 8. Mondes .Etwas aufwendiger ist der gregorianische Kalender.


Berechnung der Zeiten für den gregorianischen Kalender


Berechnungen für die Schaltjahre


Unser Schalt-Regelwerk ist eindeutig. Es gibt eigentlich alle 4 Jahre eine Korrektur im Februar. Er erhält den 29. Monatstag. Da dieses in Summe zu viel ist, wird mit der 2. Bedingung nach gebessert. Die Vielfachen von 100, die ja auch Vielfache von 4 sind, werden ausgenommen und sind nur gültig, wenn es auch Vielfache von 400 sind. Das passt dann sehr präzise. Ein Lob auf die Mathematiker des Mittelalters. Algebraisch drückt sich die Bedingung dann so aus:


Für A = 4-stellige Jahreszahl (yyyy) gilt:
(A Mod 4 =0 & A mod 100 > 0) | (A mod 100 = 0 & A mod 400 = 0 ) = true
Für M (Monat) und T (Tag) = natürliche Zahl


Datum vor Schalttag


Für die Arbeit mit Ordnungsrelationen brauchen wir noch eine Regel, die uns informiert, ob Start- und Ziel-Zeitpunkt im Falle eines Schaltjahres vor, oder hinter dem 29. Februar liegen. Die Regel ist einfach und sie lautet:



Für A= M<3 ; B=T<29;
A |!A & B = true


Anzahl Schalttage zwischen zwei Datum



Auf einem Zeitstrahl, in einem beliebigem Intervall, können wir zunächst nur annehmen, wie groß die Distanz ist. Wir arbeiten mit einem fixen Zeitpunkt und einem hypothetischen Ziel. Um das Ziel zu korrigieren muss die Anzahl der Schalttage zwischen diesen Punkten ermittelt werden. Hierzu ist mir erstmal nur ein Iterationsverfahren über die Zeitpunkte eingefallen:


Für Datum tt.mm.yyyy D1, D2 gilt:
!(D1yyyy=D2yyyy) & (D1 vor Schalttag || D2 vor Schalttag)


Berechnungen für den Wochentag


Die Hauptarbeit der Wochentagermittlung hat uns der geniale Mathematiker Carl Friedrich Gauß schon abgenommen. Der Erzählung nach soll dieses in Form einer Randnotiz geschehen sein. Bei genauer Betrachtung erkennt man die Schalttages-Regeln.


Gaußwert:
Für A = 4-stellige Jahreszahl (yyyy) gilt:
gw = (1+5*((A-1) mod 4)+4*((A-1) mod 100)+6*((A-1)%400)) mod 7


| 0=So, .…, 6=Sa
gw = Wochentag für den 1.1.A


Für die Allgemeingültigkeit verwenden wir eine Korrektur über die Neujahrsdistanz. Zur Berechnung von Werten mit festen Ober- und Untergrenzen in gleichmäßigen und periodischen Intervallen eignet sich die Modulo-Funktion perfekt. Das ist das mod im algebraischen Part dieser Betrachtung. Mod liefert uns den ganzzahligen Rest einer Division.


Allgemein:
Für A = 4-stellige Jahreszahl (yyyy) und ND = Neujahrsdistanz(Tage) gilt:
gwX=(((ND)-1) mod 7)+gw
| gwX > 6  >> gwX=gwX-7



| 0=So, .…, 6=Sa


Neujahrsdistanz


Die Neujahrsdistanz ist zentrales Korrektur-Werkzeug für unsere hypothetischen Werte. Sie berücksichtigt die Schaltteile und verrät uns welches der kleinste Näherungspunkt in Tagen bei unseren angenommenen Zielzeitpunkt liegt.


Für M[1..12] = 0, 31,59,90,120,151,181,212,243.273.304,334 und t(Tag), m(Monat) = natürliche Zahlen > 0 gilt:


Schaltjahr & ! Datum vor Schalttag
ND=M[m] +t+1
Sonst
ND=M[m]+t


anders ausgedrückt ist die Neujahrsdistanz ND als  Nachfolgerabbildung  =


(m-1)*30+n +(n-1)*-1 für normale Jahre & m < 4


(m-1)*30+n -(n-1) für Schaltjahre & m <4


(m-1)*30+[n-3] für normale Jahre & m >=  4 & m < 8 & n = ungerade


(m-1)*30+[n-2] für Schaltahre & m >=  4 & m < 8 & n = ungerade


(m-1)*30+n-1 für normale Jahre und Schaltjahre & m >=  4 & m < 8 & n = gerade


(m-1)*30+2 für normale Jahre & m =8


(m-1)*30+3 für normale Jahre & m =8


(m-1)*30+[n-6] für normale Jahre & m > 8 & n = ungerade


(m-1)*30+[n-5] für Schaltahre & m > 8 & n = ungerade


(m-1)*30+n-1 für normale Jahre und Schaltjahre & m > 8 & n = gerade


Es gibt immer unentlich viele Möglichkeiten, Zahlenfolgen als Nachfolgeabbildung auszudrücken. Wer genau hinschaut, der findet bei den Zahlentupeln die ersten Glieder einner inverse Fibonacciabbildung. 0,1,1,2,3,5 .............aus: 1+1=2;2+1=3;3+2= ........................Der Zweck heiligt die Mittel und rechtfertigt alle Aufwende.



Berechnung eines Datums


Die Berechnung eines Datums aus einer Tagesdifferenz ermitteln wir ebenfalls mit Hilfe der Neujahrsdistanz:


Für M[1..12] = 0, 31,59,90,120,151,181,212,243.273.304,334 und T(Tage)= natürliche Zahlen > 0 gilt:


tage=T mod 365
( M[i]+Schalttage ) >= M[i+1] >> i=i+1
M=M[i]; t = tage – (M[i] +Schalttage)


Berechnung der Zeiten für den thailändischen Kalender


Die Vorgänger- und Nachfolgerabbildungen für Mond und Sonne sind sehr einfach, da die synodischen Perioden des Erdtrabanten und des Zentralgestirns annähernd konstant sind. Wir können also mit dem klassischen mathematischen Regelwerk arbeiten.
Die Korrektur des Meton-Schaltteils findet immer dann statt, wenn der angenommene Zeitpunkt des 1. Mondes aus dem November raus wandert. Durch die Verdoppelung des 8. Mondes, wird er dann um eine synodische Periode zurück in den November geschoben. Das ist bisher keine optimale Lösung. Ich arbeite dran und werde nachliefern.


Damit schließt dieses Kapitel termingerecht nach 2 Tagen. Es bleibt zu sagen: Es gibt keine Gewährleistung auf die vollständige Richtigkeit aller Aussagen. Fehler stecken oft im Detail. Wenn sich während der Programmierung Änderungen ergeben, müssen sie an dieser Stelle ebenfalls geändert werden. Das verlangt unser Dokumentensystem so.


Es geht demnächst weiter mit dem praktischen Arbeiten –Dem Beginn der Programmierung.






No one has commented yet.
Kommentare sind ausgeschaltet.