Einzelnen Beitrag anzeigen
  #19  
Alt 12.12.11, 22:01
Benutzerbild von richy
richy richy ist offline
Singularität
 
Registriert seit: 01.05.2007
Ort: karlsruhe
Beitr?ge: 4.170
Standard AW: Math Schwingungs DZGL

Die effizeinte merman DZGL :
*********************

Betrachten wir nochmals deinen Ausgangscode :

Zitat:
> restart;
> r:=Pi/180;
> x[1]:=1-r^2/2;
>
> for n from 1 to 360 do
> x[n+1]:=evalf(x[n]*(1-r^2/2)-sqrt(1-x[n]^2)*sqrt(r^2-r^4/4));
> y[n+1]:=sqrt(1-x[n+1]^2); # -> Sinuswerte

> od:

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:
> m0:=evalf(Pi/180);
> c1:=1-m0^2/2;
> c2:=sqrt(m0^2-m0^4/4);
> x[1]:=c1;
>
> for n from 1 to 360 do
> x[n+1]:=x[n]*c1 - sqrt(1-x[n]^2)*c2;
> y[n+1]:=sqrt(1-x[n+1]^2); # -> Sinuswerte
> od;
m0 ist gleich dx. Einen Kreis in 360 Grad einzuteilen ist voellg willkuerlich. m0, dx ist einfach 2*Pi/N. Ueber wieviele Abtastwerte N man den Einheitskreisumfang 2*Pi in Teilsehnen dx diskretisiert.


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:
restart;
> N:=360; # Anzahl Abtastwerte
> P:=3; # Anzahl Perioden
> M:=P*N;
> m0:=evalf(2*Pi/N);
> c1:=1-m0^2/2;
> c2:=sqrt(m0^2-m0^4/4);
> x[1]:=c1;
> y[1]:=c2;
>
> for n from 1 to M do
> x[n+1]:=x[n]*c1 - y[n]*c2; # -> Cosinuswerte
> y[n+1]:=y[n]*c1 + x[n]*c2; # -> Sinuswerte
> od:
>
> # DRUCKROUTINEN
> druck1:=seq([i,y[i]],i=1..M):
> druck2:=seq([i,sin(i*2*Pi/360)],i=1..M):
> druck3:=seq([i,x[i]],i=1..M):
> druck4:=seq([i,cos(i*2*Pi/360)],i=1..M):
> plot([[druck1],[druck2],[druck3],[druck4]]);
N gibt die Anzahl Abtatswerte pro Periode vor.
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)
Mit Zitat antworten