# Kapitel 18: Behandlung gr"osserer trigonometrischer Ausdr"ucke. # ==================================== # Stichworte: # ------------- # -- interaktives Arbeiten, # -- System eventuell teilweise "abschalten", # -- Tendenz, Ausdr"ucke beim erneuten Niederschreiben zu permutieren, # -- automatisch durchgef"uhrte unzweckm"assige "Vereinfachung". # ---------------------------------------------------------------------- # ------- # a) Ein unbefriedigendes Ergebnis unter combine(...,trig) . # # Am Beispiel einer trigonometrischen Umformung erl"autern wir # den Effekt von verfr"uht ausgef"uhrten Funktionsauswertungen. # # Eine der 99 L"osungen der Gleichung z^n=1 f"ur n=99 ist > test1 := > cos(2*Pi*67/99)+I*sin(2*Pi*67/99); # Ein Bild aller 99 Einheitswurzeln: > H:=j->[cos(2*Pi*j/99), sin(2*Pi*j/99)]; > plot([seq(H(j),j=1..99)], style=point); # Es gilt also test1^99=1 . Genauso gilt test2^33=1 , wenn test2 # definiert wird durch > test2 := > cos(2*Pi*23/33)+I*sin(2*Pi*23/33); # Also ist test1^99-test2^33=0 . Wir multiplizieren diesen Ausdruck mit # "simplify" aus, wobei wir aus Platzgr"unden auf das Lesen des # Ergebnisses verzichten und nur die Anzahl der Terme nachpr"ufen: > test1^99-test2^33; > setime:=time(): test3:=simplify(""): > cpu_time:=(time()-settime)*seconds; > nops(test3); # Zwei beliebig herausgegriffene Terme als Muster: > op(1,test3)+op(2,test3); # (Man beachte: Maple stellt eine Summe i.a. bei jeder Wiederholung in # einer neuen Reihenfolge dar). # Versuch, numerisch nachzupr"ufen, ob der Betrag der komplexen Zahl # "test3" gleich Null ist: > settime:=time(): evalf(abs(test3)); > cpu_time:=(time()-settime)*seconds; # Wie beim Rechnen "von Hand" ist daran zu denken, dass ein bei einer # Probe gefundener Fehler aus der Probe selbst herr"uhren kann: Hier # zwar nicht als Abschreibfehler, sondern als Rundungsfehler. Rechnen # wir mit 30 statt mit 10 Stellen: > Digits:= 30; > settime:=time(): evalf(abs(test3)); > cpu_time:=(time()-settime)*seconds; # Also darf man vermuten, dass "test3" den Wert Null hat. # Nun setze "Digits" wieder auf den Normalwert 10 zur"uck und # versuche, "combine(...,trig)" anzuwenden: > Digits := 10; > settime:=time(): test4:=combine(test3,trig); > cpu_time:=(time()-settime)*seconds; > simplify(test4); # Numerische Evidenz f"ur die Richtigkeit dieses Ergebnisses: > evalf(test4); # Aber wir h"atten erwartet, dass Maple die sechs Terme weiter # zusammengefasst und "Null" als Endergebnis ausgegeben h"atte. # ============================================ # b) Verlaufskontrolle mit "printlevel": Verfr"uhte Funktionsauswertung # ---------------------------------------------------------------------- # ------- # Der Grund f"ur die unvollst"andige Zusammenfassung ist: W"ahrend der # Ausf"uhrung des Befehls "combine(test3, trig)" hat Maple an wenigen # Stellen den Term sin(Pi/3) angetroffen und ihn spontan ausgewertet: > sin(Pi/3); # In test4 ist zwar kein Term sqrt(3) zu sehen -- trotzdem kann man # nachweisen, dass solche Terme im Laufe der Rechnung aufgetreten sind. # Dazu wiederholt man die Ausf"uhrung des Befehls "combine (test3, # trig)" unter "Uberwachung der Zwischenrechnungen wie folgt. # F"ur den Grad an Ausf"uhrlichkeit des Maple-output ist die # Systemvariable "printlevel" verantwortlich . # Sie wird beim Starten von Maple auf ihren Normalwert 1 gesetzt. Das # pr"ufen wir nach: > printlevel; # Erh"ohe diesen Wert auf 100 und starte den Befehl # "combine(test3,trig)" erneut: > printlevel:=100; > combine(test3,trig): > printlevel:=1; printlevel := 1 # ============================================ # c) Abschalten der Funktionsauswertung # ------------------------------------------------ # Als Nutzanwendung dieser Untersuchung finden wir einen # neuen Weg, mit geringstem Aufwand die gew"unschte Zusammenfassung von # "test3" zu erreichen: Wenn das Hindernis in der spontanen Auswertung # von sin(Pi/3 bestand, m"usste man es umgehen k"onnen, indem man Maple # die Werte der Argumente # vorenth"alt. Wir substituieren einfach zwei symbolische Gr"ossen a, b # f"ur die Argumente (dazu siehe "?subs"): > test5:=subs({35*Pi/99=a, 13*Pi/33=b}, > test3): # Man sollte das Ergebnis ansehen, um sich zu vergewissern, dass # tats"achlich alle Argumente durch symbolische Gr"ossen ersetzt sind. # Das kann man aber auch so pr"ufen: # Da Pi nur in den Argumenten vorkommt, darf "test5" kein Pi mehr # enthalten. # F"ur das Suchen nach einer bestimmten Gr"osse gibt es den Befehl # "has". Siehe dazu "?has". > has(test5, Pi); # Sicherheitshalber kontrolliere auch, ob noch alle 134 Terme da sind: > nops(test5); # Durch die Substitution erreichen wir, dass die Funktionsauswertung # "abgeschaltet" ist, w"ahrend die trigonometrischen Additionstheoreme # weiter zur Verf"ugung stehen. Wenn wir nun "combine(...,trig)" # anwenden, erhalten wir: > test6:=combine(test5,trig); # Setze die Werte von a und b wieder ein und veranlasse mit "eval" den # letzten Schritt: > subs({a=35*Pi/99, b=13*Pi/33}, test6); > eval("); # ! # ============================================ # d) Bemerkungen # -------------------- # i) Wenn der Grund f"ur das unbefriedigende Ergebnis unter a) in # einer verfr"uhten Funktionsauswertung beim Cosinus oder Sinus besteht, # dann sollte sich die Lage bessern, wenn man in a) hinreichend # komplizierte Argumente w"ahlt, zum Beispiel mit hinreichend grossen # Primzahlen in den Nennern. Eine Probe mit n=101 und m=41 best"atigt # dies. # ii) Wenn man unter a) den Befehl # "simplify((test1)^99-(test2)^33)" # durch # "test3:=expand((test1)^99-(test2)^33)" # ersetzt, entsteht eine Summe aus 134 Termen, die von # "combine(...,trig)" nur # noch auf 131 Terme reduziert wird. Ersetzt man von Beginn an die # Variablen durch symbolische Werte, so kommt man auch mit "expand" zum # gew"unschten Ergebnis.