|
Plauderecke Alles, was garantiert nichts mit Physik zu tun hat. Seid nett zueinander! |
|
Themen-Optionen | Ansicht |
#11
|
||||
|
||||
AW: Math Schwingungs DZGL
Hi Merman
Die gute Nachricht war, dass deine Sinus Iteration sehr genau ist, die etwas schlechtere fuer dich, dass die Methode ueber das Additionstheorem sogar exakt ist. Begruendung : Betrachte wir die Gleichung A) : cos(x0+dx)=cos(dx)*cos(x0)-sin(dx)*Wurzel(1-cos(x0)^2) ******************************************** Diese stellt einen exakten Zusammenhang dar zwischen cos(x0) und cos(x0+dx) Nehmen wir an wir haetten einen Anfangswert y(0)=cos(x0) gewaehlt. Wir benoetigen dann lediglich die konstanten Werte cos(dx) und sin(dx), die wir nur einmal vor der Iteration beliebig genau bestimmen muessen. (Dran denken: Einen Schleifen GALILEO2609 werfen wir stets aus der Schleife.) Wir koennen cos(x0+dx) somit mir belieber Genauigkeit effizient berechnen. Die Genauigkeit ist unabhaengig von der Anzahl Iterationsschritte und wird in diesem Fall aufgrund der Maschinenungenauigkeit mit der Anzahl Iterationen in der Praxis sogar schlechter. Bleibt aber im Rahmen der Maschinenungenauigkeit. Vielleicht meinte dies der Wiki Mathematiker. Quellcode N:=360; > m0:=evalf(2*Pi/360); > c1:=cos(m0); > c2:=sin(m0); > x[0]:=1; > > for n from 0 to N do > x[n+1]:=x[n]*c1-sqrt(1-x[n]^2)*c2; > y[n+1]:=sqrt(1-x[n+1]^2); # -> Sinuswerte > od: Achtung : Gegenueber deiner Iteration muss man hier beim Index 0 starten. Warum du den Startindex 1 verwendest ist mir nicht ganz klar. Abgesehen davon laesst sich nun alles sehr einfach deuten : Folgende Iteration erzeugt eine Kosinusfunkton y(k+1)=C1*y(k)-C2*Wurzel(1-y(k)^2) y(0)=cos(0) Dabei ist die Iteration exakt fuer C1=cos(dx) C2=sin(dx) Die Werte der Konstanten C1 und C2 lassen sich (unnoetigerweise) ueber eine Taylorapproximation annaehern : C1=cos(dx) etwa 1 C2=sin(dx) etwa dx fuert auf eine klassische integrale (ungenaue) Euler Chromer Approximation Anm: Funktioniert in der Form nur fuer die Sinus Funktion 0..Pi/2 C1=cos(dx) etwa 1-dx^2/2 (Taylorapproximation 2.ter Ordnung) C2=sin(dx) etwa Wurzel(m0^2-m0^4/4); (Serienapproximation 2.ter Ordnung) fuehrt auf die Mermanapproximation Du hast somit an irgendeiner Stelle deiner graphischen Ueberlegungen einen Kreisbogen durch eine Gerade ersetzt. Und dies fuehrt nun leider doch zu einer unnoetigen Ungenauigkeit gegenueber der exakten Methode ueber die Additionstheoreme. Diese rechnet mit dem genauen Kreisbogen. Dargestellt ist das Verhaeltnis der Approximation zum genauen Wert Berechnet man den absoluten Fehler inclusive Maschinenfehler, so ist dieser bei der Additiostheoremmethode gegenueber deiner Naeherung um den Faktor 1000 geringer. Bei 50 Digits Genauigkeit um den Faktor 10^43. e.t.c (Reiner Maschinenfehler) Es ist schon ungewoehnlich. Aber bei der Sinus/Kosinusfunktion reicht tatsaechlich ein Wertepaar um daraus die gesamte Funktion exakt zu rekonstruieren. Vorausschau : Die gleichzeitige Implementation von sin() und cos() (DZGL System) vermeidet die Wurzelfunktion, senkt damit den numerischen Aufwand, vermeidet Fallunterscheidungen, ermoeglicht eine analytische Loesung und senkt nochmals den Maschinenfehler. Gruesse Ge?ndert von richy (16.12.11 um 20:59 Uhr) |
#12
|
||||
|
||||
AW: Math Schwingungs DZGL
Hallo richy,
die Herausforderung bestand u.a. darin den ersten Sinus-/ Kosinuswert mit klassischen Mitteln herzuleiten. Wenn man dafür die implementierten Sinus/ Kosinusfunktion der Headerdatei verwendet, Zitat:
Headerdateien verwenden i.d. Regel Cordic-Algo. bzw. Taylorreihe. Dass diese genauer und schneller sind, war vorher schon klar. Wie ich erwähnte, haben Excelvergleiche ergeben, dass der MermanSinus (bei grober Körnung: r = Pi/180) zumindest bis fünf Nachkommastellen passen. Zur Näherung des ersten Wertes (z.B. für 1°) kann man z.B den Sekantenabschnitt mit dem Kreisabschnitt gleichsetzen: Zitat:
Bei geometrischen Konstruieren ist es schwierig mit einem Winkeldreieck zu arbeiten, mit dem Winkel von 0 Grad, außerdem ist dein Startwert ebenso 1°: Zitat:
Zitat:
Danke dir für deine überaus ausführlichen Ausarbeitungen, und hoffe dass ich nichts falsch verstanden hab. Hier noch eine kleine Nettigkeit, vielleichts kennst du es schon: http://www.youtube.com/watch?v=iK9bhyl6B_E Gruß Merman |
#13
|
||||||
|
||||||
AW: Math Schwingungs DZGL
Hi merman
Zitat:
BTW: Ein Header in C bindet Bibliotheken ein und Declerationen. Ich wuerde die genannten Programmzeilen einfach als Variablenzuweisung bezeichnen. Zitat:
Will man es ganz schnell, dann nimmt man eine Tabelle, die man vorher berechnet und verwendet Register Integer Zahlen. Zitat:
Zitat:
Zitat:
Das Thema moechte ich auch noch nicht abschliessen, weil es doch noch sehr viel interessante Aspekte enthaelt. Ein Problem aller Varianten ist in der Form mit der Wurzel, dass sie nur im Intervall 0..180 Grad funktionieren. Dass laesst sich aber sehr leicht aendern, indem man Sinus und Kosinus simultan berechnet. Also nicht nur eine DZGL sondern zwei miteinander verkoppelte. Das geht ganz einfach. Auch fuer deine Varinate und laesst sich auch einfach erklaeren. Es stellt zusammen mit dem Gedanken der Taylorapproximaton in C1 und C2 deine Approximation auch auf eine noch solidere Basis. Zitat:
Kann mir aber vorsellen, dass es Menschen gibt, die nicht darueber lachen, weil sie den eigentlichen Witz darin nicht erkennen :-) Hilfe ... die Falsettestimme ... oder die ein Meter siebzig Viertausend sechshundert fuenfzig Meter So weit ist es bis zum Horizont (Koennte in Holland sogar hinkommen) Gruesse Ge?ndert von richy (12.12.11 um 17:19 Uhr) |
#14
|
||||
|
||||
AW: Math Schwingungs DZGL
Uebergang zum verkoppelten Differenzengleichungssystem
******************************************* Unsere Ausgangsmethode lautete allgemein (ohne Anfangswertbetrachtung) : > for n from 0/1 to N do > x[n+1]:=x[n]*c1-sqrt(1-x[n]^2)*c2; > y[n+1]:=sqrt(1-x[n+1]^2); # -> Sinuswerte > od: In x[n] wird die Kosinusfunktion iteriert. Allerdings hat die Iteration nur einen Gueltigkeitsbereich von 0..180 Grad (0..Pi) y[n] stellt selbst keine Iterationsvariabe dar. Es wird lediglich die Konsinusfunktion in ene Sinusfunkton umgegerechnet ueber die Identitat : sin(x)^2+cos(x)^2=1 Man koennte auch direkt die Sinusfunktion iterieren. Anhand der Additiostheoreme sieht man recht schnell, dass sich nur das Vorzeichen aendert und dies folgender Iteration entspraeche : > for n from 0/1 to N do > y[n+1]:=y[n]*c1+sqrt(1-y[n]^2)*c2; > od: Nun kennen wir unsere Zielfunktion sin(n*2*Pi/N) und sehen sofort, dass dann der Wurzelterm sqrt(1-y[n]^2) der Kosinusfunktion cos(n*2*Pi/N) entsprechen muss. Wie koennen wir auf die Kosinusfunktion zugreifen, ohne den Wurzelausdruck zu verwenden ? Indem wir diese gesondert iterieren. Und das hatten wir bereits implementiert : > x[n+1]:=x[n]*c1-sqrt(1-x[n]^2)*c2; Und hier ersetzen wir einfach den Wurzelterm durch die Sinusfunktion y[n]=sqrt(1-x[n]^2) und erhalten : Zitat:
Fuer alle C1,C2 Varianten auch die merman Variante Dazu vermeiden wir den ungenauen und langsamen Wurzelausdruck Wir haben die DZGL dazu linearisiert und koennen sie sogar mittels Z Transformation analytisch untersuchen (allerdings ergibt dies Horrorausdruecke) Gruesse Ge?ndert von richy (12.12.11 um 18:15 Uhr) |
#15
|
||||
|
||||
AW: Math Schwingungs DZGL
Hallo nochmal,
kurz vor Feierabend: In Headerdateien wird auf jede Menge Quelltext verwiesen, insofern auch auf Funktionen. Zitat:
die in irgendeinem Quelltext steht, welcher über eine Headerdatei mit eingebunden wird. Der Gag wäre einen Quelltext zu schreiben, welcher ohne sin()/ cos()/tan() Funktionen auskommt, dennoch Sinuswerte oder -Kurve generiert, für Musik/ Echtzweit wahrscheinl. zu langsam. (Die Genauigkeit wird wahrscheinlich eine kleinere Rolle spielen, wegen quantisierter Abtastung und Digitalisierung ?) Noch besser wäre eine f(x) o.ä., habe zu diesem Zweck die Sinuskurve nochmal anders bildlich zerlegt: http://www.quanten.de/forum/showthread.php5?t=2095 ,... hat aber bisher nicht viel gebracht, ... ich bleibe aber dran, vorerst mit meinen bescheidenen Mitteln. Danke dir, Gruß Merman |
#16
|
||||
|
||||
AW: Math Schwingungs DZGL
Nachtrag. (Mein voriger Beitrag gehörte eigentlich vor deinen letzten, irgendwie warst du schneller)
... wenn man doch cos() und sin() verwendet um die (stauchenden und dehnenden) Konstanten c1 und c2 festzulegen, dann könnte man doch gleich jeden Winkel mit dieser C-Funktion berechnen lassen. for(n=0;n<=360;n++) { . x[n]=sin[n] . y[n]=n*(2*Pi()/360) . plot x[n], y[n], "." } , so oder ähnlich (die letzte Zeile ist ORIC1- Basic-Code : ), aber du weißt was ich meine. Das ergäbe ähnlich genaue Werte Muss Feierabend machen, Danke nochmal, Gruß Merman |
#17
|
||||
|
||||
AW: Math Schwingungs DZGL
Hi merman
Header ****** In hoeheren Programmiersprachen (Maschinensprache waere die unterste) ist der Header meist nicht mehr als solcher erkenntlich. Ebenso ist die Variablendeklaration und Speicherplatzreservierung automatisiert. Man muss sich praktisch um nichts mehr kuemmern. So ist das auch in Maple oder Exel. Zitat:
http://www.imb-jena.de/~gmueller/kur.../c_define.html Der Header ist ein TEXT ! Preprozessor. Der ersetzt lediglich Zeichenfolgen im Quelltext. Und jawohl, der Ausruck cos(x) ist natuerlich nichts weiter als die Einsprungadresse auf ein Unterprogramm, dass den Funktionswert zurueckgibt. Aber Standartfunktionen wie cos(x) gehoeren zur Standartbibliothek hoeherer Programmiersprachen. Man muss sie in einem Header also nicht extra einbinden. Die sind vorcompiliert. Ein Header ist wie gesagt ein Textpreprozessor. Wenn du in C schreibst #include Blabla.h Dann ist es so als ob der Text der Datei Blabla.h genau an dieser Stelle steht. Und was du nun vielleicht meinst. Wenn man in den Header schreibt : #define C1 cos(dx) Dann waere das nicht effizient sondern eventuel galileo2609. Also ineffizienter redudanter Code. Denn diese Anweisung ist rein textorientiert und ersetzt im folgenden die Zeichenfolgen C1 durch cos(dx). Und wenn C1 in einer Schleife steht ist das redudant. Denn dann steht dort in Wirklichkeit cos(dx). Und in jedem Schleifendurchgang springt man in die Cosinusunterfunktion, obwohl das Ergebnis eine Konstante ist ! Fuer effizienten Code muss man vor allem die Schleifen optimieren. Die galileos eliminieren. Falsch ***** start Schleife i=0..10 000 galileo2609:= i+cos(dx) end Schleife i Das Unterprogramm cos(dx) wird 10 000 Mal unnoetig angesprungen und alle Anweisungen dort ausgefuehrt. Dabei ist dx aber in der Schleife konstant. Damit auch cos(dx). Die Berechnung ist somit 9999 Mal unnoetig. Falsch : ****** #define C1 cos(dx) start Schleife i=0..10 000 galileo2609:= i+C1 end Schleife i Denn hier wird im Quelltext C1 durch cos(dx) ersetzt und man erhaelt den selben Code wie im ersten Beispiel. Richtig ****** C1:=cos(dx) start Schleife i=0..10 000 wert:= i+C1 end Schleife i Der Variablen C1 wird einmal der Wert cos(dx) zugeordnet. Dazu einmal das Unterprogramm cos() vor der Schleife durchlaufen und nicht 10 000 mal in der Schleife. Darauf muss man auch in hoeheren Programmiersprachen achten gerade weil diese soundso sehr langsam sind. ZUSATZBEMERKUNG Der #define Befehl in einem C Header ist vor allem dazu gedacht Speicheradresse anschaulicher zu bezeichnen. Z.B. kannst du die eine Portadresse &ab20 im Header rein textlich umbenennen : #define &ab20 AUDIOIN Oder den Quelltext in badisch schreiben :-) #define for MACH_DES_FOLGENDE_DO_MIT #define from FANG_A_DU_SEGGEL_MIT #define to UNN_HOER_UFF_BEI Folgendes waere nun ein gueltiger MAPLE Befehl MACH_DES_FOLGENDE_DO_MIT i FANG_A_DU_SEGGEL_MIT 1 UNN_HOER_UFF_BEI 10 do Das wuerde tatsaechlich funktionieren. /ZUSATZBEMERKUNG Ge?ndert von richy (12.12.11 um 22:23 Uhr) |
#18
|
||||
|
||||
AW: Math Schwingungs DZGL
Zitat:
> for n from 0/1 to N do > x[n+1]:=x[n]*c1-y[n]*c2; # x=Cosinus > y[n+1]:=y[n]*c1+x[n]*c2; # y=Sinus > od: und dennoch bleibt unsere Grundgenauigkeit erhalten. Das ist ja gerade das schon etwas Verblueffende. Aus einem Funktionspaar (dx ,sin(dx)) kontruieren wir den kompletten Sinus mit 4 Multiplikationen voellig exakt. Oder bei deiner Taylorvorgabe in dieser Genauigkeit. Der Ausflug zur Effizenz ist somit nicht Off Topic sonder gerade einer der Hauptaspekte neben der reinen Freude an der Sache. BTW : Falls wir die Werte nicht speichern muessen waere der Algo noch effizienter. Auch die Schleife selbst koennte man in C weiter optimieren. Und der Code ist nun so einfach, dass man ihn auch in Maschinensprache einbinden koennte. Aber bleiben wir bei Exel/Maple. Noch eine Frage : Unter welcher Rubrik wolltest du die merman DZGL bei WIKI eintragen ? Ge?ndert von richy (12.12.11 um 21:21 Uhr) |
#19
|
||||
|
||||
AW: Math Schwingungs DZGL
Die effizeinte merman DZGL :
********************* Betrachten wir nochmals deinen Ausgangscode : Zitat:
Schleifenoperationen : 7 Multiplikationen 2 Divisionen 5 Additionen 3 Wurzelfunktionen ! Gueltigkeitsbereich: 0..180 Grad In der Form kauft dir dies natuerlich kein Wiki ab Zwischenoptimierung : **************** Berechnen aller konstanten Ausdruecke nicht innerhalb, sondern vor der Schleife. Zitat:
Schleifenoperationen : 4 Multiplikationen 3 Additionen 2 Wurzelfunktionen ! Gueltigkeitsbereich: 0..180 Grad optimiertes, elegantes merman DZGL System : ********************************** Elimination der Wurzelausdruecke durch simultanes Berechnen der Sinus und Kosinusfunktion. Fuehrt auf ein lineares Differenzengleichungssystem. Merke: Wer keine Probleme hat Anschauungsraueme dimensional zu erweitern ist meist im Vorteil Zitat:
P gibt die Anzahl Perioden vor, die iteriert werden. M=N*P; Schleifenoperationen : 4 Multiplikationen 2 Additionen Gueltigkeitsbereich: alle Winkel ! Aenderung an Mermans Grundidee, Algoritmus : Keine Ausdruck inclusive (ueberdecktem) Referenz Sinus und Kosinus Na, das ist doch was fuer 4 Multiplikationen. Das hat Hand und Fuss und es ist immer noch das Ergebnis deiner graphischen Methode. Voellig aequivalent dazu, aber aufgrund der optimierten Implementation kein Vergleich zu deiner Ausgangsversion (rot, bis 180 Grad von der Referenz ueberdeckt) : Viele Gruesse Ge?ndert von richy (13.12.11 um 16:33 Uhr) |
#20
|
||||
|
||||
AW: Math Schwingungs DZGL
ok, habs verstanden,
nur einmal aufrufen (cos()) und dann nur noch simples Rechnen (lassen): ist schnelles Rechnen plus Genauigkeit. Dieser Tatsache könnte man den Vorrang geben, vor dem hehren Ziel alles unter völligem Ausschluss der implementierten cos()/ sin() Funktionen zu Nähern. Meinen Beitrag bei Wikipeia findest du bei Wikipeia Sinus und Kosinus, nicht im Artikel, sondern unter "Diskussion": http://de.wikipedia.org/wiki/Diskuss...us_und_Kosinus Es ist der erste Beitrag, darin wurde viel verändert und auch gelöscht. Jeder kann -auch ohne einen Zugang zu haben- unter "Diskussion" Beiträge posten, es wird schlimmstenfalls deine IP Adresse festgehalten. Das schlimme ist, dass man auch gegenseitig in Artikel schreiben oder löschen kann, und gerade unter Wiki/sinus/Diskussion verweilt glaube ich so ein Schlimmfinger, Da hat einer übel andererLeuts Beiträge zurechtgestrichen oder gelöscht, auch in meinem. Ich hab mir mal die Profile angesehen, da viel mir auf, dass ein Teilnehmer tatsächlich mehrere "Anzeigen" deswegen hat, ich glaube es war RAINALD62. Seit dem hab ich dort kein Handschlag mehr getan. Du wirst sehen, LUTZL ist schon ein ernst zu nehmemder Mathematiker, er hat sich nach langem Hin und Her mal meine Näherung angesehen, mich dann darauf hingewiesen, dass es sich um das Additionstheorem handelt usw., insgesamt, klang aber alles etwas herablassend. so, muss nun ins Bett, wünsche noch angenehmen Abend/ Nacht, mach nicht zu lang mit MAPLE bei einem Glas Edwards o.ä., f falls du zwischendurch Kicks brauchst, kannst du wählen zwischen: http://www.youtube.com/watch?v=wKXuhuEl8CE (Lemmy Kilmister mit Dave Grohl) oder http://www.youtube.com/watch?v=47mbyjy0zDQ (1,70 m (max), ohne Falsett) Gruß Merman |
Lesezeichen |
|
|