Partial Differential Equations, Algebraic Computing

0 downloads 0 Views 2MB Size Report
2. Αν Uα ∩ Uβ = 3 τ τε η σ νθεση φβφ. −1 α : φα(Uα ∩ Uβ) → φβ(Uα ∩ Uβ) ...... 201. 202 $KnownFunctions {}. 203. 204 $JetSpace 0. 205. 206 $Percent 2 ...... 'Elenqoc gia an pr'okeitai gia sp'asimo l'ogw "orfan'wn" metablht'wn 'hl'ogw thc morf'hc ...... I f [ Threads {} ,. 3057. (* solution={"+",If[$AdditionalAssumptions === {},#,.
Μ Δ Ε, Α Υ   Γ Σ Διδακτορική Διατριβή του

Σ Σ. Δ

Πανεπιστήμιο Πατρών Σχολή Θετικών Επιστημών Τμήμα Μαθηματικών Επιβλέπων:

Κ Δ Γ. Τ Οκτώβριος, 2008

Στυλιανός Σ. Δήμας: Μερικές Διαφορικές Εξισώσεις, Αλγεβρική Υπολογιστική και μη Γραμμικά Συστήματα, © Οκτώβριος, 2008

αφιερώνεται στον Σπύρο, τον Στέλιο και την Γεωργία

Ε Από τη ϑέση αυτή ϑα ήθελα να ευχαριστήσω ϑερμά τα μέλη της Συμβουλευτικής Επιτροπής, τον Καθηγητή κ. Δημήτρη Τσουμπελή, τον Αναπληρωτή Καθηγητή κ. Βασίλη Παπαγεωργίου και τον Αναπληρωτή Καθηγητή κ. Χριστόδουλο Σοφοκλέους. Ιδιαιτέρως ευχαριστώ τον κ. Τσουμπελή, για την υπομονή και εμπιστοσύνη που μου έδειξε κατά το διάστημα της εκπόνησης της παρούσας διατριβής, που έγινε υπό την επίβλεψή του. Είναι αυτός που με εισήγαγε στον ϑαυμαστό κόσμο των συμμετριών και της Μαθηματικής Φυσικής, διαμορφώνοντας έτσι, κατά ένα μεγάλο βαθμό τον επιστημονικό μου προσανατολισμό. Επίσης ευχαριστώ πολύ τον κ. Παπαγεωργίου, για τις συμβουλές και τις ιδέες του σε μια πληθώρα ζητημάτων που αντιμετώπισα στην πολυετή συνεργασία μας. Τέλος, τον κ. Σοφοκλέους τον ευχαριστώ για την υποστήριξη και την ενθάρρυνση σε όλα τα στάδια της εκπόνησης της διατριβής, αλλά και για πολλά ακόμα: Το έργο του στον τομέα των συμμετριών των διαφορικών εξισώσεων, τα σεμινάρια που έδωσε κατά τις επισκέψεις του στο Τμήμα Μαϑηματικών του Πανεπιστημίου Πατρών και η φιλοξενία που μου πρόσφερε στο Τμήμα Μαθηματικών και Στατιστικής του Πανεπιστημίου της Κύπρου συνέβαλαν καθοριστικά στην ολοκλήρωση της ερευνητικής μου προσπάϑειας. Θα ήθελα, επίσης, να ευχαριστήσω τον Υποψήφιο Διδάκτορα Κωνσταντίνο Ανδριόπουλο και τον Καθηγητή κ. Peter Leach για την συνεργασία που είχαμε, οι καρποί της οποίας περιέχονται στο 5ο κεφάλαιο της διατριβής. Η συγκεκριμένη Διδακτορική Διατριβή πραγματοποιήθηκε στα πλαίσια του Προγράμματος ΗΡΑΚΛΕΙΤΟΣ το οποίο συγχρηματοδοτείται από την Ευρωπαϊκή ´Ενωση και Εθνικούς Πόρους.

v

Ε Στη διδακτορική διατριβή που κρατάτε στα χέρια σας έχουμε ϑέσει δύο στόχους. Ο πρώτος, να ῾῾παντρέψουμε᾿᾿ την κατά συμμετρίες ανάλυση διαφορικών εξισώσεων, μια σύγχρονη και αποτελεσματική μέθοδος του μαθηματικού πεδίου των Διαφορικών Εξισώσεων (ΔΕ), με την Αλγεβρική Υπολογιστική (ΑΥ). Βέβαια, δεν είναι η πρώτη φορά που επιχειρείται κάτι τέτοιο, πιστεύουμε όμως, όπως ϑα δούμε και στην συνέχεια, ότι η δική μας προσέγγιση αποτελεί μια σύγχρονη πρόταση πάνω σε αυτό το ζήτημα. Καρπός αυτού του εγχειρήματος είναι η δημιουργία μιας σειράς από σύγχρονα και ευέλικτα συμβολικά εργαλεία τα οποία συγκεντρώσαμε σε αυτό που ϑα αποκαλούμε από εδώ και πέρα συμβολικό πακέτο SYM. Εργαλεία καθοριστικής σημασίας για την επίτευξη του δεύτερου στόχου, την ανάλυση μη γραμμικών συστημάτων και Προβλημάτων Αρχικών – Συνοριακών Τιμών (ΠΑΣΤ). Τα προβλήματα που ϑα εξετάσουμε στην συνέχεια προέρχονται κυρίως από την περιοχή της Μαθηματικής Φυσικής. Μια περιοχή με μεγάλη ερευνητική δραστηριότητα, πλούσια σε ΠΑΣΤ. Ο κορμός αυτού του πονήματος είναι χωρισμένος σε δύο μέρη. Το πρώτο μέρος αποτελείται από δύο κεφάλαια και είναι εισαγωγικού χαρακτήρα. Το πρώτο από τα δύο κεφάλαια είναι αφιερωμένο στις συμμετρίες. Δίνουμε τον ορισμό της έννοιας, πρώτα γενικά και ύστερα συγκεκριμένα στο επίπεδο των Διαφορικών Εξισώσεων. Αναφέρουμε τα απαραίτητα εργαλεία από την Ανάλυση και την Α ´ λγεβρα όπως τις έννοιες της διαφορίσιμης πολλαπλότητας, της ομάδας Lie και της άλγεβρας Lie, μέσω των οποίων υλοποιούμε την μέθοδο των συμμετριών. ´Υστερα, παρουσιάζουμε τον τρόπο εύρεσης συμμετριών, σημειακών αρχικά, και πώς με την γνώση αυτών μπορούμε να κατασκευάσουμε λύσεις. Επίσης, δείχνουμε πως με τις συμμετρίες μπορούμε να μελετήσουμε συνολικά ένα ΠΑΣΤ. Στην συνέχεια, διευρύνουμε την έννοια της συμμετρίας πέρα από την σημειακή και αναφέρουμε μερικές από τις δυνατές γενικεύσεις της. Στο δεύτερο κεφάλαιο, περιγράφουμε τα προγράμματα ΑΥ, ποιος είναι ο σκοπός τους και τι μας προσφέρουν. Επιπλέον, δίνουμε μια εκτενέστερη περιγραφή του προγράμματος που αποτελεί και την πλατφόρμα του πακέτου μας: του Mathematica™ . Το δεύτερο μέρος περιλαμβάνει όλα τα ερευνητικά μας αποτελέσματα και αποτελείται από τρία κεφάλαια. Στο πρώτο από αυτά τα κεφάλαια περιγράφουμε το πακέτο SYM, την φιλοσοφία με την οποία δημιουργήθηκε, την δομή του και τα πλεονεκτήματά του. Στο

κεφάλαιο αυτό δίνουμε την σύνταξη των βασικότερων εντολών του και παραδείγματα χρήσης του. Στο δεύτερο κατά σειρά κεφάλαιο μελετάμε ένα πρόβλημα της Γενικής Θεωρίας της Σχετικότητας, τις λύσεις των εξισώσεων πεδίου του Einstein που αντιστοιχούν σε κύματα βαρύτητας. Το σημείο εκκίνησης είναι οι μετρικές Bondi και BondiSachs. Με βάση αυτές, δίνουμε τις αντίστοιχες εξισώσεις πεδίου. Πρόκειται για μη γραμμικά συστήματα Μερικών Διαφορικών Εξισώσεων ΜΔΕ δεύτερης τάξης τριών και τεσσάρων ανεξάρτητων μεταβλητών αντίστοιχα. Με την προσθήκη των συνοριακών συνθηκών που ορίζει το φυσικό πρόβλημα εξετάζουμε τα αντίστοιχα ΠΑΣΤ που προκύπτουν. Στο τελευταίο κεφάλαιο εισάγουμε τις έννοιες της πλήρους ομάδας συμμετριών και της αξιοσημείωτης κατά Lie. Με βάση αυτές, εξετάζουμε μια σειρά από ΔΕ (Monge–Ampère, Bateman, Born–Infeld) και παρουσιάζουμε μια συστηματική διαδικασία με την οποία χρησιμοποιώντας τις συμμετρίες μιας ΔΕ μπορούμε να κατασκευάσουμε οικογένεια ΔΕ, πιο σύνθετη από την αρχική μας εξίσωση, η οποία εμπεριέχει την αρχική. Επιπλέον, δείχνουμε πώς η διαδικασία αυτή μπορεί να επεκταθεί παίρνοντας ως αφετηρία δύο ΔΕ. Τέλος, στο παράρτημα παραθέτουμε τον πηγαίο κώδικα του συμβολικού πακέτου SYM.

viii

Π Ε

vii

 Ε Ε 1  Σ 3 . Τι ονομάζουμε συμμετρία 3 . Συμμετρίες ΔΕ 4 .. Πολλαπλότητες, Ομάδες και Α ´ λγεβρες Lie 7 .. Διανυσματικά πεδία, ο Απειροστός Γεννήτορας και η επέκταση του 11 .. Τα ϑεωρήματα του Lie 17 .. Πώς βρίσκουμε τις σημειακές συμμετρίες μιας ΔΕ 18 .. Κατασκευή λύσεων μέσω των συμμετριών μιας ΔΕ 24 .. Κατά συμμετρίες ανάλυση ΠΑΣΤ 27 .. Πέρα από τις σημειακές συμμετρίες 31  Σ Σ Υ 35 . Εισαγωγή 35 . Το πρόγραμμα Mathematica 36  Ε Α 37  Τ Σ Π S 39 . Εισαγωγή 39 . Βασική Χρήση 42 . Συμπεράσματα – Προοπτικές 49  Β Κ 53 . Εισαγωγή 53 . Η μετρική Bondi 55 .. Οι εξισώσεις Πεδίου 56 .. Συμμετρίες ΠΑΣΤ 58 . Συμπεράσματα – Προοπτικές 63  Κ Δ Ε . Εισαγωγή 67 . Η Εξίσωση Monge–Ampére 73 . Η Εξίσωση Bateman 74 . Η Εξίσωση Born–Infeld 77 . Μια νέα ΔΕ 80 . Συμβολικά Εργαλεία 80 . Συμπεράσματα – Προοπτικές 81  Π  Κ S

67

83 85

ix

x

Π Β

143

Κ Σ Figure Σχήμα Σχήμα Σχήμα

1 2 3 4

Marius Sophus Lie 17 Διάρθρωση Sym 40 Διάδοση βαρυτικής ακτινοβολίας 55 Συμμετρικές λύσεις της 5.24. 79

Κ Π Πίνακας 1 Πίνακας 2 Πίνακας 3

Αναπαράσταση Εκφράσεων με Sym 40 Συμμετρίες εξίσωσης (3.1) 48 Μεταθετικός πίνακας συμμετριών εξ. πεδίου Bondi

60

Α ΜΔΕ

Μερικές Διαφορικές Εξισώσεις

ΑΥ

Αλγεβρική Υπολογιστική

ΠΑΣΤ

Προβλήματα Αρχικών – Συνοριακών Τιμών

ΔΕ

Διαφορικές Εξισώσεις

ΣΔΕ

Συνήθεις Διαφορικές Εξισώσεις

xi

Μέρος I Ε Ε

1

Σ .

Τ  

Συμμετρία, μια λέξη γνωστή σε όλους μας. Η χρήση της δεν περιορίζεται μόνο στις ϑετικές επιστήμες αλλά χρησιμοποιείται στον καϑημερινό μας λόγο, στις τέχνες, την κοινωνιολογία, την ψυχολογία, την ιατρική και πολλούς άλλους τομείς. Σε σχεδόν όλες, αν όχι όλες, τις γλώσσες του δυτικού κόσμου η αρχαία αυτή Ελληνική λέξη αποδίδεται αυτούσια. Πρόκειται για σύνθετη λέξη αποτελούμενη από την πρόθεση συν- και το ουσιαστικό μέτρον. Κυριολεκτικά δηλώνει την ιδιότητα ενός αντικειμένου να μπορεί να μετριέται συγχρόνως ή ταυτόχρονα, μια αρμονία δηλαδή ως προς τις αναλογίες του. ´Ετσι, ακόμη και σήμερα όταν χαρακτηρίζουμε ένα αντικείμενο ως συμμετρικό ϑέλουμε να μεταφέρουμε στους συνομιλητές μας την αρμονία του, είτε στο σχήμα του όταν αναφερόμαστε στην ύλη, είτε στην ουσία του όταν αναφερόμαστε σε έννοιες. Με βάση όλα αυτά, ένας πρώτος, μη αυστηρός, ορισμός ϑα ήταν ο εξής: Συμμετρία είναι η ιδιότητα ενός αντικειμένου να παρουσιάζει ακριβώς την ίδια εικόνα, όταν παρατηρείται από διαφορετική σκοπιά. Ο ορισμός αυτός δεν περιορίζεται μόνο σε υλικά αντικείμενα και γεωμετρικά σχήματα όπως φαίνεται και στα επόμενα παραδείγματα. Π 1.1. Το δεύτερο αξίωμα της Ειδικής Θεωρίας της Σχετικότητας αναφέρει ότι ‘‘οι φυσικοί νόμοι είναι ίδιοι σε όλα τα αδρανειακά συστήματα αναφοράς’’. Στη πραγματικότητα, το αξίωμα αυτό περιγράφει μια συμμετρία! Εδώ, το αντικείμενο που παραμένει αναλλοίωτο είναι οι φυσικοί νόμοι, ενώ οι διαφορετικές σκοπιές είναι τα αδρανειακά συστήματα αναφοράς. Π 1.2. ´Οταν λέμε ότι μια συνάρτηση f(x) είναι άρτια, δηλαδή, f(x) = f(−x) στην πραγματικότητα περιγράφουμε μια συμμετρία. Το αντικείμενο που παραμένει αναλλοίωτο στην περίπτωση αυτή είναι η τιμή της συνάρτησης όταν η τιμή της μεταβλητής αλλάζει πρόσημο. Γεωμετρικά, η συμμετρία αυτή εκφράζεται με το ότι το γράφημα της συνάρτησης έχει τον άξονα των τιμών ως άξονα συμμετρίας.

3

4

Σ

Π 1.3. Τελευταίο, ένα καθαρά γεωμετρικό παράδειγμα. Η σφαίρα ορίζεται ως ο γεωμετρικός τόπος των σημείων που ισαπέχουν από ένα σημείο του χώρου το οποίο ονομάζεται και κέντρο της σφαίρας. Κατά συνέπεια, οι μετασχηματισμοί του χώρου που διατηρούν αναλλοίωτη την απόσταση του κέντρου με τα σημεία της σφαίρας αποτελούν και συμμετρίες αυτής. Η συμμετρία αυτή ονομάζεται και σφαιρική συμμετρία. Στο επόμενο κεφάλαιο εξειδικεύουμε τον παραπάνω ορισμό στο επιστημονικό πεδίο που εξετάζουμε, αυτό των ΔΕ. .

Σ ΔΕ

Στο προηγούμενο εδάφιο δώσαμε έναν γενικό ορισμό της έννοιας της συμμετρίας. Στην περίπτωση των ΔΕ ο ορισμός αυτός μπορεί να εξειδικευτεί ως εξής Ο 1.1. Ονομάζουμε συμμετρία ενός συστήματος ΔΕ

~ x, ~u) = 0, ~x = (x1 , x2 , . . . , xn ), ~u = (u1 , u2 , . . . , um ), m, n ∈ N+ ∆(~ έναν μετασχηματισμό,

~y = ~y(~x, ~u, . . . ), ~υ = ~u(~x, ~u, . . . ) που διατηρεί την μορφή του συστήματος αναλλοίωτη δηλαδή,

~ y, ~υ) = 0 ∆(~ Σε αυτό το στάδιο ακόμη δεν έχουμε καθορίσει σε τι είδους μετασχηματισμούς αναφερόμαστε. ´Οπως ϑα δούμε στα επόμενα κεφάλαια, ανάλογα με την επιλογή μας ϑα προκύπτει και διαφορετική κατηγορία συμμετριών. Από τον παραπάνω ορισμό, είναι προφανές ~ = 0, τότε το ότι αν οι συναρτήσεις ~u είναι λύσεις του συστήματος ∆ ίδιο ισχύει και για τις ~υ. Το γεγονός αυτό μας οδηγεί στο ακόλουθο ορισμό Ο 1.2. Συμμετρία ενός συστήματος ΔΕ είναι ένας μετασχηματισμός που απεικονίζει λύσεις του συστήματος σε λύσεις του ιδίου, όχι απαραίτητα διαφορετικές. Παρακάτω παρουσιάζουμε μερικά παραδείγματα συμμετριών. Π 1.4. Η απλούστερη Συνήθης Διαφορική Εξίσωση (ΣΔΕ) είναι η εξής: y 0 (x) = 0

1.2 Σ ΔΕ

Είναι προφανές ότι οι μετασχηματισμοί x → x + α, α ∈ R και y → y + β, β ∈ R αφήνουν αναλλοίωτη την παραπάνω ΣΔΕ. Η λύση της δεν είναι άλλη από την σταθερή συνάρτηση y(x) = c. Χωρίς υπολογισμούς, μπορεί κανείς να δει ότι και οι δύο μετασχηματισμοί απεικονίζουν λύσεις σε λύσεις, ο πρώτος δε με τετριμμένο τρόπο μιας που δρα ταυτοτικά πάνω στις λύσεις. Επιπλέον, αν y → y + α1 , y → y + α2 δύο τυχαίοι μετασχηματισμοί τότε και η επάλληλη δράση τους, η σύνθεση αυτών δηλαδή, είναι ένας μετασχηματισμός του ίδιου τύπου. y

y® y+Α x®x+ Β

x

Π 1.5. Η εξίσωση Ricatti

y 0 (x) =

y(x) + 1 y2 (x) + 3 x x

παραμένει αναλλοίωτη κάτω από την οικογένεια μετασχηματισμών y x (X, Y) = ( 1−x , 1−y ). Πράγματι, αντιστρέφοντας τον μετασχηματισμό και χρησιμοποιώντας τον κανόνα της αλυσίδας, βρίσκουμε ότι

dy dy dX Y 0 (1 + X) − Y = = (1 + X)2 = Y 0 (1 + X) − Y . dx dX dx (1 + X)2 Συνεπώς, η εξίσωση μετασχηματίζεται στην

Y+1 Y2 +  + 3 (1 + X) ⇔ X X 2 1 Y 0 Y (1 + X) = (Y + 1)( + ) + 3 (1 + X) ⇔ X X 2 Y + 1 Y Y0 = + 3 X X Y 0 (1 + X) − Y =

Η γενική λύση της εξίσωσης είναι η y(x) = −x tan( 1+cx x ), όπου c η σταθερά ολοκλήρωσης. Και όπως ϑα περιμέναμε, ο μετασχηματισμός

5

6

Σ

που δώσαμε πιο πάνω διατηρεί αναλλοίωτο τον χώρο των λύσεων. Αυτό μπορεί να δειχτεί εύκολα:

Y X 1 + (c + )X =− tan( )⇔ 1 + x 1 + X X 1 + CX ), C = c +  Y(X) = −X tan( X Με απλή αντικατάσταση, εύκολα μπορεί να δειχθεί ότι η σύνθεση δύο τυχαίων μετασχηματισμών της οικογένειας μας δίνει ένα άλλο στοιχείο της. Τα παραπάνω παραδείγματα, αν και τετριμμένα μιας και γνωρίζουμε εκ των προτέρων την γενική λύση των αντίστοιχων ΔΕ, μας φανερώνουν μερικά ποιοτικά χαρακτηριστικά των συμμετριών που ϑα αναζητούμε στα επόμενα κεφάλαια. 1. Οι συμμετρίες εξαρτώνται από μία ή περισσότερες συνεχείς παραμέτρους. Παρόλο που μπορεί κάλλιστα να προκύψουν μεμονωμένες συμμετρίες, όπως για παράδειγμα η X = −x, τις οποίες από εδώ και πέρα ϑα αποκαλούμε διακριτές συμμετρίες, εμείς ϑα ασχοληθούμε με οικογένειες συμμετριών όπως αυτές στα παραδείγματα. 2. Οι συμμετρίες παρουσιάζουν την αλγεβρική δομή ομάδας. Στα δύο παραπάνω παραδείγματα είδαμε πως η σύνθεση δύο συμμετριών μας δίνει μια συμμετρία του ίδιου είδους. Πιο συγκεκριμένα, η τιμή της παραμέτρου της νέας συμμετρίας που προκύπτει είναι το άθροισμα των τιμών των παραμέτρων των δύο συμμετριών που την συνθέτουν. Επιπλέον, για  = 0 παίρνουμε την ταυτοτική απεικόνιση. Συνεπώς, τοπικά τουλάχιστον, γύρω από το ταυτοτικό στοιχείο, το σύνολο των συμμετριών είναι μια ομάδα (βλ. επόμενο εδάφιο). Η τοπική μόνο ισχύ των μετασχηματισμών απορρέει από το γεγονός ότι ϑέλουμε οι μετασχηματισμοί να είναι λείες συναρτήσεις ως προς την παράμετρο πράγμα που δεν περιμένουμε να ισχύει πάντα για όλο τον πραγματικό y x άξονα. Ο μετασχηματισμός (X, Y) = ( 1−x , 1−y ), για παράδειγμα, που βρήκαμε προηγουμένως μπορεί να αναλυθεί σε σειρά Taylor ως προς το  μόνο όταν || < min( x1 , y1 ). Από γεωμετρική σκοπιά ένα σύστημα ΔΕ ορίζει μια υπερεπιφάνεια στον χώρο των εξαρτημένων και ανεξάρτητων μεταβλητών αυτής. Η υπερεπιφάνεια αυτή παραμένει αναλλοίωτη υπό την δράση των συμμετριών αυτής. Συμμετρίες, που τοπικά τουλάχιστον, ϑα έχουν επιπλέον την δομή ομάδας. ´Ολα αυτά μας οδηγούν με φυσικό τρόπο στο ότι, η έννοια της πολλαπλότητας και της ομάδας παίζουν

1.2 Σ ΔΕ

7

κεντρικό ρόλο στην συστηματική και αυστηρά μαθηματική ϑεώρηση του προβλήματος της εύρεσης συμμετριών. Στο επόμενο κεφάλαιο παρουσιάζουμε αυτά τα βασικά μαθηματικά εργαλεία. ..

Πολλαπλότητες, Ομάδες και Α ´ λγεβρες Lie

Στο εδάφιο αυτό είναι συγκεντρωμένα τα βασικά ϑεωρητικά εργαλεία που ϑα χρησιμοποιήσουμε τόσο για την περιγραφή της μεθόδου εύρεσης συμμετριών όσο και για τις μετέπειτα αναλύσεις που ϑα πραγματοποιήσουμε με βάση αυτή. Ξεκινάμε δίνοντας τον ορισμό της πολλαπλότητας. Ο 1.3. Ονομάζουμε n–διάστατη τοπολογική πολλαπλότητα έναν τοπολογικό χώρο Hausdorff M τοπικά περιγραφόμενο από τον Ευκλείδειο χώρο Rn . Είναι δηλαδή εφοδιασμένος με μια αριθμήσιμη συλλογή από ζεύγη (Uα , φα ) με Uα ⊂ M ανοικτά σύνολα και φα : Uα → Vα ομοιομορφισμούς (1 − 1 και επί, συνεχείς απεικονίσεις με συνεχή αντίστροφο) σε ανοικτά και συνεκτικά υποσύνολα Vα ⊂ Rn . Τα ζεύγη αυτά ονομάζονται χάρτες συντεταγμένων ή απλά χάρτες και πρέπει να ικανοποιούν τις παρακάτω ιδιότητες: 1. Τα ανοικτά υποσύνολα καλύπτουν την M: [

Uα = M

α

2. Αν Uα ∩ Uβ 6= ∅ τότε η σύνθεση 1 φβ φ− α : φα (Uα ∩ Uβ ) → φβ (Uα ∩ Uβ )

είναι και αυτή ομοιομορφισμός. Αυτή είναι η συνθήκη συμβατότητας που ϑα πρέπει να ικανοποιείται καθώς μεταβαίνουμε από τον ένα χάρτη στον άλλο. Κάθε τέτοια συλλογή από χάρτες ονομάζεται άτλας της πολλαπλότητας M. Επιπλέον, το γεγονός ότι έχουμε επιλέξει την πολλαπλότητα M να είναι ένας χώρος Hausdorff, δηλαδή αν x, y ∈ M με x 6= y τότε υπάρχουν ανοικτά σύνολα Ux , Uy τέτοια ώστε Ux ∩ Uy = ∅, δηλώνει ότι αν x ∈ Uα , y ∈ Uβ δύο διακριτά σημεία της M, τότε υπάρχουν υποσύνολα Wx ∈ Vα , Wy ∈ Vβ , με φα (x) ∈ Wx και φβ (y) ∈ Wy , τέτοια ώστε 1 −1 φ− α (Wx ) ∩ φβ (Wy ) = ∅. Η τοπολογική πολλαπλότητα αποτελεί τον απλούστερο τύπο πολλαπλότητας. Την εμπλουτίζουμε περισσότερο δίνοντάς της επιπλέον

Τοπολογική Πολλαπλότητα

8

Σ

δομές. ´Ετσι, για παράδειγμα, αν απαιτήσουμε οι χάρτες και η συνϑήκη συμβατότητας να ανήκουν στην κλάση Ck , η πολλαπλότητα ονομάζεται Ck –πολλαπλότητα, αν είναι ομαλές (κλάσης C∞ ), ομαλή ή λεία πολλαπλότητα και τέλος, αν είναι αναλυτικές, αναλυτική πολλαπλότητα. Στη συνέχεια, όπου δεν αναφέρεται ρητά, ϑα ϑεωρούμε ότι η πολλαπλότητά μας είναι λεία. Η έννοια της πολλαπλότητας αποτελεί γενίκευση των εννοιών της καμπύλης και της επιφάνειας στον Ευκλείδειο χώρο. ´Ετσι, ο κύκλος στον R2 δεν είναι παρά μια μονοδιάστατη πολλαπλότητα που μπορεί να περιγραφεί με δύο χάρτες, τους ((−π, π), (cos θ, sin θ)) και ((0, 2π), (cos θ, sin θ)). ´Ενα ακόμη απλούστερο παράδειγμα αποτελεί ο ίδιος ο Ευκλείδειος χώρος Rm που είναι μια m–διάστατη πολλαπλότητα. Πρόκειται για ομαλή πολλαπλότητα που μπορεί να περιγραφεί με έναν μόνο χάρτη, τον ίδιο τον χώρο και την ταυτοτική απεικόνιση. Αντιθέτως, η δισδιάστατη μοναδιαία σφαίρα S 2 δεν μπορεί να καλυφθεί με μόνο ένα χάρτη, χρειαζόμαστε τουλάy x χιστον δύο. Δυό τέτοιοι χάρτες είναι οι (S 2 − (0, 0, 1), ( 1−z , 1−z )) και y x 2 (S − (0, 0, −1), ( 1+z , 1+z )) και αποτελούν, βάση του ορισμού, έναν άτλαντα της πολλαπλότητας S 2 . Η μοναδιαία σφαίρα είναι ένα χαρακτηριστικό παράδειγμα επιφάνειας στον R2 και αποτέλεσε ιστορικά σημείο εκκίνησης για την ανάπτυξη της ϑεωρίας των πολλαπλοτήτων. Συνεχίζουμε με τον αξιωματικό ορισμό της αλγεβρικής δομής της ομάδας. Ομάδα

Ο 1.4. Ονομάζουμε ομάδα G ένα σύνολο από στοιχεία εφοδιασμένα με έναν κανόνα σύνθεσης φ που ικανοποιεί τα παρακάτω αξιώματα: (i) Κλειστότητα: ∀α, β ∈ G , φ(α, β) ∈ G (ii) Προσεταιριστικότητα: ∀α, β, γ ∈ G , φ(α, φ(β, γ)) = φ(φ(α, β), γ) (iii) ´Υπαρξη ουδέτερου στοιχείου: ∃!e ∈ G έτσι ώστε ∀α ∈ G να ισχύει φ(α, e) = φ(e, α) = α (iv) ´Υπαρξη αντιστρόφου: ∀α ∈ G φ(α, α−1 ) = φ(α−1 , α) = e

∃!α−1 ∈ G έτσι ώστε

Π 1.6 (Οι πραγματικοί αριθμοί). Το σύνολο G = R με πράξη την πρόσθεση είναι μια ομάδα. Η πράξη αυτή είναι φανερό ότι είναι προσεταιριστική, το ουδέτερο στοιχείο είναι το 0 και το αντίστροφο κάθε στοιχείου της ομάδας x δίνεται από το στοιχείο −x.

1.2 Σ ΔΕ

9

Π 1.7 (Οι αντιστρέψιμοι πίνακες). Το σύνολο των αντιστρέψιμων τετραγωνικών πινάκων n × n με συντελεστές από το σύνολο των πραγματικών αριθμών R, GL(n, R), εφοδιασμένο με την πράξη του πολλαπλασιασμού των πινάκων είναι μια ομάδα. Πράγματι, η πράξη της ομάδας είναι προσεταιριστική, ουδέτερο στοιχείο είναι ο μοναδιαίος πίνακας I και το αντίστροφο στοιχείο κάθε στοιχείου της ομάδας A δίνεται από τον αντίστοιχο αντίστροφο πίνακα A−1 . ´Οπως είδαμε και στο προηγούμενο εδάφιο, οι συμμετρίες δεν είναι απλά μια ομάδα παραμετρικά δοσμένη. Είναι, επιπλέον, μετασχηματισμοί που δρουν πάνω σε συστήματα ΔΕ και στις λύσεις αυτών, μαθηματικά αντικείμενα που μπορούν να περιγραφούν και με την χρήση πολλαπλοτήτων. Αυτό μας οδηγεί στη σύνδεση της διαφορικής και γεωμετρικής έννοιας της πολλαπλότητας με την αλγεβρική έννοια της ομάδας. Ο 1.5. Μια r–παραμετρική ομάδα Lie είναι μια ομάδα G με την επιπλέον δομή μιας r–διάστατης λείας πολλαπλότητας και την πράξη της ομάδας να είναι συμβατή με αυτή, δηλαδή, η πράξη της ομάδας και η αντιστροφή είναι λείες απεικονίσεις της πολλαπλότητας εξασφαλίζοντας έτσι την ομαλή μετάβαση μεταξύ των χαρτών.

r–παραμετρική ομάδα Lie

Για την ανάλυση που ϑα ακολουθήσει δεν μας είναι απαραίτητη η ολική εικόνα μιας ομάδας Lie παρά τα στοιχεία της γύρω από το ουδέτερο στοιχείο εκπεφρασμένα σε ένα τοπικό σύστημα συντεταγμένων. Ο 1.6. Μια r–παραμετρική τοπική ομάδα Lie αποτελείται από ανοικτά συνεκτικά σύνολα V0 ⊂ V ⊂ Rr που περιέχουν το 0 και δύο λείες απεικονίσεις, μία για τον ορισμό της πράξης της ομάδας

m : V × V → Rr και μία για την αντιστροφή των στοιχείων της

i : V0 → V , με τις παρακάτω ιδιότητες: 1. Προσεταιριστική: Αν x, y, z ∈ V και m(y, z), m(x, y) ∈ V τότε m(x, m(y, z)) = m(m(x, y), z) 2. Ουδέτερο στοιχείο: ∀x ∈ V , m(x, 0) = m(0, x) = x 3. Αντίστροφο στοιχείου: ∀x ∈ V , m(x, i(x)) = m(i(x), x) = 0

r–παραμετρική τοπική ομάδα Lie

10

Σ

Π 1.8. ´Εστω το σύνολο V = {x : |x| < 1} ⊂ R εφοδιασμένο με την πράξη 2xy − x − y m(x, y) = , x, y ∈ V . xy − 1 Με στοιχειώδεις υπολογισμούς μπορεί να δείξει κανείς πως η πράξη αυτή, όπως την ορίσαμε, έχει πράγματι την προσεταιριστική ιδιότητα και ουδέτερο στοιχείο το 0. Μένει να καθορίσουμε την αντίστροφη απεικόνιση λύνοντας την εξίσωση m(x, i(x)) = 0. Η λύση είναι

i(x) =

x 2x − 1

 και ορίζεται για όλα τα x ∈ V0 = x : |x| < 21 ⊂ V (ανοικτό συνεκτικό σύνολο που να περιέχει το 0). Συνεπώς, με βάση τον παραπάνω ορισμό, η πράξη m ορίζει μια καθαρά τοπική ομάδα Lie. τοπική ομάδα μετασχηματισμών

Ο 1.7. Μια τοπική ομάδα μετασχηματισμών πάνω σε μια πολλαπλότητα M αποτελείται από μια (τοπική) ομάδα Lie G , ένα ανοικτό σύνολο U , με {e} × M ⊂ U ⊂ G × M, στο οποίο ορίζεται η δράση της ομάδας, και μια λεία απεικόνιση X : U → M με τα ακόλουθα χαρακτηριστικά: 1. Αν (h, x) ∈ U , (g, X (h, x)) ∈ U

και

(m(g, h), x) ∈ U τότε,

X (g, X (h, x)) = X (m(g, h), x). 2. ∀x ∈ M

X (e, x) = x. 3. Αν (g, x) ∈ U τότε και (i(g), X (g, x)) ∈ U και, σύμφωνα με τα προηγούμενα, X (i(g), X (g, x)) = x Είμαστε τώρα σε ϑέση να ταυτοποιήσουμε τις συμμετρίες μιας ΔΕ με την έννοια που εισαγάγαμε παραπάνω Π 1.9. Με βάση τον παραπάνω ορισμό, η οικογένεια μετασχηματισμών του παραδείγματος 1.5 είναι μία τοπική ομάδα μετασχηματισμών με   x y X (, (x, y)) = , 1 − x 1 − y και πεδίο ορισμού

1 1 U = (, (x, y)) : || < min( , ) ⊂ R × R2 x y

1.2 Σ ΔΕ

11

´Ετσι λοιπόν οι συμμετρίες που αναζητούμε δεν είναι τίποτα άλλο παρά τοπικές ομάδες μετασχηματισμών εκπεφρασμένες σε κατάλληλο σύστημα συντεταγμένων. Τελευταία βασική έννοια που ϑα μας χρειαστεί στην συνέχεια είναι αυτή της άλγεβρας Lie. Ο 1.8. Α ´ λγεβρα Lie g είναι ένας διανυσματικός χώρος, πάνω στο σώμα F, εφοδιασμένος με μια διγραμμική πράξη

[ · , · ] : g × g → g, που ϑα ονομάζουμε μεταθέτη, με τις ακόλουθες ιδιότητες: (i) Αντισυμμετρικότητα: [u, v] = −[v, u] (ii) Ταυτότητα Jacobi: [u, [v, w]] + [v, [w, u]] + [w, [u, v]] = 0

∀u, v ∈ g. Τοπικά, μπορούμε να συνδέσουμε μια ομάδα Lie με μια άλγεβρα Lie. Ο συνδετικός κρίκος για τον συσχετισμό αυτό είναι ο απειροστός γεννήτορας, το κεντρικό εργαλείο για την κατά συμμετρίες ανάλυση των ΔΕ. ..

Διανυσματικά πεδία, ο Απειροστός Γεννήτορας και η επέκταση του

´Εστω M m–διάστατη πολλαπλότητα και γ : I ⊂ R → M μια λεία καμπύλη πάνω σε αυτή. Σε ένα τοπικό σύστημα συντεταγμένων x = (x1 , x2 , . . . , xm ) η καμπύλη γ μπορεί να γραφεί με την βοήθεια m λείων συναρτήσεων ως ~γ(t) = (γ1 (t), γ2 (t), . . . , γm (t)) με t ∈ R. Σε κάθε σημείο x0 = γ(t0 ) της καμπύλης το εφαπτόμενο διάνυσμα δίνεται από την παράγωγο   dγ 1 2 m γ(t ˙ 0) = = γ˙ (t0 ), γ˙ (t0 ), . . . , γ˙ (t0 ) . dt t=t0 Στο επιλεγμένο τοπικό σύστημα συντεταγμένων το τυχαίο εφαπτόμενο διάνυσμα μπορεί να γραφεί στην μορφή

v|x0 = γ˙ 1 (t0 )∂x1 + γ˙ 2 (t0 )∂x2 + · · · + γ˙ m (t0 )∂xm , όπου με ∂xi δηλώνουμε το εφαπτόμενο διάνυσμα της διερχόμενης από το σημείο x0 καμπύλης η οποία μεταβάλλεται μόνο ως προς την κατεύθυνση xi .

Α ´ λγεβρα Lie

12

εφαπτόμενος χώρος

διανυσματικό πεδίο

Σ

Ο 1.9. Σε κάθε σημείο x μιας m–διάστατης πολλαπλότητας M η συλλογή όλων των εφαπτόμενων διανυσμάτων όλων των δυνατών καμπύλων της M που διέρχονται από το σημείο x αποτελεί ένα διανυσματικό χώρο αποκαλούμενο εφαπτόμενο χώρο της M στο σημείο x, TM|x . Σε τοπικό σύστημα συντεταγμένων μια βάση του διανυσματικού χώρου είναι η {∂x1 , ∂x2 , . . . , ∂xm }. Σε κάθε σημείο x μιας πολλαπλότητας M μπορούμε να αντιστοιχίσουμε ένα διάνυσμα v|x από τον αντίστοιχο εφαπτόμενο χώρο TM|x , με το διάνυσμα v|x να μεταβάλλεται κατά συνεχή τρόπο από σημείο σε σημείο. Το πεδίο που κατασκευάζουμε με αυτόν το τρόπο ονομάζεται διανυσματικό πεδίο της M και σε τοπικές συντεταγμένες, x = (x1 , x2 , . . . , xm ), μπορεί να γραφεί ως

v|x = ξ1 (x)∂x1 + ξ2 (x)∂x2 + · · · + ξm (x)∂xm .

Σε μια ομάδα Lie G ο εφαπτόμενος χώρος TG|x σε κάθε σημείο της είναι κάτι παραπάνω από ένα διανυσματικό χώρο, είναι μια άλγεβρα Lie g! Επιπλέον, λόγω της αλγεβρικής δομής της ομάδας Lie αρκεί να βρούμε τον εφαπτόμενο χώρο στο ουδέτερο στοιχείο μόνο. Η άλγεβρα που προκύπτει με αυτό τον τρόπο έχει το ίδιο όνομα με την ομάδα Lie γραμμένη όμως με πεζά γράμματα. Π 1.10. αʹ) Μεταθέσεις: ´Εστω η ομάδα μετασχηματισμών X(, x) = x + . Για να βρούμε την αντίστοιχη άλγεβρα Lie υπολογίζουμε πρώτα το εφαπτόμενο διάνυσμα στο ουδέτερο στοιχείο της ομάδας μετασχηματισμών dX(, x) = 1. d =0 Το εφαπτόμενο αυτό διάνυσμα γράφεται χρησιμοποιώντας την τοπική έκφραση της βάσης του εφαπτόμενου χώρου, ∂x , ως

v | e = ∂x . ´Ετσι, η άλγεβρα που προκύπτει αποτελείται από τα διανύσματα λ∂x , λ ∈ R. βʹ) Αλλαγή κλίμακας: ´Εστω η ομάδα μετασχηματισμών X(, x) = x. ´Ομοια με προηγουμένως, η άλγεβρα, ορίζεται από το εφαπτόμενο διάνυσμα v|e = x∂x .

1.2 Σ ΔΕ

13

γʹ) Στροφές στο επίπεδο: ´Εστω λοιπόν η ομάδα μετασχηματισμών που παράγεται από την ομάδα Lie SO(2), την ομάδα των στροφών στο επίπεδο,

X(, (x, y)) = (cos()x − sin()y, sin()x + cos()y). Το εφαπτόμενο επίπεδο στο ουδέτερο στοιχείο της ομάδος,  = 0, μας δίνει την άλγεβρα Lie so(2). Το εφαπτόμενο διάνυσμα στο σημείο αυτό είναι dX(, (x, y)) = (−y, x). d =0 Το διάνυσμα αυτό αποτελεί βάση της άλγεβρας και γράφεται, χρησιμοποιώντας την βάση του εφαπτόμενου χώρου της πολλαπλότητας, v|e = x∂y − y∂x . δʹ) Μετάθεση και αλλαγή κλίμακας στο επίπεδο: ´Εστω η διπαραμετρική ομάδα μετασχηματισμών X((1 , 2 ), (x, y)) = (1 x + 2 , 1 y + 2 ). Η βάση της άλγεβρας καθορίζεται από τα εφαπτόμενα διανύσματα ∂X = (x, y) ∂1 (1 ,2 )=(1,0) ∂X = (1, 1). ∂ 2 (1 ,2 )=(1,0)

Και είναι η {∂x + ∂y , x∂x + y∂y }. ´Εστω το τοπικό σύστημα συντεταγμένων x = (x1 , x2 , . . . , xm ) και x∗ = X(, x) μια μονοπαραμετρική ομάδα μετασχηματισμών όπου X(0, x) = x. Η σειρά Taylor του μετασχηματισμού γύρω από το  = 0 είναι   x∗ = x + ~ξ(x) + O(2 ), ~ξ = ξ1 (x), ξ2 (x), . . . , ξm (x) . (1.1) Το γραμμικό κομμάτι της (1.1), x + ~ξ(x), ονομάζεται απειροστικός μετασχηματισμός. Από τον τρόπο κατασκευής της σειράς, ο συντελεστής του  δεν είναι τίποτα άλλο παρά το εφαπτόμενο διάνυσμα ∂X ~ στο  = 0, ξ(x) = ∂ (, x) =0 , γεγονός αναμενόμενο μιας και ο εφαπτόμενος χώρος μιας πολλαπλότητας δεν είναι τίποτα άλλο παρά μια γραμμικοποίησή της γύρω από το σημείο αυτό. Το εφαπτόμενο ~ = ξi (x)∂ i ονομάζεται απειροστός γεννήτορας. Ο διάνυσμα X = ~ξ · ∇ x απειροστός γεννήτορας αποτελεί το Α και το Ω της ανάλυσης που ϑα ακολουθήσει.

απειροστικός μετασχηματισμός

απειροστός γεννήτορας

14

Σ

Πραγματικά, ο απειροστικός μετασχηματισμός μπορεί να γραφεί με την βοήθεια του απειροστού γεννήτορα ως x + Xx. Επιπλέον, η σειρά Taylor γράφεται ως

2 x = x + Xx + X2 x + · · · = 2 ∗



 2 2 1 + X + X + · · · x = 2 ∞ X i i X x = eX x (1.2) i! i=0

Το γεγονός αυτό δικαιολογεί και την ονομασία “γεννήτορας”: Αν μας δίνεται ένα διάνυσμα μιας άλγεβρας Lie μπορούμε να κατασκευάσουμε την αντίστοιχη μονοπαραμετρική (τοπική) ομάδα Lie. Η διαδικασία αυτή ονομάζεται εκθετικοποίηση. Π 1.11. αʹ) ´Εστω ο απειροστός γεννήτορας X = ∂x . Κατασκευάζουμε την σειρά υπολογίζοντας τις δυνάμεις Xk και δρώντας έπειτα στην μεταβλητή x.

X = ∂x ,

Xx = 1

X2 = (∂x )2 ,

X2 x = 0

Xk x = 0, k > 2 Σύμφωνα με την (1.2) ο μονοπαραμετρικός μετασχηματισμός είναι x∗ = x +  βʹ) ´Εστω ο απειροστός γεννήτορας X = x∂x . Υπολογίζω τις δυνάμεις Xk και την δράση τους πάνω στην μεταβλητή x.

X = x∂x ,

Xx = x

X2 = X + x2 (∂x )2 ,

X2 x = x

X3 = X + 2x2 (∂x )2 + x3 (∂x )3 ,

X3 x = x

X k x = x, k > 0 ´Ετσι, σύμφωνα με την (1.2) έχουμε

x∗ = x(1 +  +

2 k +···+ + · · · ) = e x 2 k!

Στο επόμενο εδάφιο ϑα δούμε πώς η εκθετικοποίηση μπορεί να πραγματοποιηθεί επιλύοντας ένα κατάλληλο πρόβλημα αρχικών τιμών. Η χρηστικότητα του απειροστού γεννήτορα δεν σταματά εδώ. Ο απειροστός γεννήτορας είναι ο “κοινωνός” της απειροστής μεταβολής

1.2 Σ ΔΕ

που προκαλεί ο αντίστοιχος μετασχηματισμός. Πράγματι, αν F(x) λεία συνάρτηση ο μετασχηματισμός x∗ = X(, x), X(0, x) = x, την μετασχηματίζει στην συνάρτηση F∗ (x∗ ) = F(X(, x)). Η σειρά Taylor αυτής γύρω από το  = 0 είναι dF ∗ ∗ + O(2 ) = F (x ) = F(x) +  d =0 dX F(x) +  F0 (x) + O(2 ) = F(x) + XF(x) + O(2 ) d =0 Τι γίνεται όμως στην περίπτωση που η έκφραση περιέχει και παραγώγους των συναρτήσεων που μετασχηματίζουμε; Αρχικά, ας δούμε τι συμβαίνει με ένα απλό παράδειγμα. Π 1.12. ´Εστω λοιπόν το τοπικό σύστημα συντεταγμένων (x, y) και ο μονοπαραμετρικός μετασχηματισμός

x∗ = X(, (x, y)),

X(0, (x, y)) = x

y∗ = Ψ(, (x, y)),

Ψ(0, (x, y)) = y

(1.3)

, η = dΨ και έστω X = ξ(x, y)∂x + η(x, y)∂y , ξ = dX d =0 d =0 ο απειροστός γεννήτορας αυτού. Σύμφωνα με τον μετασχηματισμό αυτό η παράγωγος y 0 (x) γίνεται y∗ 0 (x∗ ). Η απειροστή μεταβολή αυτού ϑα βρεθεί ως εξής y∗ 0 (x∗ ) = dy dx

dy + dη + O(2 ) dy∗ d(y + η + O(2 )) = = = dx∗ d(x + ξ + O(2 )) dx + dξ + O(2 )

2 +  dη dx + O( )

dξ dη + O(2 ))(1 −  − O(2 )) = dx dx dξ dη dη dξ y0 − y0 + + O(2 ) = y0 + ( − y0 ) + O(2 ) = dx dx dx dx 0 y + η(1) (x, y, y0 ) + O(2 ) 1 +  dξ dx

+ O(2 )

= (y0 + 

d Ας σημειωθεί εδώ πώς με dx δηλώνουμε την ολική παράγωγο. Με ανάλογους υπολογισμούς μπορούμε να βρούμε τους απειροστικούς μετασχηματισμούς και για τις παραγώγους μεγαλύτερης τάξης. ´Ετσι, για την παράγωγο δεύτερης τάξης είναι  η(2) (x, y, y0 , y00 ) = y00 ηy − 3y 0 ξy − 2ξx + ηxx −   y 0 −2ηxy + y 0 −ηyy + y 0 ξyy + 2ξxy + ξxx .

Είναι προφανές ότι καθώς ϑα μεγαλώνει η τάξη, το μέγεθος και η πολυπλοκότητα των εκφράσεων η(k) ϑα αυξάνει εκθετικά. Ωστόσο, επαγωγικά μπορούμε να δώσουμε έναν αναδρομικό τύπο για την η(k) ,

η(k) (x, y, y0 , . . . , y(k) ) =

dη(k−1) dξ(x, y) (0) − y(k) , η = η(x, y). dx dx

15

16

Σ

Μπορούμε έτσι να επεκτείνουμε τον απειροστικό γεννήτορα X, εισάγοντας το διανυσματικό πεδίο

X(k) = ξ∂x + η∂y + η(1) ∂y0 + · · · + η(k) ∂y(k) . Το διάνυσμα αυτό είναι εφαπτόμενο στην διευρυμένη πολλαπλότητα ή Jk , η οποία διάστασης k + 2, ονομαζόμενη χώρος Jet k διάστασης

δέχεται ως τοπικό σύστημα συντεταγμένων

x, y, y0 , . . . , y(k) . Από

την κατασκευή του, το X(k μας δίνει την απειροστική μεταβολή των παραγώγων της y(x) υπό την δράση του μετασχηματισμού (1.3). Η επέκταση του απειροστού γεννήτορα στην γενική περίπτωση μπορεί να διατυπωθεί ως εξής: 1. ´Εστω μια πολλαπλότητα M διάστασης  1 m +mn και ένα τοπικό σύστημα συντεταγμένων αυτής x = x , . . . , x , u1 , . . . , un . 2. ´Εστω επίσης ο μονοπαραμετρικός μετασχηματισμός ∗

xi = Xi (, x), Xi (0, x) = xi , i = 1, 2, . . . , m uj ∗ = Ψj (, x), Ψj (0, x) = uj , j = 1, 2, . . . , n με αντίστοιχο απειροστό γεννήτορα

X = ξi (x)∂xi + ηj (x)∂uj Η επέκταση του απειροστού γεννήτορα X είναι (1)

X(k) = ξi (x)∂xi + ηj (x)∂uj + ηj,i1 ∂u

j,xi1

(k)

+ · · · + ηj,i1 i2 ···ik ∂u

j,xi1 xi2 ···xik

όπου

  (k) (k−1) ηj,i1 i2 ···ik = Dik ηj,i1 i2 ···ik − Dik ξj uj,i1 i2 ···ik , j = 1, 2, . . . , n, il = 1, 2, . . . m, l = 1, 2, . . . , k k > 0 και (0)

ηj

= ηj (x).

Πριν προχωρήσουμε στην χρήση του απειροστού γεννήτορα για την εύρεση των συμμετριών παραθέτουμε τρία βασικά ϑεωρήματα.

1.2 Σ ΔΕ

Σχήμα 1: Marius Sophus Lie (1842 – 1892)

..

Τα ϑεωρήματα του Lie

Αναφερθήκαμε στα προηγούμενα εδάφια σε έννοιες όπως οι ομάδες Lie και οι άλγεβρες Lie. Οι ονομασίες αυτές δεν είναι τυχαίες, έχουν πάρει το όνομα τους από τον πρωτοπόρο Νορβηγό μαθηματικό Marius Sophus Lie. Ο Lie ήταν αυτός που ϑεμελίωσε την κατά συμμετρίες ανάλυση των ΔΕ συνδέοντας έτσι την άλγεβρα με την διαφορική γεωμετρία. Πριν συνεχίσουμε με την μέθοδο καθεαυτή, παρουσιάζουμε τα τρία ϑεωρήματα του Lie, όπως αναφέρονται στην σύγχρονη βιβλιογραφία. Π  Θ  L. Υπάρχει μια παραμετροποίηση τ() έτσι ώστε η ομάδα Lie μετασχηματισμών ~x∗ = X(, ~x) να είναι ισοδύναμη με την λύση του προβλήματος αρχικών τιμών του συστήματος διαφορικών εξισώσεων πρώτης τάξης

d~x∗ = ξ(~x∗ ) dτ με ~x∗ = ~x, όταν τ = 0. Πιο συγκεκριμένα,

Z τ() =

Γ ( 0 ) d 0

0

όπου

∂m(α, β) . Γ () = ∂β (α,β)=(−1 ,)

17

18

Σ

Το ϑεώρημα αυτό μας δίνει μία εναλλακτική μέθοδο για την εκϑετικοποίηση ενός απειροστού γεννήτορα μετατοπίζοντας έτσι το πρόβλημα από την κατασκευή μιας σειράς στην επίλυση ενός προβλήματος αρχικών τιμών. Δ  Θ  L. Ο μεταθέτης δύο απειροστικών γεννητόρων μιας r–παραμετρικής ομάδας Lie μετασχηματισμών είναι επίσης ένας απειροστικός γεννήτορας, πιο συγκεκριμένα   Xα , Xβ = Cγαβ Xγ , αβγ = 1, 2, . . . , r, σταθερές δομής

όπου οι συντελεστές Cγαβ είναι σταθερές κι ονομάζονται σταθερές δομής. Τ  Θ  L. Οι σταθερές δομής, που καθορίζονται από τις μεταθετικές σχέσεις, ικανοποιούν τις σχέσεις

Cγαβ = −Cγβα Cραβ Cδργ + Cρβγ Cδρα + Cργα Cδρβ = 0. Τα δύο τελευταία ϑεωρήματα συνδέουν τους απειροστούς γεννήτορες με την ϑεωρία των αλγεβρών Lie. Κλείνοντας την παρένθεση αυτή, συνεχίζουμε με την διαδικασία εύρεσης συμμετριών. .. Πώς βρίσκουμε τις σημειακές συμμετρίες μιας ΔΕ Σύμφωνα με τους ορισμούς που δώσαμε στην αρχή του κεφαλαίου (1.1 & 1.2), αναζητούμε μετασχηματισμούς με την χαρακτηριστική ιδιότητα να διατηρούν αναλλοίωτη την μορφή του υπό ανάλυση συστήματος ΔΕ. Στο κεφάλαιο αυτό ϑα περιοριστούμε σε σημειακούς μετασχηματισμούς μόνο, δηλαδή, μετασχηματισμούς των εξαρτημένων και ανεξάρτητων μεταβλητών. Στο κεφάλαιο 1.2.7 αναφέρουμε τις πιο γνωστές γενικεύσεις αυτής της μεθόδου. ~ , u) = 0 m ανεξάρτητων με´Εστω λοιπόν, το σύστημα k τάξης ∆(x ταβλητών, x = (x1 , x2 , . . . , xm ), και n εξαρτημένων, u = (u1 , u2 , . . . , un ). ´Ενας τυχαίος μετασχηματισμός των μεταβλητών αυτών είναι

yi = Xi (x, u), i = 1, 2, . . . , m υj = Ψj (x, u), j = 1, 2, . . . , n. Χρησιμοποιώντας τον, λαμβάνοντας υπ´ όψιν και το ίδιο το σύστη~ , υ) = 0 το οποίο ονομάζουμε μα, προκύπτει ένα νέο σύστημα Σ(y συνθήκη συμμετρίας. Είναι προφανές ότι οι συνθήκες που πρέπει να ικανοποιούν οι συναρτήσεις X, Ψ έτσι ώστε να αντιστοιχούν σε συμμετρίες του συστήματος είναι εξίσου, αν όχι περισσότερο, δύσκολο να βρεθούν.

1.2 Σ ΔΕ

Π 1.13. ´Εστω η ΣΔΕ πρώτης τάξης

dy = ω(x, y) dx σύμφωνα με όσα έχουν λεχθεί, η συνθήκη συμμετρίας για την παραπάνω εξίσωση είναι

dy∗ = ω(x∗ , y∗ ) όταν ∗ dx

dy = ω(x, y). dx

Σύμφωνα με τους μετασχηματισμούς και χρησιμοποιώντας και τον κανόνα της αλυσίδας, η παράγωγος είναι

Ψx + y0 Ψy dy∗ = . dx∗ Xx + y0 Xy Κατά συνέπεια η συνθήκη συμμετρίας γίνεται

Ψx + y0 Ψy = ω(X, Ψ) όταν Xx + y 0 Xy ή

dy = ω(x, y) dx

Ψx + ω(x, y)Ψy = ω(X, Ψ). Xx + ω(x, y)Xy

Αυτό σημαίνει ότι για να βρούμε τις συμμετρίες της εξίσωσης ϑα πρέπει να λύσουμε μία ΜΔΕ και μάλιστα υποκαθορισμένη (μία εξίσωση για δύο άγνωστες συναρτήσεις). Μόνο στην περίπτωση ω = 0 μπορούμε να βρούμε την γενική λύση της παραπάνω ΜΔΕ. Τότε, ανάγεται στην Ψx = 0 και Xx 6= 0. Δηλαδή, ο μετασχηματισμός του y∗ εξαρτάται μόνο από την μεταβλητή y ενώ ο μετασχηματισμός του x∗ και από τις δύο μεταβλητές. Αποτέλεσμα που δικαιολογείται πλήρως από το γεγονός ότι η λύση της y0 = 0 είναι η σταθερή συνάρτηση y = c που δεν επηρεάζεται από μεταβολές της μεταβλητής x και επιπλέον, για οποιαδήποτε Ck (R), k > 0, συνάρτηση f(x) η ποσότητα f(c) είναι επίσης λύση της εξίσωσης. Η ευφυής ιδέα του Lie στο κρίσιμο αυτό σημείο ήταν αντί να προσπαθήσει να λύσει την συνθήκη συμμετρίας να την γραμμικοποιήσει! Αυτό το πέτυχε με το να περιοριστεί σε ομάδες μετασχηματισμών εξαρτώμενες από συνεχείς παραμέτρους, δηλαδή μονοπαραμετρικές ομάδες Lie. Αντικαθιστώντας τον απειροστικό μετασχηματισμό αυτών στη συνθήκη συμμετρίας, λαμβάνοντας πάντα υπ´ όψιν και το ίδιο το σύστημα, παίρνουμε την γραμμικοποιημένη συνθήκη συμμετρίας. Από την συνθήκη αυτή, επειδή πρέπει να ισχύει για κάθε τιμή των παραγώγων των ανεξάρτητων μεταβλητών, προκύπτει ένα υπερκαθορισμένο σύστημα γραμμικών ΜΔΕ ονομαζόμενο καθοριστικές εξισώσεις.

19

20

Σ

Αυτό που πέτυχε ο Lie με αυτόν τον τρόπο ήταν να μεταθέσει το πρόβλημα από τις ομάδες Lie (παραμετρική ομάδα μετασχηματισμών) στις άλγεβρες Lie ( απειροστό γεννήτορα). Επιπλέον, σύμφωνα με αυτά που παραθέσαμε στα προηγούμενα εδάφια, η γραμμική συνϑήκη συμμετρίας μπορεί να προκύψει από την δράση κατάλληλης επέκτασης του απειροστού γεννήτορα, πάντα λαμβάνοντας υπ´ όψιν και το σύστημα μας. Συγκεκριμένα, Ο 1.10. ´Εστω το σύστημα ΔΕ k τάξης,

∆(x, u) = 0, x = (x1 , x2 , . . . , xm ), u = (u1 , u2 , . . . , un ). Ο απειροστός γεννήτορας

X = ξi (x, u)∂xi + ηj (x, u)∂uj , i = 1, 2, . . . , m, j = 1, 2, . . . , n Σημειακή συμμετρία

ονομάζεται σημειακή συμμετρία του συστήματος αν και μόνο άν (k) X ∆ =0 ∆=0

Το σύνολο όλων των σημειακών συμμετριών του συστήματος αποτελούν, σύμφωνα και με το δεύτερο και τρίτο ϑεώρημα του Lie, μια άλγεβρα Lie. Από γεωμετρική σκοπιά, μια συμμετρία διατηρεί αναλλοίωτη την υποπολλαπλότητα που ορίζει ένα σύστημα ΔΕ ∆ = 0 μέσα σε μια πολλαπλότητα διάστασης m + n. Η διαδικασία εύρεσης των συμμετριών ενός συστήματος, παρότι αλγοριθμική, παρουσιάζει τεχνικές δυσκολίες. Πράγματι, οι εκφράσεις που παράγονται από την επέκταση του απειροστού γεννήτορα γίνονται όλο και πιο σύνθετες καθώς η τάξη αυξάνεται και το προκύπτον καθοριστικό σύστημα μπορεί εύκολα να περιέχει εκατοντάδες ή και χιλιάδες εξισώσεις. Είναι έτσι προφανές ότι η εύρεση των συμμετριών ενός συστήματος με το χέρι είναι μια επίπονη και χρονοβόρα διαδικασία επιρρεπής σε σφάλματα. Χαρακτηριστικό παράδειγμα το σύστημα των μαγνητοϋδροδυναμικών εξισώσεων από την ηλεκτρομαγνητική ϑεωρία του Maxwell,

ρt = −∇ · (ρ~υ)     1 1~2 ~ ~ ~υt = −(~υ · ∇)~υ − ∇ p + H − ( H · ∇ )H ρ 2 ~ t = (H ~ · ∇)~υ − (~υ · ∇)H ~ −H ~ ∇ · ~υ H ~ =0 ∇·H pt = −kp(∇ · ~υ) − (~υ · ∇)p

1.2 Σ ΔΕ

όπου τόσο οι βαθμωτές συναρτήσεις ρ, p όσο και οι διανυσματικές H, υ εκφράζονται συναρτήσει των μεταβλητών x, y, z, t. ´Εχει ειπωθεί ότι για το καθορισμό των συμμετριών του παραπάνω συστήματος με το χέρι χρειάστηκε ένας ολόκληρος χρόνος (Dimas and Tsoubelis (2005))! Για το λόγο αυτό η χρήση των συμμετριών είχε, για πολλά χρόνια περιοριστεί σε βαθμωτές ΔΕ χαμηλής σχετικά τάξης. Με την ανάπτυξη όμως των προσωπικών υπολογιστών και την εμφάνιση στο προσκήνιο όλο και πιο αναπτυγμένων προγραμμάτων συμβολικών υπολογισμών το τεχνικό αυτό εμπόδιο τείνει να εξαλειφθεί (βλ. κεφ. 2 & 3). Π 1.14. ´Εστω η ΣΔΕ

y000 = y2 (x). Η τρίτη επέκταση του απειροστού γεννήτορα

X = ξ(x, y)∂x + η(x, y)∂y είναι

 X(3) = ξ(x, y)∂x + η(x, y)∂y + ηx − y0 y0 ξy + ξx − ηy ∂y0 +   y00 ηy − 3y0 ξy − 2ξx + ηxx − y0 y0 −ηyy + y0 ξyy + 2ξxy +  ξxx − 2ηxy ) ∂y00 +   2 ηxxx − 3y00 ξy + y000 ηy − 4y0 ξy − 3ξx +   3y00 ηxy + y0 ηyy − 2y0 ξyy − 3ξxy − ξxx −    y0 y0 y0 y0 ξyyy + 3ξxyy − ηyyy + ξxxy − 3ηxyy + ξxxx −  3ηxxy ∂y000 Δρώντας με τον παραπάνω τελεστή στην εξίσωση, αντικαθιστώντας συνάμα όπου y000 το y2 , καταλήγουμε στη συνθήκη συμμετρίας από την οποία προκύπτει το ακόλουθο σύστημα καθοριστικών εξισώσεων,

ξxxx = 0 ηyy = 0 ξy = 0 ηxy − ξxx = 0 y2 ηy − 3y2 ξx + ηxxx − 2yη = 0. Η λύση του συστήματος είναι

ξ(x, y) = c1 − c2 η(x, y) = c2 y.

x 3

21

22

Σ

Συγκεντρωτικά, οι σημειακές συμμετρίες της εξίσωσης δίνονται από τον απειροστό γεννήτορα

x X = c1 ∂x + c2 (y∂y − ∂x ) 3 και ορίζουν την δισδιάστατη άλγεβρα Lie με βάση X1 = ∂x , X2 = y∂y − 3x ∂x . Π 1.15 (Η εξίσωση της ϑερμότητας). Στο παράδειγμα αυτό ϑα αναζητήσουμε τις σημειακές συμμετρίες της εξίσωσης της ϑερμότητας. ´Εστω λοιπόν η ΜΔΕ

ut = uxx . Στην περίπτωση αυτή ο απειροστός γεννήτορας έχει την μορφή

X = ξ1 (x, t, u)∂x + ξ2 (x, t, u)∂t + η(x, t, u)∂u και το καθοριστικό σύστημα που προκύπτει είναι

ξ2x = 0 ξ2u = 0 ξ1u = 0 ηuu = 0 ηxx − ηt = 0 ξ2t − 2ξ1x = 0 ξ1t + 2ηxu − ξ1xx = 0. Λύση του, οι συναρτήσεις

x ξ1 (x, t, u) = c2 + c3 xt + c4 + c5 t 2 2 ξ (x, t, u) = c1 + t (c2 + c3 t)  1  η(x, t, u) = − u 2c3 t + c3 x2 + 2c5 x − 4c6 + F1 (x, t), F1t = F1xx 4 Στην περίπτωση αυτή, η άλγεβρα των συμμετριών είναι απειροδιάστατη. Αποτελείται δε, από μια 6–διάστατη πεπερασμένη υποάλγεβρα με βάση

X 1 = ∂x X 2 = ∂t X3 = u∂u X4 = 2t∂x − xu∂u X5 = x∂x + 2t∂t X6 = 4xt∂x + 4t2 ∂t − u(x2 + 2t)∂u

(1.4)

1.2 Σ ΔΕ

και μια απειροδιάστατη υποάλγεβρα με βάση

X∞ = F1 (x, t)∂u , F1t = F1xx .

(1.5)

Η συμμετρία αυτή δεν δηλώνει τίποτα άλλο παρά την γραμμικότητα της εξίσωσης. Πραγματικά, εκθετικοποιώντας την συμμετρία αυτή, επιλύοντας το πρόβλημα αρχικών τιμών

du∗ = X∞ (x∗ , t∗ , u∗ )u = F1 (x∗ , t∗ ), u∗ (0) = u, d οδηγούμαστε στον μετασχηματισμό u∗ = u + F1 . Στο τελευταίο παράδειγμα είδαμε ότι η άλγεβρα των συμμετριών μπορεί να είναι και άπειρης διάστασης. Τέτοιου είδους άλγεβρες εμφανίζονται σε δύο κατηγορίες, 1. ´Οταν οι αυθαίρετες συναρτήσεις δεσμεύονται από ΔΕ. Στην περίπτωση αυτή είτε το υπό εξέταση σύστημα είναι γραμμικό είτε μπορεί να γραμμικοποιηθεί, με κατάλληλο μετασχηματισμό (βλ. επόμενο παράδειγμα). 2. ´Οταν οι αυθαίρετες συναρτήσεις δεν έχουν δεσμεύσεις. Τότε οι συμμετρίες αντιστοιχούν σε ελευθερίες βαθμίδας του υπό εξέταση συστήματος. Π 1.16 (Γραμμικοποίηση ΔΕ). ´Εστω η εξίσωση του Burgers σε μορφή δυναμικού 1 ut = uxx − u2x . 2 οι συμμετρίες της είναι

X 1 = ∂x X2 = ∂t X3 = u∂u X4 = t∂x + x∂u

(1.6)

X5 = x∂x + 2t∂t X6 = 2xt∂x + 2t2 ∂t + (x2 + 2t)∂u X∞ = eu/2 F1 (x, t)∂u , F1t = F1xx Συγκρίνοντας τις συμμετρίες 1.4, 1.5 και 1.6 παρατηρούμε ότι είναι όμοιες. Επιπλέον, η άλγεβρα X∞ και για τις δύο εξισώσεις σχετίζεται με την εξίσωση της ϑερμότητας. Αυτό μας οδηγεί στο να αναζητήσουμε έναν μετασχηματισμό u∗ = U(x, t, u) έτσι ώστε eu/2 ∂u u∗ = 1. ´Ενας τέτοιος μετασχηματισμός είναι ο u∗ = −2e−u/2 . Με χρήση του μετασχηματισμού αυτού, η εξίσωση του Burgers μετάτρεπεται στην εξίσωση της ϑερμότητας. Ο μετασχηματισμός αυτός δεν είναι άλλος από τον γνωστό μετασχηματισμό Cole-Hopf που συνδέει λύσεις της εξίσωσης του Burgers με την εξίσωση της ϑερμότητας.

23

24

Σ

Τα οφέλη των συμμετριών δεν περιορίζονται μόνο στην πιθανή γραμμικοποίηση εξισώσεων. ´Εχοντας βρει τις συμμετρίες ενός συστήματος ξεκινά η καθαρά ερευνητική δουλειά, η εκμετάλλευση αυτών για την μεθοδική ανάλυση του υπό εξέταση συστήματος. Στο επόμενο εδάφιο παραθέτουμε τρεις διαφορετικούς τρόπους για την κατασκευή λύσεων από τις σημειακές συμμετρίες. .. Κατασκευή λύσεων μέσω των συμμετριών μιας ΔΕ Η γνώση των συμμετριών ενός συστήματος ΔΕ είναι ένα πολύτιμο εργαλείο. Επειδή είναι εσωτερικό χαρακτηριστικό του συστήματος χαρακτηρίζει ως συνέπεια και τις λύσεις αυτού. Στα εδάφια που ακολουθούν, παρουσιάζουμε τις τρεις πιο γνωστές μεθόδους κατασκευής λύσεων με την βοήθεια των συμμετριών. Κατασκευή λύσεων από γνωστές Η μέθοδος αυτή βασίζεται στην ιδιότητα των συμμετριών να μπορούν να απεικονίζουν λύσεις ενός συστήματος σε λύσεις του ιδίου, όχι όμως απαραίτητα διαφορετικές. ´Εχοντας στα χέρια μας μια συμμετρία του υπό εξέταση συστήματος μπορούμε, μέσω της εκθετικοποίησης, να βρούμε την αντίστοιχη μονοπαραμετρική ομάδα μετασχηματισμών. Με αφετηρία τώρα μια λύση του συστήματος μπορούμε να κατασκευάσουμε πιο σύνθετες χρησιμοποιώντας τον μετασχηματισμό αυτό. Ακόμη και μια τετριμμένη λύση του συστήματος αρκεί ως αφετηρία. Ωστόσο, η λύση που επιλέξαμε δεν πρέπει να είναι σταθερό σημείο του μετασχηματισμού. Είναι προφανές ότι με αφετηρία μια τέτοια λύση δεν πρόκειται να οδηγηθούμε σε καινούργιες. Π 1.17. Είδαμε στο παράδειγμα 1.14 πώς οι συμμετρίες της ΣΔΕ y000 = y2 ορίζουν την άλγεβρα X1 = ∂x , X2 = y∂y − 3x ∂x . Βρίσκω τους μονοπαραμετρικούς μετασχηματισμούς που ορίζουν τα στοιχεία της βάσης λύνοντας τα προβλήματα αρχικών τιμών

dx∗ = 1, x∗ (0) = x d dy∗ = 0, y∗ (0) = y d και

dx∗ x∗ = − , x ∗ (0 ) = x d 3 dy∗ = y∗ , y∗ (0) = y. d

1.2 Σ ΔΕ

´Ετσι, προκύπτουν οι μετασχηματισμοί

x∗ () = x +  y∗ () = y και

x∗ () = −1/3 x y∗ () = y. Με απλούς υπολογισμούς, μπορούμε να δούμε ότι η συνάρτηση y(x) = −60x−3 είναι λύση της εξίσωσης. Χρησιμοποιώντας τον πρώτο μετασχηματισμό κατασκευάζουμε έτσι τις λύσεις y(x) = −60(x + c)−3 . Από την ϑεωρία των ΣΔΕ τέτοιου είδους εξισώσεις ονομάζονται αυτόνομες. Γεγονός που δικαιολογεί τις λύσεις που βρήκαμε. Αυτή δεν είναι μια τυχαία περίπτωση, οι περισσότερες τεχνικές επίλυσης ΣΔΕ που μάθαμε στα πρώτα φοιτητικά μας χρόνια υποκρύπτουν από πίσω κάποια συμμετρία. Η άλλη συμμετρία, όμως, δεν μας προσφέρει κάτι καινούργιο αφού ο μετασχηματισμός κρατά αναλλοίωτη την συνάρτηση:

y∗ = (−60(1/3 x∗ )−3 ) = (−60−1 (x∗ )−3 ) = −60(x∗ )−3 . Κανονικές συντεταγμένες ´Εστω η σημειακή συμμετρία X = ξi (x, y)∂xi + ηj (x, y)∂yj . Ονομάζουμε κανονικές συντεταγμένες (r, s), ri = ri (x, y), sx = sj (x, y) ένα νέο σύνολο συντεταγμένων στο οποίο η σημειακή συμμετρία παίρνει την απλή μορφή X = ∂s1 + · · · + ∂sn . Δηλαδή, στο καινούργιο σύστημα συντεταγμένων το σύστημα των ΔΕ δεν εξαρτάται από τις άγνωστες συναρτήσεις παρά μόνο από τις παραγώγους αυτών. Και συνεπώς ϑέτοντας φj = sj0 επιτυγχάνουμε να υποβαθμίσουμε το σύστημα κατά μία τάξη. Την διαδικασία μπορούμε να την επαναλάβουμε και στο ανηγμένο σύστημα που προέκυψε, εφόσον έχει συμμετρίες που μπορούμε να εκμεταλλευτούμε με αυτό τον τρόπο. Π 1.18. ´Εστω η γραμμική ΣΔΕ   3 00 − 2x y0 + 4y. y = x Η εξίσωση αυτή έχει μια μόνο σημειακή συμμετρία, X = y∂y . Αν (r, s) ένα άλλο σύστημα συντεταγμένων, η συμμετρία σε αυτό παίρνει την μορφή X∗ = ξ(r, s)∂r + η(r, s)∂s όπου ξ = Xr(x, y) = yry και η(r, s) = Xs(x, y) = ysy . Για να αποτελούν οι συντεταγμένες (r, s) ένα κανονικό σύνολο συντεταγμένων ϑα πρέπει yry = 0 και ysy = 1.

25

26

Σ

Μια επιλογή είναι η (r, s) = (x, ln|y|). Σε αυτό το σύστημα συντεταγμένων η εξίσωση γράφεται   3 2 00 s = − 2r s0 + 4 − s0 . r Θέτοντας τώρα όπου s0 (r) = φ(r) προκύπτει η εξίσωση Ricatti   3 0 φ = − 2r φ + 4 − φ2 , r με γενική λύση 2r

φ(r) = Και επειδή φ = s0 = σης είναι

y0 y,

2

er





2 er

− c1  . r2 − 1 + c1

η γενική λύση της αρχικής γραμμικής εξίσω2

y(x) = c1 (x2 − 1) + c2 e−x . Λύσεις ομοιότητας Η εύρεση κανονικών συντεταγμένων για την αναγωγή ενός συστήματος χρησιμοποιείται κυρίως στις ΣΔΕ. Για την αναγωγή ΜΔΕ χρησιμοποιούμε τις λύσεις ομοιότητας. Ονομάζουμε λύσεις ομοιότητας ένα υποσύνολο των λύσεων ενός συστήματος το οποίο παραμένει αναλλοίωτο υπό την δράση κάποιας από τις συμμετρίες του. Δηλαδή, αν ∆ = 0 είναι ένα σύστημα διαφορικών εξισώσεων με m ανεξάρτητες μεταβλητές x = (x1 , x2 , . . . , xm ), n άγνωστες συναρτήσεις αυτών u = (u1 , u2 , . . . , un ) και X συμμετρία αυτού , τότε, για να αποτελεί μια λύση του συστήματος, uj = Fj (x), λύση ομοιότητας ϑα πρέπει X(uj = Fj (x)) u =F (x) = 0. j

j

Η παραπάνω συνθήκη ονομάζεται συνθήκη αναλλοίωτης επιφάνειας. Η συνθήκη αναλλοίωτης επιφάνειας αποτελείται από γραμμικές ΜΔΕ. Η λύση αυτής φανερώνει τον τρόπο που πρέπει να συνδυάσουμε τις μεταβλητές για να υποβαθμίσουμε την διάσταση του συστήματος και εντοπίζονται στα ορίσματα των αυθαίρετων συναρτήσεων που περιέχονται στη λύση. Οι καινούργιες μεταβλητές που προκύπτουν με αυτόν τον τρόπο ονομάζονται μεταβλητές ομοιότητας. Τέλος, για να καθορίσουμε τις αυθαίρετες συναρτήσεις, αντικαθιστούμε τις λύσεις ομοιότητας στο αρχικό σύστημα υποβαθμίζοντας έτσι την διάστασή του. Π 1.19. ´Εστω η εξίσωση της ϑερμότητας,

ut = uxx ,

1.2 Σ ΔΕ

μια σημειακή συμμετρία της είναι η X5 = x∂x + 2t∂t . Η συνθήκη αναλλοίωτης επιφάνειας είναι X5 (u = F(x, t)) u=F(x,t) = 0 ⇒ xFx + 2tFt = 0. 2

Η λύση της γραμμική αυτής ΜΔΕ είναι η F(x, t) = F ( xt ). Σύμφωνα με 2

αυτά που αναφέραμε η μεταβλητή ομοιότητας είναι ζ = xt . Αντικαθιστώντας τώρα την λύση που βρήκαμε στην εξίσωση της ϑερμότητας πετυχαίνουμε να υποβαθμίσουμε την εξίσωση και από μία ΜΔΕ να καταλήξουμε στην ΣΔΕ 4ζF 00 + (2 + ζ)F 0 = 0. Τέλος, η γενική λύση αυτής είναι

√  ζ F (ζ) = c2 + c1 Erf 2 και κατά συνέπεια, η λύση ομοιότητας για την συμμετρία που επιλέξαμε είναι   |x| √ . u(x, t) = c2 + c1 Erf 2 t ..

Κατά συμμετρίες ανάλυση ΠΑΣΤ

Είδαμε στα προηγούμενα εδάφια πώς μπορούμε να βρούμε τις σημειακές συμμετρίες ενός συστήματος και πώς να τις εκμεταλλευτούμε για την εύρεση λύσεων. Στο εδάφιο αυτό ϑα δούμε πώς μπορούμε να επεκτείνουμε την χρηστικότητα των συμμετριών και σε προβλήματα αρχικών–συνοριακών τιμών. Σε ένα ΠΑΣΤ λοιπόν, οι συμμετρίες δεν πρέπει να σέβονται μόνο το σύστημα των διαφορικών εξισώσεων, αλλά επιπλέον, να διατηρούν αναλλοίωτες τις συνοριακές συνθήκες, λαμβάνοντας υπ´ όψιν αυτές και το σύνορο στο οποίο ισχύουν, όπως επίσης και να διατηρούν αναλλοίωτα και τα ίδια τα σύνορα. Π 1.20.

αʹ) ´Εστω το πρόβλημα αρχικών τιμών

ut = uxx , t > 0, x ∈ R u(x, 0) = f(x), x ∈ R Οι σημειακές συμμετρίες της εξίσωσης της ϑερμότητας έχουν βρεθεί παραπάνω ( βλ. (1.4) και (1.5)). Επιλέγουμε ένα τυχαίο γραμμικό συνδυασμό της πεπερασμένης υποάλγεβρας

X = αX1 + βX2 + γX3 + δX4 + κX5 + λX6 .

27

28

Σ

Κατ´ αρχάς βρίσκουμε ποιες από τις συμμετρίες σέβονται το σύνορο t = 0:   X(t = 0)|t=0 = 0 ⇒ β + 2κt + 4λt2 |t=0 = 0 ⇒ β = 0. ´Επειτα, οι υπόλοιπες συμμετρίες ϑα πρέπει να σέβονται την αρχική συνθήκη: X(u = f(x)) t=0,u(x,0)=f(x) = 0 ⇒  −αf0 + γu − δ(xu + 2tf0 ) − κxf0 t=0,u(x,0)=f(x) −   0 2 λ 4xtf + u(x + 2t) =0⇒ t=0,u(x,0)=f(x) 0

− αf + γf − δxf − κxf0 − λx2 f = 0. (1.7) Η λύση της παραπάνω ΣΔΕ είναι

f(x) = c1 e



x(2δκ−2αλ+κλx) 2κ2

(α + κx)

αδκ+γκ2 −α2 λ κ3

, c1 = σταθ..

Αυτό δηλώνει ότι με τις πέντε εναπομείνασες συμμετρίες μπορούμε να εξετάσουμε μια υποκατηγορία προβλημάτων αρχικών τιμών για την εξίσωση της ϑερμότητας,

ut = uxx , t > 0, x ∈ R u(x, 0) = c1 e



x(2δκ−2αλ+κλx) 2κ2

(α + κx)

αδκ+γκ2 −α2 λ κ3

,x ∈ R

και όχι το γενικό πρόβλημα. Γεγονός που δεν πρέπει να μας προκαλεί έκπληξη, αφού η έννοια της συμμετρίας αξιωματικά προσπαθεί να φέρει στην επιφάνεια την εσωτερική δομή ενός αντικειμένου, δομή που σε ένα αφηρημένο γενικό σύνολο δεν υφίσταται. βʹ) ´Εστω τώρα το ΠΑΣΤ για την εξίσωση της ϑερμότητας,

ut = uxx , t > 0, A < x < B, A, B < ∞ u(x, 0) = f(x), A < x < B u(A, t) = g(t), u(B, t) = h(t), t > 0. Είδαμε στο προηγούμενο παράδειγμα πώς οι συμμετρίες {X1 , X3 , X4 , X5 , X6 } σέβονται το σύνορο t = 0. Μένει να δούμε τι δεσμεύσεις μας υπαγορεύουν τα υπόλοιπα τμήματα του συνόρου, x = A και x = B,

X(x = A)|x=A = 0 ⇒ (α + 2δt + κx + 4λxt)|x=A = 0 ⇒ α + 2δt + κA + 4λAt = 0 ⇒ α = −κA & δ = −2λA X(x = B)|x=B = 0 ⇒ (α + 2δt + κx + 4λxt)|x=B = 0 ⇒ α + 2δt + κB + 4λBt = 0 ⇒ α = −κB & δ = −2λB

1.2 Σ ΔΕ

Επειδή A 6= B, για να ισχύουν οι παραπάνω δύο συνθήκες ϑα πρέπει α = κ = δ = λ = 0. Η μόνη συμμετρία που σέβεται το σύνορο του προβλήματος είναι η u∂u . Για να σέβεται και τις συνοριακές συνθήκες ϑα πρέπει

u∂u (u = f(x))|t=0,u(x,0)=f(x) = 0 ⇒ f = 0 u∂u (u = g(t))|x=A,u(A,t)=g(t) = 0 ⇒ g = 0 u∂u (u = h(t))|x=B,u(B,t)=h(t) = 0 ⇒ h = 0. Στο πρόβλημα αυτό οι συμμετρίες δεν βοήθησαν, μόνο το πρόβλημα

ut = uxx , t > 0, A < x < B, A, B < ∞ u(x, 0) = 0, A < x < B u(A, t) = u(B, t) = 0, t > 0 επιδέχεται σημειακή συμμετρία, την u∂u . Η λύση του, λόγω της μοναδικότητας του προβλήματος, είναι η μηδενική συνάρτηση. γʹ) Παρόλο που δεν μπορούμε να λύσουμε το πρόβλημα αρχικών τιμών γενικά, στην περίπτωση των γραμμικών εξισώσεων μπορούμε να εξετάσουμε το πρόβλημα αρχικών τιμών για την ϑεμελιώδη λύση της εξίσωσης. ´Ετσι, για την περίπτωση της εξίσωσης της ϑερμότητας έχουμε το πρόβλημα

ut = uxx , t > 0, x ∈ R u(x, 0) = δ(x), x ∈ R, όπου δ(x) η συνάρτηση δέλτα του Dirac. Η ανάλυση μέχρι την συνθήκη (1.7) είναι ακριβώς η ίδια. Θέτοντας όπου f = δ προκύπτει η παρακάτω εξίσωση για την συνοριακή συνθήκη του προβλήματος μας,

−αδ0 (x) + γδ − µxδ(x) − κxδ0 (x) − λx2 δ(x) = 0. Η δ(x) δεν είναι μια απλή συνάρτηση, είναι μια κατανομή. Από τις βασικές ιδιότητες των κατανομών έχουμε ότι

hδ0 (x), φ(x)i = φ(0), hxδ0 (x), φ(x)i = hδ0 (x), xφ(x)i = −hδ(x), (xφ(x))0 i = − hδ(x), φ(x)i − hδ(x), xφ0 (x)i = −hδ(x), φ(x)i, με φ(x) κατάλληλη ελεγκτική συνάρτηση. Σύμφωνα με τα παραπάνω, η εξίσωση παίρνει την μορφή

−αδ0 (x) + (γ + κ)δ(x) = 0.

29

30

Σ

Από την συνθήκη αυτή συνάγουμε ότι α = 0 και γ = −κ. Συνεπώς, κάθε γραμμικός συνδυασμός των συμμετριών {2t∂t − xu∂x , x∂x + 2t∂t − u∂u , xtu∂x + 4t2 ∂t − u(x2 + 2t)∂u } είναι συμμετρία του προβλήματος. Με την βοήθεια της συμμετρίας xtu∂x + 4t2 ∂t − u(x2 + 2t)∂u προκύπτει η λύση ομοιότητας x2

e − 4t F √ u(x, t) = x

t x



και η ΔΕ ανάγεται στην ΣΔΕ

 t 3F (ζ) + 4ζ 3F 0 + ζF 00 = 0, ζ = . x Η γενική της λύση είναι

c c F (ζ) = √1 + 3/2 2 . ζ ζ Η συνοριακή συνθήκη u(x, 0) = δ(x) φανερώνει πως το όριο x2

e − 4t F √ lim t→0 x

t x

 = δ(x).

Επιπλέον, μια οριακή αναπαράσταση της συνάρτησης δέλτα του Dirac είναι η x2 e − 4t δ(x) = lim √ . t→0 2 πt Από τα παραπάνω, βγάζουμε το συμπέρασμα πως ϑα πρέπει √ x F ( xt ) ≈ √ , για t  1. Κατά συνέπεια, οι σταθερές c1 , c2 2 πt

πρέπει να είναι

1 √ 2 π

και 0 αντιστοίχως. ´Ετσι, η συμμετρική λύση

που ορίζει η συμμετρία xtu∂x + 4t2 ∂t − u(x2 + 2t)∂u είναι η x2

e − 4t u(x, t) = √ , 2 πt η ϑεμελιώδης λύση της εξίσωσης της ϑερμότητας. ´Οπως φάνηκε και από τα παραδείγματα, η άλγεβρα των συμμετριών που σέβεται ένα ΠΑΣΤ περιορίζεται σημαντικά σε σχέση με την αντίστοιχη άλγεβρα της ΔΕ. Ωστόσο, έχουμε την πεποίθηση πως η ύπαρξη απειροδιάστατων συμμετριών, όχι όμως λόγω γραμμικότητας, μπορούν να αντισταθμίσουν το μειονέκτημα που παρουσιάζεται λόγω των επιπλέον περιορισμών που επιβάλλουν το σύνορο και οι συνοριακές συνθήκες του προβλήματος.

1.2 Σ ΔΕ

..

Πέρα από τις σημειακές συμμετρίες

Στις δεκαετίες που περάσανε, από την εποχή που ο Lie πρωτοεισήγαγε την κατά συμμετρίες ανάλυση ΔΕ, η μέθοδος αναπτύχθηκε και διευρύνθηκε περαιτέρω. Με τις γενικεύσεις που επιτεύχθηκαν, οι ερευνητές έχουν στην διάθεσή τους μια μεγαλύτερη συλλογή από εργαλεία και κατά συνέπεια, περισσότερες πιθανότητες εύρεσης λύσεων. Ακολουθεί μια επιγραμματική αναφορά στις σημαντικότερες ερευνητικές “τάσεις” (Olver, 2000; Hydon, 2000; Bluman and Anco, 2002; Stephani, 1999; Ovsiannikov, 1982; Ibragimov, 1993, 1995a,b). Γενικευμένες συμμετρίες Στις γενικευμένες συμμετρίες, επεκτείνουμε την εξάρτηση των συντελεστών του απειροστού γεννήτορα συμπεριλαμβάνοντας και παραγώγους των εξαρτημένων μεταβλητών μέχρι κάποιας τάξης k, k < ∞. Ο απειροστός γεννήτορας συνήθως γράφεται στην χαρακτηριστική μορφή X = Qi (x, u, u(1) , . . . , u(k) )∂ui , i = 1, 2, . . . , n όπου x = (x1 , x2 , . . . , xm ), u = (u1 , u2 , . . . , un ) και u(l) = {uj,xi1 ···xil }, ir = 1, 2, . . . , m, r = 1, 2, . . . , l και j = 1, 2, . . . , n οι παράγωγοι των συναρτήσεων u τάξης l. Στη μορφή αυτή η επέκταση του γεννήτορα είναι

X(k) = Qj ∂uj + Di1 (Qj )∂u

j,xi1

+ · · · + Di1 ···ik (Qj )∂u

j,xi1 ···xik

όπου Di η ολική παράγωγος ως προς την μεταβλητή xi . Οι γενικευμένες συμμετρίες είναι υπερσύνολο των σημειακών και ως τέτοιο τις περιέχουν. Πιο συγκεκριμένα, κάθε σημειακή συμμετρία X = ξi (x, u)∂xi + ηj (x, y)∂uj μπορεί να γραφεί στη χαρακτηριστική μορφή X = (ξi (x, u)uj,xi − ηj (x, y))∂uj . Κάθε γενικευμένη συμμετρία που δεν προέρχεται από μια σημειακή ονομάζεται μη τετριμμένη. Οι γενικευμένες συμμετρίες σχετίζονται άμεσα με την ολοκληρωσιμότητα ενός συστήματος. Αν μπορέσουμε να βρούμε μια άπειρη αλυσίδα από μη τετριμμένες συμμετρίες για ένα σύστημα, τότε αυτό είναι ολοκληρώσιμο. Αυτό είναι ισοδύναμο με την εύρεση ενός αναδρομικού τελεστή. Με την βοήθεια αυτού και με αφετηρία μια μη τετριμμένη γενικευμένη συμμετρία είμαστε σε ϑέση να κατασκευάσουμε όλη την άπειρη αλυσίδα. Μη τοπικές συμμετρίες Οι μη τοπικές συμμετρίες είναι μια ευρεία κατηγορία συμμετριών. Περιλαμβάνει όλες τις συμμετρίες που εξαρτώνται από εκφράσεις που δεν μπορούν να δοθούν τοπικά αλλά απαιτείται η ολική εικόνα του

31

32

Σ

υπό εξέταση συστήματος ή των λύσεων αυτού. Γενική μέθοδος εύρεσής τους δεν υπάρχει. Στο παράδειγμα που ακολουθεί εξετάζουμε μια ΔΕ από την σκοπιά των μη τοπικών συμμετριών. Π 1.21. ´Εστω η εξίσωση του Burgers,

ut = ux x − u(x, t)ux . Η εξίσωση αυτή μπορεί να γραφεί σε μορφή δυναμικού, επιτρέποντάς μας έτσι να την εκφράσουμε ως ένα σύστημα με αυτή ως συνθήκη συμβατότητας.

φx = u 1 φt = − u2 (x, t) + ux . 2 Οι συμμετρίες του παραπάνω συστήματος είναι

X1 = ∂φ , X2 = ∂x , X3 = ∂t , X4 = ∂u + t∂x + x∂φ , X5 = 2t∂t − u∂u + x∂x , 

2

2



X6 = 2tx∂x + 2t ∂t + (2x − 2tu)∂u + 2t + x ∂φ ,   X7 = eφ/2 uF + 2eφ/2 Fx ∂u + 2eφ/2 F (x, t)∂φ , Ft − Fxx = 0. Οι παραπάνω συμμετρίες είναι και συμμετρίες της εξίσωσης του Burgers αλλά όχι σημειακές. Οι συμμετρίες αυτές, από την σκοπιά της εξίσωσης, είναι μη τοπικές αφούRη μεταβλητή φ σχετίζεται μη τοπικά με την συνάρτηση u αφού φ = u dx. Η κατηγορία των μη τοπικών συμμετριών που κατασκευάζονται με το τρόπο αυτό ονομάζονται και συμμετρίες δυναμικού. Υπό συνθήκη συμμετρίες ´Εστω ∆ = 0 ένα σύστημα ΔΕ και έστω Q = 0 ένα άλλο σύστημα ΔΕ συμβατό με το πρώτο. Δηλαδή, αν X είναι συμμετρία του ∆ = 0 τότε είναι και συμμετρία του συστήματος Q = 0. Οι συμμετρίες για τις οποίες X(k) ∆ ∆=0 = 0 Q=0

ονομάζονται υπό συνθήκη συμμετρίες. Συνήθως, το συμβατό σύστημα επιλέγεται να είναι η συνθήκη αναλλοίωτης επιφάνειας η οποία είναι εκ κατασκευής συμβατή με το

1.2 Σ ΔΕ

σύστημα. Οι καθοριστικές εξισώσεις που προκύπτουν με αυτό τον τρόπο δεν είναι πια γραμμικές, γεγονός που δυσχεραίνει την επίλυσή του και κατά συνέπεια την εύρεση τέτοιου είδους συμμετριών. ´Ετσι πολλές φορές το καθοριστικό σύστημα λύνεται ύστερα από την επιλογή κατάλληλης υπόθεσης εργασίας. Χαρακτηριστικό παράδειγμα αποτελεί η εξίσωση του Huxley η οποία αναλύεται στο εδάφιο 3.3.

33

2

Σ Σ Υ .

Ε

Συστήματα συμβολικών υπολογισμών ονομάζονται τα εξειδικευμένα προγράμματα που έχουν την δυνατότητα να εκτελούν συμβολικούς υπολογισμούς. Δηλαδή, τα προγράμματα που είναι ικανά να χειρίζονται μαθηματικές εκφράσεις και έννοιες σε συμβολικό επίπεδο. Σε αντίθεση, λοιπόν, με προγράμματα που χρησιμοποιούν αριθμητικά σχήματα και αριθμητικές προσεγγίσεις των μαθηματικών εκφράσεων που αναλύουν, τα συστήματα που παρουσιάζουμε μπορούν να ολοκληρώνουν και να παραγωγίζουν συμβολικά μαθηματικές εκφράσεις, να αντικαθιστούν εκφράσεις σε άλλες, να τις απλοποιούν, να λύνουν αλγεβρικά συστήματα και ΔΕ και πολλά άλλα. Επιπλέον, παρέχουν την δυνατότητα οπτικοποίησης των μαθηματικών εκφράσεων και δημιουργίας γραφικών παραστάσεων υψηλής ευκρίνειας. Επίσης, τα προγράμματα αυτά αποτελούν μια μεγάλη μαθηματική βάση δεδομένων περιέχουσα την γνώση πολλών κλασικών μαθηματικών εγχειριδίων (Abramowitz and Stegun (1965); Polyanin (2001); Polyanin and Manzhirov (2008); Polyanin and Zaitsev (2002, 2003)). Συνολικά, τα συστήματα συμβολικών υπολογισμών αποτελούν σημαντικά μαθηματικά εργαλεία τόσο για τον ερευνητή, στην επίλυση περίπλοκων και χρονοβόρων υπολογισμών, όσο και για τον εκπαιδευτικό που ϑέλει να εισάγει βασικές μαθηματικές έννοιες χρησιμοποιώντας μια φρέσκια προσέγγιση, κεντρίζοντας έτσι περισσότερο το ενδιαφέρον των μαθητών για τα μαθηματικά. Ιστορικά, τα συγκεκριμένα συστήματα, πρωτοεμφανίστηκαν στις αρχές της δεκαετίας του 70 και εξελίχθηκαν μέσα από την έρευνα που γινόταν πάνω στην τεχνητή νοημοσύνη. Ωστόσο, σήμερα τα δύο αυτά πεδία ϑεωρούνται πια ανεξάρτητα. Τα πρώτα δημοφιλή συστήματα ήταν το muMath, το REDUCE, το Derive (βασισμένο στο muMath) και το Macsyma. Στη σημερινή εποχή, κυριαρχούν τα εμπορικά προγράμματα Mathematica και Maple και σε μικρότερο βαθμό οι εφαρμογές MuPAD και MathCad. Για την ανάπτυξη του συμβολικού μας πακέτου, επιλέξαμε ως πλατφόρμα το πρόγραμμα Mathematica.

35

36

Σ Σ Υ

.

Τ  M

Η πρώτη έκδοση του προγράμματος κυκλοφόρησε τον Ιούνιο του 1988 από τον φυσικό Steven Wolfram και έκτοτε, βελτιώνεται συνεχώς με καινούργιες εκδόσεις. Θεωρείται ένα από τα πιο δημοφιλή εμπορικά προγράμματα και έχει αποσπάσει πολλές ϑετικές κριτικές και βραβεία για τις καινοτομίες που εισήγαγε. ´Ενα από τα βασικά του πλεονεκτήματα είναι η γλώσσα του. Βασισμένη στην γλώσσα προγραμματισμού Lisp, παρέχει στον χρήστη πολύ μεγάλη ελευθερία τόσο σε προγραμματιστικό επίπεδο όσο και σε μαθηματικό επίπεδο, δίνοντάς του την δυνατότητα να ορίζει μαθηματικές έννοιες εύκολα και με προσιτό τρόπο. Επιπλέον, η ικανότητα αναγνώρισης προτύπων που διαθέτει, μας προσφέρει την δυνατότητα δημιουργίας “έξυπνων” εφαρμογών (βλ. και κεφ. 3). Το πρόγραμμα αποτελείται από δύο ξεχωριστά μέλη. Τον πυρήνα (kernel) και το περιβάλλον εργασίας (front end). Ο πυρήνας είναι η καρδιά του συστήματος, είναι αυτός που εκτελεί όλους τους συμβολικούς και αριθμητικούς υπολογισμούς, ενώ, το περιβάλλον εργασίας είναι το μέσο επικοινωνίας του χρήστη με τον πυρήνα, στέλνοντας τις εντολές που εισάγει ο χρήστης στον πυρήνα και διαμορφώνοντας κατάλληλα τα αποτελέσματα που δίνει. ´Ετσι, προγραμματιστικά κινούμαστε σε δύο επίπεδα: 1. Στο επίπεδο του πυρήνα εισάγοντας νέες μαθηματικές έννοιες και αλγεβρικές διεργασίες και, 2. Στο επίπεδο του περιβάλλοντος εργασίας ορίζοντας κατάλληλους κανόνες για την μορφοποίηση των μαθηματικών εκφράσεων, καθιστώντας έτσι, προσιτή την χρήση του προγράμματος στον μέσο χρήστη, ακόμη και σε εξειδικευμένα ερευνητικά πεδία. Τέλος, ιδιαίτερη μνεία πρέπει να δοθεί στο άριστο σύστημα βοηθείας του Mathematica το οποίο καλύπτει όλες τις πτυχές του προγράμματος με πληθώρα παραδειγμάτων. Χαρακτηριστικό της πληρότητάς του είναι το γεγονός πως σε έντυπη μορφή αντιστοιχεί σε εκατοντάδες χιλιάδες σελίδες κειμένου. Τη στιγμή γραφής αυτής της διατριβής το σύστημα συμβολικών υπολογισμών Mathematica βρίσκεται στην έκδοση 7.0.

Μέρος II Ε Α

3

Τ Σ Π S .

Ε

Το συμβολικό πακέτο Sym είναι το αποτέλεσμα εξαετούς έρευνας και ανάπτυξης με πλατφόρμα το πρόγραμμα συμβολικών υπολογισμών Mathematica. Ο σκοπός του είναι διπλός: Από την μία να συμπληρώσει ένα κενό που υπάρχει από τα ήδη υπάρχοντα πακέτα και από την άλλη να καλύψει τις ανάγκες της ερευνητικής μας ομάδας προσφέροντάς μας ένα σύγχρονο και ευέλικτο εργαλείο. ´Ολα τα διαθέσιμα συμβολικά πακέτα για την εύρεση των συμμετριών παρουσιάζουν ένα βασικό, κατά την άποψή μας, μειονέκτημα: Παρέχουν στον τελικό χρήστη ένα σύνολο από εντολές για την εύρεση συγκεκριμένου τύπου συμμετριών, στην πλειονότητά τους σημειακές συμμετρίες. Οι εντολές αυτές, μπορεί να επαρκούν για έναν ερευνητή που δεν έχει ιδιαίτερες γνώσεις πάνω στην μέθοδο των συμμετριών και απλά αναζητεί λύσεις για την ΔΕ που ερευνά. Είναι όμως περιοριστικές για κάποιον που γνωρίζει την μέθοδο και ϑέλει να εξετάσει τα ενδιάμεσα αποτελέσματα της προκύπτουσας ανάλυσης, να επαληθεύσει τους υπολογισμούς ή να επεκτείνει την ανάλυση χρησιμοποιώντας μη σημειακές συμμετρίες. Επιπλέον, επειδή οι εντολές αυτές είναι πλήρως αυτοματοποιημένες, είναι από δύσκολη μέχρι αδύνατη η ενδιάμεση παρέμβαση από τον χρήστη, γεγονός, που σε πολύπλοκα συστήματα έχει ως συνέπεια τα συμβολικά πακέτα να δίνουν λάθος ή και καθόλου απάντηση. Τέλος, αξίζει να σημειωθεί το ϑέμα της ευχρηστίας των πακέτων. Τα περισσότερα συμβολικά πακέτα έχουν τον δικό τους τρόπο εισαγωγής των μαθηματικών εκφράσεων, που αποκλίνει λίγο έως πολύ από την καθιερωμένη “με το χέρι” γραφή. Επίσης, οι απαντήσεις που δίνονται από τα πακέτα αυτά είναι σε δυσνόητη μορφή αφού διαφέρει κατά πολύ από την συνήθη μαθηματική γραφή, κάτι που γίνεται περισσότερο αντιληπτό καθώς η πολυπλοκότητα και το μέγεθος των εκφράσεων αυξάνει. Το συμβολικό μας πακέτο μπορεί να χωριστεί σε τέσσερα λογικά τμήματα σύμφωνα με το σχήμα 2. Σύμφωνα με αυτό το σχήμα, το οριζόντιο τμήμα περιέχει όλες τις εντολές που δίνουν την δυνατότητα στο πακέτο να μπορεί να αναγνωρίζει την δομή των ΔΕ, δηλαδή να μπορεί να εντοπίζει τα κύρια χαρακτηριστικά της όπως είναι οι

39

40

Τ Σ Π S

Σχήμα 2: Διάρθρωση συμβολικού πακέτου Sym

ανεξάρτητες μεταβλητές, οι άγνωστες συναρτήσεις και η τάξη της εξίσωσης. Αυτό δίνει την δυνατότητα σε εντολές των άλλων τμημάτων του προγράμματος να λειτουργούν με την ελάχιστη δυνατή παρέμβαση από τον χρήστη, που περιορίζεται στην εισαγωγή των ΔΕ. Επίσης, χάρη σε αυτές το πρόγραμμα έχει την δυνατότητα διαχείρισης συστημάτων ΔΕ χωρίς την εξωτερική παρέμβαση ή καθοδήγηση του χρήστη. Επιπλέον, ορίζονται κανόνες, στο επίπεδο του front-end, για την τελική μορφή των αποτελεσμάτων. Στον πίνακα που ακολουθεί, δίνουμε μερικά παραδείγματα του τι εννοούμε αντιπαραβάλλοντας την μορφή που δίνει το πακέτο μας με την μορφή που δίνει αρχικά το Mathematica για συγκεκριμένες μαθηματικές εκφράσεις. Οι κανόνες αυτοί, επειδή ακριβώς βρίσκονται στο επίπεδο του front-end δεν επηρεάζουν την λειτουργία του πυρήνα, παρά εφαρμόζονται στο τελικό αποτέλεσμα που δίνει. Μαθηματική ´Εκφραση

Χωρίς το Sym

Με το Sym

f00 (x)

f00 [x]

f00

f(6) (x)

f(6) [x]

f(6)

uxy (x, y)

u(1,1) [x, y]

u,xy

uxxxxxxyyy

u(6,3) [x, y]

u,6x

3y

Πίνακας 1: Αναπαράσταση Μαθηματικών Εκφράσεων μέσω Sym

3.1 Ε

Οι υπόλοιπες εντολές του πακέτου διαχωρίζονται σύμφωνα με την λειτουργία και τον ρόλο τους μέσα σε αυτό. Ο διαχωρισμός αυτός δημιουργεί τρία, εννοιολογικά ξένα, τμήματα. Αυτά είναι: (1) Το σύνολο των εντολών που σχετίζονται με την μέθοδο των συμμετριών. Βασισμένοι στη ϑεωρία, όπως αυτή παρουσιάστηκε στο κεφάλαιο 1, κατασκευάσαμε ένα σύνολο από εντολές που σκοπό έχουν να “διδάξουν” στο Mathematica. ´Ετσι, ξεκινάμε από την καρδιά της ϑεωρίας, την κατασκευή του απειροστού γεννήτορα και την επέκταση αυτού (βλ. κεφ. 1.2.2). Συνεχίζουμε με εντολές για την εύρεση των συμμετριών, την εκθετικοποίηση αυτών, όπως επίσης, για την κατασκευή και την αλγεβρική διαχείριση των συμμετριών. Σε αυτό το σημείο, αξίζει να σημειωθεί το γεγονός πως η ύπαρξη εντολής για την κατασκευή του απειροστικού γεννήτορα, και μάλιστα με τον χαρακτήρα τελεστή, είναι ένα χαρακτηριστικό που δεν απαντάται σε αντίστοιχα πακέτα. (2) Ο “λύτης” των καθοριστικών εξισώσεων. Το τμήμα αυτό καλύπτει το ζήτημα της επίλυσης υπερκαθορισμένων συστημάτων ΔΕ. Χρησιμοποιώντας ως βάση την εντολή επίλυσης ΔΕ του Mathematica, DSolve, και επεκτείνοντάς την κατάλληλα, κατασκευάσαμε μια εντολή με χαρακτηριστικά τεχνητής νοημοσύνης. Χαρακτηριστικά που επιτρέπουν την αυτόματη εύρεση εναλλακτικών λύσεων για συγκεκριμένες τιμές των παραμέτρων, για τα συστήματα που περιέχουν παραμέτρους και αυθαίρετες συναρτήσεις. ´Οπως επίσης και την δυνατότητα απόδειξης των λύσεων που προκύπτουν από τον λύτη, (Dimas and Tsoubelis (2005, 2006)). ´Οταν λέμε τεχνητή νοημοσύνη αναφερόμαστε στην ικανότητα της εντολής να αναγνωρίζει και να επιλέγει ποιά ΔΕ να επιλύσει σε κάθε βήμα της διαδικασίας που ακολουθεί, όπως επίσης και την ικανότητα να επιλέγει διαφορετική στρατηγική επίλυσης ανάλογα με το σύστημα που δίνεται. Επιπλέον, παρέχεται η δυνατότητα καταγραφής σε αρχείο όλης της διαδικασίας που ακολουθήθηκε για την επίλυση του συστήματος. Το αρχείο αυτό μπορεί να χρησιμοποιηθεί από τον ερευνητή για να επαληθεύσει τόσο την ορθότητα των υπολογισμών όσο και την πληρότητα των αποτελεσμάτων. Επιπρόσθετα, σημαντική είναι η χρήση της παραπάνω επιλογής για καθαρά εκπαιδευτικούς λόγους, με σκοπό την εκπαίδευση νέων ερευνητών και την εξοικείωσή τους με την μέθοδο. ´Ετσι, με την αυτόματη εύρεση εναλλακτικών λύσεων, όπου αυτό είναι εφικτό, ο λύτης παρέχει μία πληρέστερη εικόνα σε σχέση με παραδοσιακά πακέτα εύρεσης συμμετριών. Επιπλέον, η άρρηκτη εξάρτησή του με μία από

41

42

Τ Σ Π S

τις βασικότερες εντολές του Mathematica, μας εξασφαλίζει ότι εκμεταλλευόμαστε αυτόματα κάθε βελτίωσή της που παρέχεται σε μελλοντικές εκδόσεις του προγράμματος. (3) Μια σειρά από βοηθητικές συναρτήσεις. Περιέχονται όλες οι εντολές που είτε βελτιώνουν υπάρχουσες εντολές του Mathematica είτε καλύπτουν ανάγκες μας που προέκυψαν από την χρήση του πακέτου πάνω στα ερευνητικά μας ενδιαφέροντα. Οι εντολές αυτές καλύπτουν ένα ευρύ φάσμα λειτουργιών. Από την κατασκευή κανόνων κατάλληλων για αντικατάσταση σε διαφορικές εκφράσεις μέχρι την εξειδικευμένη απλοποίηση εξισώσεων. Στο επόμενο εδάφιο, παρουσιάζουμε τις βασικές εντολές του συμβολικού πακέτου και δίνουμε χαρακτηριστικά παραδείγματα εφαρμογής αυτών. .

Β Χ

Η ανάλυση με το συμβολικό μας πακέτο ξεκινάει με την εντολή 0

(βʹ) c4 = 0

(γʹ) c4 < 0

Σχήμα 4: Συμμετρικές λύσεις της (5.24).

79

80

Κ Δ Ε

.

Μ  ΔΕ

Είδαμε στο τέλος του εδαφίου 5.3 πώς, με αφετηρία την κοινή υποάλγεβρα δύο διαφορετικών εξισώσεων, μπορεί να προέλθει μια οικογένεια που να περιέχει, τουλάχιστον, τις εξισώσεις με τις οποίες ξεκινήσαμε. Μια άλλη, περισσότερο ενδιαφέρουσα ΔΕ προκύπτει χρησιμοποιώντας την οκταδιάστατη υποάλγεβρα της (5.17)

{∂x , ∂y , ∂u , x∂x , y∂y , u∂u , u∂y , x∂y }, η οποία αποτελεί μια αναπαράσταση της άλγεβρας {A2 ⊕ A2 } ⊕s {A1 ⊕s 3A1 }. Η εξίσωση που χαρακτηρίζεται από την παραπάνω υποάλγεβρα είναι η

(uxx uyy − u2xy )u2y = c(uy uxy − ux uyy )2

(5.28)

Η εξίσωση αυτή, είναι αξιοσημείωτη κατά Lie και επιπλέον κάθε επταδιάστατη υποάλγεβρά της που περιέχει την συμμετρία ∂y είναι πλήρης ομάδα συμμετριών. ´Οσο για τις εξισώσεις (5.10) και (5.14), με τις οποίες ξεκινήσαμε, αυτές περιέχονται στην παραπάνω οικογένεια για c = 0 και c = −1 αντίστοιχα (Andriopoulos et al. (2008a)). Για όλες τις άλλες τιμές της σταθεράς c η ΔΕ που εξάγεται έχει τις οκτώ συμμετρίες που κατέχει και η (5.28). .

Σ Ε

Η ανάλυση που πραγματοποιήθηκε στα προηγούμενα εδάφια δεν ϑα ήταν εφικτή δίχως την αρωγή του πακέτου Sym. Συγκεκριμένα, για να ολοκληρώσουμε την ανάλυση που παρουσιάσαμε στο παρόν κεφάλαιο, χρειάστηκε να αναπτύξουμε μια σειρά από εξειδικευμένες εντολές για τον αυτόματο χαρακτηρισμό ΔΕ και την εύρεση πλήρων ομάδων συμμετρίας. Παρακάτω, δίνουμε μια συνοπτική περιγραφή των εντολών αυτών, οι οποίες και συμπεριλαμβάνονται στην τελευταία έκδοση του πακέτου. CharacteristicDEq: Σκοπός της εντολής αυτής είναι ο χαρακτηρισμός ΔΕ.

Ορίσματά της, μια γενική μορφή και ένα σύνολο συμμετριών. Αποτέλεσμα της εντολής είναι η εξίσωση, αν υπάρχει, που χαρακτηρίζεται από τις συμμετρίες και την γενική μορφή που της παρείχαμε. Για παράδειγμα, η εντολή CharacteristicDEq[D[u[x, t],t]==F[x,t,u[x,t],D[u[x,t],x],D[u[x,t],x,x]],{Partial[x]}]

δίνει ut = F1 (t, u, ux , uxx ). CompleteSymmetryAlgebraQ: Η εντολή αυτή ανήκει στην κατηγορία

των ερωτημάτων (Query). Εισάγοντας μια ΔΕ και ένα σύνολο

5.7 Σ – Π

συμμετριών, απαντά με True αν οι συμμετρίες χαρακτηρίζουν την εξίσωση αυτή και False διαφορετικά. CompleteSymmetries: Αυτή είναι η πιο αυτόματη εντολή από τις τρεις.

Στόχος της, η εύρεση πλήρων ομάδων συμμετριών για δοσμένη εξίσωση. Ο χρήστης εισάγει μόνο τη ΔΕ και η εντολή βρίσκει τις συμμετρίες της, κατασκευάζει όλες τις δυνατές υποάλγεβρες και επιλέγει τη μικρότερη σε διάσταση που χαρακτηρίζει την εξίσωση την οποία και δίνει ως αποτέλεσμα. Σε περίπτωση που δεν υπάρχει τέτοια επιστρέφει το κενό σύνολο {}. .

Σ – Π

Στο κεφάλαιο αυτό εισάγαμε την έννοια της πλήρους ομάδας συμμετριών και την ιδιότητα της αξιοσημείωτης κατά Lie ΔΕ. Με την βοήθεια αυτών των εννοιών καταφέραμε να ταξινομήσουμε ΔΕ με συστηματικό τρόπο. Συγκεκριμένα, δείξαμε πώς, με αφετηρία δοσμένη ΔΕ, μπορούμε να κατασκευάσουμε μια οικογένεια ΔΕ, μέλος της οποίας είναι και η αρχική μας ΔΕ. Επιπλέον δείξαμε πώς, αν δύο ΔΕ έχουν ένα ικανό αριθμό από συμμετρίες, μπορούμε να κατασκευάσουμε μια οικογένεια ΔΕ με μέλη τις δύο αρχικές εξισώσεις. Οι οικογένειες που κατασκευάστηκαν με τον τρόπο αυτό είναι αξιοσημείωτες κατά Lie. ´Ενα ερώτημα που εγείρεται είναι η σχέση των λύσεων των οικογενειών που κατασκευάσαμε, με αυτό τον τρόπο, με τις λύσεις των αρχικών εξισώσεων. Μήπως προκύπτουν μέσα από μια μη γραμμική σύνθεση λύσεων; Οι συμμετρίες μπορούν να μας βοηθήσουν στην κατεύθυνση αυτή; Επιπλέον, αξίζει να δώσουμε περισσότερο βάρος στις εξισώσεις με απειροδιάστατες άλγεβρες. Α ´ λγεβρες που έχουν παραγκωνισθεί σε σχετικές εργασίες. Αυτά είναι μερικά από τα ζητήματα με τα οποία πρόκειται να ασχοληθούμε σε μελλοντικές εργασίες.

81

Μέρος III Π

A

Κ S Παρακάτω, παραθέτουμε τον πηγαίο κώδικα του πακέτου Sym. Ο λόγος που παρουσιάζεται τόσο πυκνογραμμένη και με μικρό μέγεθος γραμματοσειρά είναι καθαρά για εξοικονόμηση χώρου μιας και, μια κανονική ανάπτυξη του κώδικα ϑα καταλάμβανε εκατοντάδες σελίδες. Για οποιοδήποτε σχόλιο, απορία ή παρατήρηση, όπως επίσης και για την απόκτηση του ίδιου του πακέτου, παρακαλούμε να επικοινωνήσετε μαζί μας στο email [email protected]. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

27

28 29 30 31 32 33 34 35 36 37 38 39 40

(* :Mathematica Version: 6.0.3 *) (*:Name: Sym‘ *) (* :Title: Package for the symmetry analysis of diferential equations & systems *) (* :Authors: Stilianos Dimas and Dimitris Tsoubelis , July 2008 *) (* :Keywords: Differential Equations & Systems , Symmetries , Analytic Solutions , Modern Group Analysis *) (* :Summary: This package provides an array of tools and non-interactive commands for the analysis of differential equations and systems based on the rich theory of Modern Group Analysis. Additionaly , tools for the algebraic manipulation of various algebra elements are provided. *) (* Clearing the workspace *) I f [ I n t e r s e c t i o n [ $ContextPath , { "Sym ‘ " } ] = ! = { } , P r i n t [ " The package Sym i s a l r e a d y loaded , removing symbols . . . " ] ; U n p r o t e c t [ "Sym‘ ∗ " ] ; C l e a r A l l [ "Sym‘ ∗ " ] ; P r i n t [ " . . . done . " ] , (* Clearing shadowed symbols *) Module [ { shdwsymb = { } } , I f [ ( shdwsymb = I n t e r s e c t i o n [ Names [ " ∗ " ] , { " AbelianElement " , " AbelianQ " , " AddDiscreteFunction " , " AlgebraFromSolution " , " C h a r a c t e r i s t i c D E q " , " C h a r a c t e r i z e E q " , " C l a s s i c a l S y m m e t r i e s ", " Commutator " , " CommutatorTable " , " CompleteSymmetries " , " CompleteSymmetryAlgebraQ " , " Const " , " ContSym " , " \ [ C a p i t a l D e l t a ] eterminingEqs " , " DeterminingEqs " , "DummyVar" , " EquivQ " , " Eta " , " Eu lerO per ato r " , " FindAllSubAlgebras " , " FreeFunc " , " F u n c t i o n S p l i t " , " GetOptimalSystem " , " GetOptimalSystemRawData " , " GroupFromAlgebra " , " Hint " , " HomotopyOperator " , " I2D " , " IdealQ " , " I n s t a l l H e l p F i l e s " , " I n t e g r a l Q " , " I n t e g r a l T o D i f f e r e n t i a l E q " , " InvariantSurfaceCondition " , " Jetspace " , " JetSpace " , " JetSpace \[ CapitalDelta ] " , " LinearDependency " , " LinearIndependentQ " , " MakeItSo " , " MakeRule " , " MaximalSet " , " MatrixToSystem " , " OneParameterAlgebra " , " P a r t i a l " , "Q" , " RemoveDiscreteFunction " , " S h e r l o c k " , " S h i f t " , " S im pl i fy Eq " , " S i m p l i f y O p e r a t o r " , " SolvableQ " , " SolveOverdeterminedEqs " , " SystemToMatrix " , " SubAlgebraQ " , "Sym" , " SymmetryReduce " , " SystemSolveOnce " , " ToCanonicalForm " , "TOF" , " TraditionalOperatorForm " , "X" , " XEliminate " , " Xi " , " XFunction " , " WeightFunction " , " $HatIndex " , " $ J e t S p a c e " , " $KnownFunctions " , " $Percent " , " $ S i m p l i f i c a t i o n F u n c t i o n " , " $TasosMode " , " $TimeConstrained " , " $WriteFilePath " , " $Verbose " } ] ) = ! = { } , P r i n t [ "Some of t h e symbols of t h e package Sym are shadowed by a l r e a d y d e f i n e d symbols with t h e same name , " ] ; S t y l e P r i n t [ shdwsymb , FontColor −> RGBColor [ 0 , 0 , 1 ] , Fo nt Sl an t −> " I t a l i c " ] ; P r i n t [ " removing c o n f l i n c t i n g symbols . . . " ] ; Unprotect@@shdwsymb ; Remove / @shdwsymb ; P r i n t [ " . . . done . Please , r e e v a l u a t e , i f necessary , any e x p r e s s i o n s i n c l u d i n g t h e removed symbols . " ] ] ] ]

41 42 43 44 45 BeginPackage [ "Sym ‘ " ] 46 47 P r i n t [ " Loading Package Sym . . . " ] 48

85

86

Κ S

49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

(* Setting $Post function *) $Post = ( I f [ Count [ { # } , $Aborted , I n f i n i t y ]>0&&$HistoryLength ==0 , $HistoryLength= I n f i n i t y ] ; # )& NotebookClose [ Evaluate [ $LaunchDirectory " \\AddOns\\ ExtraPackages \\ SymPalette . nb " ] ] DeclarePackage [ " GUIKit ‘ " , { "GUIRunModal" } ] $HatIndex : : usage=" $HatIndex g i v e s t h e l i s t of t h e used f o r t h e d i s c r e t e v a r i a b l e s " $WriteFilePath : : usage=" $WriteFilePath g i v e s t h e path where t h e l o g f i l e s w i l l be saved " $Verbose : : usage=" $Verbose g i v e s t h e d e f a u l t s e t t i n g of t h e Verbose o p t i o n " AbelianElement : : usage =" " AbelianQ : : usage =" "

AlgebraFromSolution : : usage = " AlgebraFromSolution [ ig , s o l u t i o n ] g i v e s t h e i n f i n i t e s i m a l g e n e r a t o r f o r a s p e c i f i c s o l u t i o n o b t a i n e d by SolveOverdeterminedEqs . " 67 68 AddDiscreteFunction : : usage=" " 69 AddDiscreteFunction : : e x s t =" D i s c r e t e f u n c t i o n ‘ 1 ‘ a l r e a d y i n c l u d e d " 70 71 C h a r a c t e r i s t i c D E q : : usage=" C h a r a c t e r i s t i c D E q [ generalform , a l g e b r a ] g i v e s t h e d i f f e r e n t i a l equation c h a r a c t e r i s t i c t o t h e p r o v i d i n g a l g e b r a t a k i n g i n t o account t h e p r e f e r r e d g e n e r a l form of t h e d i f f e r e n t i a l equation . " 72 73 C h a r a c t e r i z e E q : : usage=" C h a r a c t e r i z e E q [ eq ] g i v e s t h e c h a r a c t e r i z a t i o n of a d i f f e r e n t i a l equation or a system of d i f f e r e n t i a l e q u a t i o n s . " 74 C h a r a c t e r i z e E q : : syswellformed = " The system ‘ 1 ‘ i s not well −formed . The f u n c t i o n ( s ) ‘ 2 ‘ appear with d i f f e r e n t arguments " 75 76 C l a s s i c a l S y m m e t r i e s : : usage=" C l a s s i c a l S y m m e t r i e s [ eq ] g i v e s t h e c l a s s i c a l symmetries ( p o i n t and g e n e r a l i z e d ) f o r a d i f f e r e n t i a l equation . C l a s s i c a l S y m m e t r i e s [ { eq1 , eq2 , . . . } ] g i v e s t h e c l a s s i c a l symmetries ( p o i n t and g e n e r a l i z e d ) f o r a system of d i f f e r e n t i a l e q u a t i o n s . " 77 78 Commutator : : usage=" Commutator [ op1 , op2 ] g i v e s t h e commutation between two o p e r a t o r s . " 79 80 CommutatorTable : : usage=" CommutatorTable [ a l g e b r a ] d i s p l a y s t h e commutator t a b l e and g i v e s t h e s t u c t u r e c o n s t a n t s of t h e given a l g e b r a . CommutatorTable [ s u b a l g e b r a , s t r u c t u r e c o n s t a n t s ] g i v e s t h e commutator t a b l e of a s u b a l g e b r a , given t h e s t r u c t u r e c o n s t a n t s of t h e c o r r e s p o n d i n g a l g e b r a " 81 CommutatorTable : : lndep ="Some of t h e elements of t h e s u p p l i e d a l g e b r a are l i n e a r dependent . " 82 83 CompleteSymmetries : : usage=" CompleteSymmetries [ eq ] g i v e s t h e complete symmetry s u b a l g e b r a of a d i f f e r e n t i a l equation . " 84 85 CompleteSymmetryAlgebraQ : : usage=" CompleteSymmetryAlgebraQ [ eq , a l g e b r a ] g i v e s True i f t h e p r o v i d e d a l g e b r a i s t h e complete symmetry of t h e given equation . " 86 87 Const : : usage=" Const [ I n t e g e r ] r e p r e s e n t s a c o n s t a n t . " 88 89 \ [ C a p i t a l D e l t a ] eterminingEqs : : usage=" \ [ C a p i t a l D e l t a ] eterminingEqs [ eq ] g i v e s t h e determining e q u a t i o n s of a d i f f e r e n c e equation or system of d i f f e r e n c e e q u a t i o n s . " 90 91 DeterminingEqs : : usage=" DeterminingEqs [ eq ] g i v e s t h e determining e q u a t i o n s of a d i f f e r e n t i a l equation or a system of d i f f e r e n t i a l e q u a t i o n s " 92 DeterminingEqs : : o v e r d e t =" This i s an overdetermined system of equations , p l e a s e g i v e e x p l i c t s u b s t i t u t i o n s with t h e Hint o p t i o n " 93 94 DSolve : : OutOfTime="Can ’ t s o l v e t h e d i f f e r e n t i a l equation within t h e c u r r e n t time l i m i t ‘ 1 ‘ . Try changing t h e value of $TimeConstrained " 95 96 DummyVar : : usage="DummyVar [ I n t e g e r ] [ v a r s ] r e p r e s e n t s an e x p r e s s i o n , of t h e v a r i a b l e s vars , t h a t a p p e a r s as an argument of a f u n c t i o n . " 97 98 EquivQ : : usage=" " 99 100 Eta : : usage=" Eta [ I n t e g e r ] [ v a r s ] r e p e r e s e n t s one of t h e c o e f f i c i e n t s of t h e v e r t i c a l p a r t of an i n f i n i t e s i n a l generator . " 101 102 E ule rOpe rat or : : usage=" Eule rOp erat or [ order , f u n c t i o n s ] [ e x p r ] g i v e s t h e a c t i o n of t h e Euler o p e r a t o r of a given order , in r e s p e c t t o a s e t of function , on an e x p r e s s i o n . " 103 104 FindAllSubAlgebras : : usage=" FindAllSubAlgebras [ a l g e b r a ] g i v e s a l l t h e p o s s i b l e s u b a l g e b r a s of an a l a g e b r a . " 105 106 FreeFunc : : usage=" FreeFunc [ I n t e g e r ] [ v a r s ] r e p r e s e n t an uknown f u n c t i o n . " 107 108 F u n c t i o n S p l i t : : d c p l =" Unable t o decouple t h e equation ‘ 1 ‘ in r e s p e c t of t h e f u n c t i o n s ‘ 2 ‘ . " 109 110 GetOptimalSystem : : usage=" GetOptimalSystem [ rawdata ] g i v e s a s e t of p o s i b l e memebers of t h e Optimal system of a given a l g e b r a . F u r t h e r r e f i n e m e n t can be achieved using t h e i n v a r i a n t s . " 111 112 GetOptimalSystemRawData : : usage=" GetOptimalSystem [ S t r u c t u r e C o n s t a n t s ] g i v e s some raw data f o r o b t a i n i n g t h e o p t i m a l system of an a l g e b r a . The data i n c l u d e s t h e o r b i t s of an " 113 114 GroupFromAlgebra : : usage=" GroupFromAlgebra [ a l g e b r a ] g i v e s t h e l o c a l group t h a t c o r r e s p o n d s t o t h e s u p p l i e d Lie a l g e b r a . " 115

87

116 HomotopyOperator : : usage=" HomotopyOperator [ f u n c t i o n s ] [ e x p r ] g i v e t h e r e s u l t of t h e a c t i o n of t h e Homotopy o p e r a t o r on an e x p r e s s i o n with r e s p e c t t o a s e t of f u n c t i o n s . " 117 118 IdealQ : : usage=" IdealQ [ s t r u c t u r e c o n s t a n t s , s u b a l g e b r a ] g i v e s True i f t h e s u b a l g e b r a i s an i d e a l of t h e given a l g e b r a . " 119 120 I n s t a l l H e l p F i l e s : : usage=" I n s t a l l H e l p F i l e s [ i n s t a l l | u n i n s t a l l ] i n s t a l l s or u n i n s t a l l s t h e package ’ s e n t r i e s t o t h e h e l p browser . The command I n s t a l l H e l p F i l e s [ ] i s e q u i v a l e n t t o I n s t a l l H e l p F i l e s [ i n s t a l l ] " 121 122 I n t e g r a l Q : : usage=" I n t e g r a l Q [ eq ] checks i f t h e equation eq i n c l u d e s i n t e g r a l s " 123 124 I n t e g r a l T o D i f f e r e n t i a l E q : : usage=" I n t e g r a l T o D i f f e r e n t i a l E q [ eq , v a r s ] t u r n s an i n t e g r a l equation of v a r i a b l e s v a r s t o d i f f e r e n t i a l equation with independent v a r i a b l e s v a r s " 125 126 I n v a r i a n t S u r f a c e C o n d i t i o n : : usage=" I n v a r i a n t S u r f a c e C o n d i t i o n [ symmetry , f u n c t i o n s ] g i v e s t h e i n v a r i a n t s u r f a c e c o n d i t i o n f o r t h e s u p p l i e d symmetry . " 127 128 J e t S p a c e : : usage=" J e t S p a c e [ order , independent , dependent ] g i v e s t h e j e t s p a c e of t h e s u p p l i e d o r d e r . " 129 130 J e t S p a c e \ [ C a p i t a l D e l t a ] : : usage=" " 131 132 LinearDependency : : usage=" LinearDependency [ op , { op1 , op2 , op3 , . . } , v a r s ] g i v e s t h e f i r s t o p e r a t o r as a l i n e a r combination of t h e l i s t of t h e o p e r a t o r s . " 133 134 LinearIndependentQ : : usage=" LinearIndependentQ [ o p e r a t o r s , v a r s ] g i v e s True i f t h e s e t of o p e r a t o r s are l i n e a r independent . " 135 136 MakeItSo : : usage=" MakeItSo [ fun ] and MakeItSo [ fun , s ] c r e a t e s s p e c i a l forms f o r t h e f u n c t i o n fun with a l i s t of v a r i a b l e s s " 137 138 MakeRule : : usage=" MakeRule [ eq ] g i v e s a r u l e s u i t a b l e f o r s u b s t i t u t i o n s i n t o d i f f e r e n t i a l e q u a t i o n s . " 139 MakeRule : : NoRepl=" I can ’ t s o l v e equation ‘ 1 ‘ in r e s p e c t of t h e term ‘ 2 ‘ or t h i s term doesn ’ t e x i s t ! " 140 141 MatrixToSystem : : usage=" " 142 143 MaximalSet : : usage=" " 144 145 Q : : usage="Q [ I n t e g e r ] [ v a r s ] g i v e s a c o e f f i c i e n t of an i n f i n i t e s i m a l g e n e r a t o r in c h a r a c t e r i s t i c form . " 146 147 OneParameterAlgebra : : usage=" OneParameterAlgebra [ i n f i n i t e s i m a l ] g i v e s a base of t h e a l g e b r a d e f i n e d by t h e r−p a r a m e t r i c i n f i n i t e s i m a l g e n e r a t o r . " 148 149 OrphanSplit : : usage=" " 150 OrphanSplit : : ExtraParam=" The equation ‘ 1 ‘ i n c l u d e s a l s o t h e parameters ‘ 2 ‘ . Some s p e c i a l c a s e s might be lost " 151 152 RemoveDiscreteFunction : : usage=" " 153 RemoveDiscreteFunction : : nonexst=" The f u n c t i o n ‘ 1 ‘ i s not d e f i n e d as a d i s c e t e f u n c t i o n " 154 155 P a r t i a l : : usage=" P a r t i a l [ x ] c r e a t e s a d i f e r e n t i a l o p e r a t o r f o r t h e v a r i a b l e x " 156 157 S h e r l o c k : : usage=" " 158 159 S h i f t : : usage=" " 160 161 Si mp li f yE q : : usage=" Si mp l if yE q [ eq , var ] s i m p l i f i e s t h e equation t a k i n g i n t o account t h a t t h e v a r i a b l e s in t h e second argument are v a l i d f o r e v e r y value . " 162 Si mp li f yE q : : OutOfTime="Can ’ t s i m p l i f y t h e equation within t h e c u r r e n t time l i m i t of ‘ 1 ‘ seconds . Try changing t h e value of $TimeConstrained " 163 164 S i m p l i f y O p e r a t o r : : usage=" S i m p l i f y O p e r a t o r [ o p e r a t o r ] s i m p l i f i e s an o p e r a t o r . " 165 166 SolvableQ : : usage=" S o l v a b l e [ s t r u c t u r e c o n s t a n t s , s u b a l g e b r a ] g i v e s True i f t h e s u b a l g e b r a of a Lie a l g e b r a with given s t r u c t u r e c o n s t a n t s i s s o l v a b l e . " 167 168 SolveOverdeterminedEqs : : usage=" SolveOverdeterminedEqs [ eq ] t r i e s t o s o l v e an overdetermined system of d i f f e r e n t i a l s e q u a t i o n s and r e t u r n s t h e a l g e b r a i c c o n d i t i o n s and t h e s o l u t i o n s in r u l e format " 169 170 Sym : : usage="Sym i s a package f o r t h e group a n a l y s i s of d i f f e r e n t i a l e q u a t i o n s . " 171 172 SubAlgebraQ : : usage=" SubAlgebraQ [ . . . ] g i v e s True i f t h e s u b s e t i s a s u b a l g e b r a of t h e given Lie a l g e b r a . " 173 174 SymmetryReduce : : usage=" SymmetryReduce [ equation , i n f i n i t e s i m a l ] g i v e s a l i s t c o n t a i n i n g t h e s i m i l a r i t y v a r i a b l e , t h e s i m i l a r i t y s o l u t i o n and t h e r e d u c t i o n of t h e equation f o r t h e s u p p l i e d i n f i n i t e s i m a l generator . " 175 176 SystemSolveOnce : : OutOfTime="Can ’ t s o l v e t h e d i f f e r e n t i a l equation within t h e c u r r e n t time l i m i t ‘ 1 ‘ . Try changing t h e value of $TimeConstrained " 177 178 SystemToMatrix : : usage=" " 179 180 ToCanonicalForm : : usage=" " 181 182 TOF : : usage=" Short v e r s i o n of t h e command TraditionalOperatorForm " 183 184 TraditionalOperatorForm : : usage=" TraditionalOperatorForm [ o p e r a t o r ] d i s p l a y s a d i f f e r e n t i a l o p e r a t o r in t h e t r a d i t i o n a l mathematical form " 185

88

Κ S

186 X : : usage="X[ i , IndependentVariables , DependentVariables , v a r s ] i s t h e prolonged i n f i n i t e s i m a l g e n e r a t o r and X [ 0 ] the i n f i n i t e s i m a l generator " 187 188 XEliminate : : usage=" " 189 190 Xi : : usage=" " 191 192 XFunction : : usage=" " 193 194 WeightFunction : : usage=" Generic Weight f u n c t i o n " 195 196 I2D : : " e r r 1 "=" This i s not an i n t e g r a l equation " 197 198 I2D : : " e r r 2 "=" This i n t e g r a l equation i s not an i n t e g r a l equation of t h e v a r s ‘ 1 ‘ " 199 200 (* Global Parameters *) 201 202 $KnownFunctions = { } 203 204 $ J e t S p a c e = 0 205 206 $Percent = 2 207 208 $ S i m p l i f i c a t i o n F u n c t i o n = S i m p l i f y 209 210 $TasosMode = F a l s e 211 212 $TimeConstrained = 600 213 214 $WriteFilePath = $HomeDirectory " \\ Desktop \\ " 215 216 $Verbose = F a l s e 217 218 Options [ C l a s s i c a l S y m m e t r i e s ] = { Incremental −>F a l s e } 219 Options [ C h a r a c t e r i z e E q ] = { Verbose : > $Verbose } 220 Options [ CommutatorTable ] = { ShowTable −>True } 221 Options [ \ [ C a p i t a l D e l t a ] eterminingEqs ] = { Verbose : > $Verbose , Hint − >{} , Conditional −>False , J e t s p a c e : > $JetSpace , KnownFunctions : > $KnownFunctions , KeepHistory −>F a l s e } 222 Options [ DeterminingEqs ] = { Verbose : > $Verbose , Hint − >{} , Conditional −>False , J e t s p a c e : > $JetSpace , KnownFunctions : > $KnownFunctions , Incremental −>False , SimplifyDeterminingEqs −>True } 223 Options [ EquivQ ] = { MaxDepth −>4} 224 Options [ GetOptimalSystem ] = { RawData−>F a l s e } 225 Options [ S i m p l i f y O p e r a t o r ] = { RemoveFactor −>F a l s e } 226 Options [ SolveOverdeterminedEqs ] = { Verbose : > $Verbose , LogFile −>False , ComplexDomain−>False , KnownFunctions : > $KnownFunctions , Assumptions − >{} , ShowReport−>True } 227 Options [ XEliminate ] = { Info −>F a l s e } 228 229 Begin [ " ‘ P r i v a t e ‘ " ] 230 231 $HatIndex = { { OverTilde , U n d e r s c r i p t [ # , "~" ] & } , { OverHat , U n d e r s c r i p t [ # , " ^ " ] & } , { OverBar , UnderBar } } 232 233 $ D i s c r e t e F u n c t i o n s I n d e x = { } 234 235 $Stream = 0 236 237 $AdditionalAssumptions = { } 238 239 (* Compatibility Mode for Mathematica 4.2 and earlier *) 240 I f [ $VersionNumber < 6 . 0 , 241 P r i n t [ " The package i s o p t i m i z e d f o r v e r s i o n 6 . x of Mathematica . Some commands might not behave c o r r e c t l y or perform p o o r l y . Please , o b t a i n t h e v e r s i o n of t h e package f o r Mathematica 5 . x and below . Running now in c o m p a t i b i l i t y mode ! " ] ; 242 $CompatibilityMode = DSolveConstants 243 , 244 $CompatibilityMode = GeneratedParameters ; 245 a b o r t d i a l o g = GUIKit ‘ GUILoad [ " AbortDialog " ] 246 ] 247 248 AbelianElement [ s t r u c t u r e c o n s t a n t s _ , S u b A l g e b r a _ L i s t : { } ] / ; ArrayQ [ s t r u c t u r e c o n s t a n t s , 3 ] : = Module [ { l e n = Dimensions [ s t r u c t u r e c o n s t a n t s ] , index = { } , reduced = s t r u c t u r e c o n s t a n t s , BaseSet = SubAlgebra } , 249 I f [ UnsameQ@@len , P r i n t [ " I n v a l i d s t r u c t u r e c o n s t a n t s d e t e c t e d " ] ; Abort [ ] , l e n = l e n [ [ 1 ] ] ] ; 250 I f [ SubAlgebra = ! = { } , 251 reduced = s t r u c t u r e c o n s t a n t s [ [ # , # ] ] & [ Union [ F l a t t e n [ List@@@SubAlgebra ] ] ] ; 252 l e n = Length [ SubAlgebra ] 253 , 254 BaseSet = Array [ X, l e n ] 255 ]; 256 Do [ I f [ ( reduced [ [ i , All , A l l ] ] / / F l a t t e n / / Union ) === { 0 } , AppendTo [ index , i ] ] , { i , 1 , l e n } ] ; 257 BaseSet [ [ # ] ] & / @index 258 ] 259 260 (* 1/10/2004 *) 261 262 AbelianQ [ s t r u c t u r e c o n s t a n t s _ , S u b A l g e b r a _ L i s t , S u b A l g e b r a I n d e x _ L i s t : { } ] / ; ArrayQ [ s t r u c t u r e c o n s t a n t s , 3 ] : = Module [ { l e n = Dimensions [ s t r u c t u r e c o n s t a n t s ] , index = Union [ F l a t t e n [ List@@@SubAlgebra ] ] } , 263 I f [ UnsameQ@@len , P r i n t [ " I n v a l i d s t r u c t u r e c o n s t a n t s d e t e c t e d " ] ; Abort [ ] , l e n = l e n [ [ 1 ] ] ] ; 264 I f [ SubAlgebraIndex = ! = { } , 265 I f [ Length [ SubAlgebraIndex ] = ! = len , 266 P r i n t [ " I n v a l i d SubAlgebraIndex d e t e c t e d " ] ; Abort [ ]

89

267 ]; 268 index = Rule@@@Thread [ { Union [ SubAlgebraIndex ] , Array [ X, l e n ] } ] ; 269 index = Union [ F l a t t e n [ List@@@ ( SubAlgebra / . index ) ] ] 270 ]; 271 ( s t r u c t u r e c o n s t a n t s [ [ index , index , A l l ] ] / / F l a t t e n / / Union ) === { 0 } 272 ] 273 274 (* 1/10/2004 *) 275 276 AddDiscreteFunction [ f u n _ ?AtomQ ] / ; Context [ fun ] === " Global ‘ " : = Module [ { } , 277 I f [ Count [ $ D i s c r e t e F u n c t i o n s I n d e x , fun ] == 0 , 278 AppendTo [ $ D i s c r e t e F u n c t i o n s I n d e x , fun ] ; 279 StringForm [ " ‘ 1 ‘ / : MakeBoxes [ ‘ 1 ‘ [ v a r s _ _ ] , form_ : StandardForm ] / ; MatchQ [ { v a r s } , { _ _ _ , _ + _ I n t e g e r , _ _ _ } ] : = Module [ { index = I f [ MatchQ [ # , _ + _ I n t e g e r ] , # / . ( a r g 1 _ + a r g 2 _ I n t e g e r ) −>{arg1 , arg2 } , { # , 0 } ] & /@{ v a r s }} , 280 index = index / . Rule@@@Thread [ { index [ [ All , 1 ] ] , Range [ Length [ index ] ] } ] ; 281 I f [ $TasosMode && Plus@@index [ [ All , 2 ] ] Hue [ # 2 [ [ 1 ] ] ] ] ] ] , # 1 , Abs [ # 2 [ [ 2 ] ] ] ] , Nest [ Function [ arg , I f [ # 2 [ [ 1 ] ] RGBColor [ 0 , 0 , 0 ] ] ] , FontColor −>Hue [ # 2 [ [ 1 ] ] ] ] ] ] , # 1 , # 2 [ [ 2 ] ] ] ] & , ‘ 1 ‘ , index ] , form } , ‘ 1 ‘ [ v a r s ] } 284 , 285 I n t e r p r e t a t i o n B o x @ @ { RowBox [ { S u b s c r i p t B o x [ MakeBoxes [ ‘ 1 ‘ , form ] , RowBox [ MakeBoxes [ # , form ]&/@ ( Which[# >0 , StyleForm [ T o S t r i n g [ # ] , FontColor −>RGBColor [ 0 , 0 , 1 ] ] , # < 0 , StyleForm [ T o S t r i n g [ Abs [ # ] ] , FontColor −>RGBColor [ 1 , 0 , 0 ] ] , # = = 0 , T o S t r i n g [ Abs [ # ] ] ] & / @index [ [ All , 2 ] ] ) ] ] } ] , ‘ 1 ‘ [ v a r s ] } 286 ] 287 ] " , fun , T o S t r i n g [ $HatIndex , InputForm ] ] / / T o S t r i n g / / ToExpression ; 288 StringForm [ " ‘ 1 ‘ / : MakeBoxes [ ‘ 1 ‘ [ $ $ i d x _ _ I n t e g e r ] [ v a r s _ _ ] , form_ : StandardForm ] / ; MatchQ [ { v a r s } , { _ _ _ , _ + _ I n t e g e r , _ _ _ } ] : = Module [ { index = I f [ MatchQ [ # , _ + _ I n t e g e r ] , # / . ( a r g 1 _ + a r g 2 _ I n t e g e r ) −>{arg1 , arg2 } , { # , 0 } ] & /@{ v a r s } } , 289 index = index / . Rule@@@Thread [ { index [ [ All , 1 ] ] , Range [ Length [ index ] ] } ] ; 290 I f [ $TasosMode && Plus@@index [ [ All , 2 ] ] Hue [ # 2 [ [ 1 ] ] ] ] ] ] , # 1 , Abs [ # 2 [ [ 2 ] ] ] ] , Nest [ Function [ arg , I f [ # 2 [ [ 1 ] ] RGBColor [ 0 , 0 , 0 ] ] ] , FontColor −>Hue [ # 2 [ [ 1 ] ] ] ] ] ] , # 1 , # 2 [ [ 2 ] ] ] ] & , ‘ 1 ‘ , index ] , form } , ‘ 1 ‘ [ $$idx ] [ v a r s ] } 293 , 294 I n t e r p r e t a t i o n B o x @ @ { RowBox [ { S u b s c r i p t B o x [ MakeBoxes [ ‘ 1 ‘ , form ] , RowBox [ MakeBoxes [ # , form ]&/@ ( Which[# >0 , StyleForm [ T o S t r i n g [ # ] , FontColor −>RGBColor [ 0 , 0 , 1 ] ] , # < 0 , StyleForm [ T o S t r i n g [ Abs [ # ] ] , FontColor −>RGBColor [ 1 , 0 , 0 ] ] , # = = 0 , T o S t r i n g [ Abs [ # ] ] ] & / @index [ [ All , 2 ] ] ) ] ] } ] , ‘ 1 ‘ [ $$idx ] [ v a r s ] } 295 ] 296 ] " , fun , T o S t r i n g [ $HatIndex , InputForm ] ] / / T o S t r i n g / / ToExpression ; 297 fun 298 , 299 Message [ AddDiscreteFunction : : e x s t , fun ] ; 300 {} 301 ] 302 ] 303 304 AddDiscreteFunction [ f u n _ [ _ _ I n t e g e r ] ] : = AddDiscreteFunction [ fun ] 305 306 AddDiscreteFunction [ f u n _ [ v a r s _ _ ] ] : = AddDiscreteFunction [ fun ] 307 308 S e t A t t r i b u t e s [ AddDiscreteFunction , L i s t a b l e ] 309 310 (* 23/06/2006 *) 311 312 AlgebraFromSolution [ i g _ F u n c t i o n , s o l u t i o n _ L i s t ] : = Module [ { } , 313 Which [ MatchQ [ s o l u t i o n , { _ _ ? VectorQ } ] , MapAt [ S i m p l i f y O p e r a t o r [ i g / . # , RemoveFactor −>True ]& , s o l u t i o n ,1] , 314 MatchQ [ s o l u t i o n , { { _ L i s t , _ } . . } ] , MapAt [ S i m p l i f y O p e r a t o r [ i g / . # , RemoveFactor −>True ] & , # , { 1 , 1 } ] & / @solution , 315 MatchQ [ s o l u t i o n , { _ _ R u l e } ] , S i m p l i f y O p e r a t o r [ i g / . s o l u t i o n , RemoveFactor −>True ] , 316 True , { } 317 ] 318 ] 319 320 (* 13/07/2006 *) 321 322 A l i a s I n d e x = { } 323 324 A l i a s T a b l e = { } 325 326 $Cache = { } 327 328 C h a r a c t e r i s t i c D E q [ gform_Equal , Algebra : { _ _ F u n c t i o n } ] : = Module [ { e q i n f o = C h a r a c t e r i z e E q [ gform ] , system , solution } , 329 system = Si mp li f yE q [ ( X[ e q i n f o [ [ 1 ] ] , e q i n f o [ [ 2 ] ] , # ] [ gform ]&/ @Algebra ) / . MakeRule [ gform ] ] ; 330 s o l u t i o n = SolveOverdeterminedEqs [ system , ShowReport −> F a l s e ] ; 331 s o l u t i o n = s o l u t i o n / . s : { _ _ R u l e } : > ( gform / . s ) ; 332 s o l u t i o n / . { { s : _Equal , { _ _ _ }} − > s } / . { s : { _ _ }} − > s 333 ] 334 335 (* 28/03/2007 *) 336

90

Κ S

337 C h a r a c t e r i z e E q [ e q s _ L i s t , o p t s _ _ _ ] : = Module [ { EqsInfo = { } , l e n =Length [ eqs ] , v e r b o s e =Verbose / . { o p t s } / . Options [ C h a r a c t e r i z e E q ] , h=0 ,MaxOrder , DependentVariables , index , d e l t a = F a l s e } , EqsInfo = GetRawInfo [ eqs ] ; I f [ MemberQ [ EqsInfo , $Aborted ] , Abort [ ] ] ; I f [ verbose , h=GetNotebookHandle [ " C h a r a c t e r i z e E q " ] ] ; Do [ Ermis [ h , eqs [ [ i ] ] ] , { i , 1 , l e n } ] ; I f [ MatchQ [ EqsInfo , { _GetRawInfo . . } ] , Ermis [ h , " This i s not a system of e q u a t i o n s " , 2 ] ; Return [ { } ] ] ; I f [ MatchQ [ EqsInfo , { { } . . } ] , Ermis [ h , " This i s not a system of d i f f e r e n t i a l e q u a t i o n s " , 2 ] ; Return [ { } ] ] ; I f [ MemberQ [ EqsInfo , _GetRawInfo ] , Ermis [ h , " This i s not a w e l l d e f i n e d system " , 2 ] ; Return [ { } ] ] ; I f [ MemberQ [ EqsInfo , { } ] , Ermis [ h , " This system i n c l u d e s and a l g e b r a i c e q u a t i o n s " , 2 ] ; EqsInfo = S e l e c t [ EqsInfo , # = ! = { } & ] ; l e n = Length [ EqsInfo ] ]; I f [ Count [ eqs , D e r i v a t i v e [ _ _ ] [ _ ] [ _ _ ] , I n f i n i t y ] == 0 , d e l t a =True ] ; DependentVariables = Union [ F l a t t e n [ EqsInfo [ [ All , 2 ] ] ] ] ; EqsInfo ={ F l a t t e n [ EqsInfo [ [ All , 1 ] ] , 1 ] , F l a t t e n [ EqsInfo [ [ All , 2 ] ] ] , F l a t t e n [ EqsInfo [ [ All , 4 ] ] , 1 ] } ; index = F l a t t e n / @ ( P o s i t i o n [ EqsInfo [ [ 2 ] ] , # ] & / @DependentVariables ) ; EqsInfo ={ Union / @ ( EqsInfo [ [ 1 , # ] ] & / @index ) , DependentVariables , J o i n [ I n t e r s e c t i o n [ # , DependentVariables ] , Complement [ # , DependentVariables ] ] & /@ ( Union / @ ( F l a t t e n [ # , 1 ] & /@ ( EqsInfo [ [ 3 , # ] ] & / @index ) ) ) } ; 355 I f [ Times@@Length / @EqsInfo [ [ 1 ] ] ! = 1 , 356 index = Last / @ S e l e c t [ Transpose [ EqsInfo [ [ { 1 , 2 } ] ] ] , Length [ # [ [ 1 ] ] ] > 1 & ] ; 357 Message [ C h a r a c t e r i z e E q : : syswellformed , eqs , StringDrop [ StringDrop [ T o S t r i n g [ index ] , 1 ] , − 1 ] ] ; 358 Abort [ ] 359 ]; 360 EqsInfo [ [ 1 ] ] = F l a t t e n / @EqsInfo [ [ 1 ] ] ; 361 EqsInfo = { EqsInfo [ [ 1 ] ] , EqsInfo [ [ 2 ] ] , Transpose [ { EqsInfo [ [ 2 ] ] , Apply [ Max , Transpose / @ ( Rest [ # ] & / @EqsInfo [ [ 3 ] ] ) , { 2 } ] } ] , EqsInfo [ [ 3 ] ] } ; 362 I f [ Times@@Length / @EqsInfo [ [ 1 ] ] = = 1 , 363 Ermis [ h , " This i s a system of " T o S t r i n g [ l e n ] < > I f [ d e l t a , " Ordinary D i f f e r e n c e Equations " , " Ordinary D i f f e r e n t i a l Equations " ] , 2 ] ; 364 Ermis [ h , " Independent v a r i a b l e : " , F l a t t e n [ EqsInfo [ [ 1 ] ] ] ] ; 365 Ermis [ h , " Dependent v a r i a b l e ( s ) : " , EqsInfo [ [ 2 ] ] ] ; 366 Do [ 367 Ermis [ h , { " Order of O" I f [ d e l t a , " \ [ C a p i t a l D e l t a ] " , "D" ] < > " Es in r e s p e c t with " , " and " , " : " } , { EqsInfo [ [ 2 , i ] ] , F l a t t e n [ EqsInfo [ [ 1 ] ] ] [ [ 1 ] ] , Last [ EqsInfo [ [ 3 , i ] ] ] [ [ 1 ] ] } ] 368 , { i , Length [ EqsInfo [ [ 2 ] ] ] } ] ; EqsInfo 369 , 370 I f [ SameQ@@Length / @EqsInfo [ [ 1 ] ] , 371 Ermis [ h , " This i s a system of " T o S t r i n g [ l e n ] < > I f [ d e l t a , " P a r t i a l D i f f e r e n c e Equations " , " P a r t i a l D i f f e r e n t i a l Equations " ] , 2 ] ; 372 , 373 Ermis [ h , " This i s a system of " T o S t r i n g [ l e n ] < > " D i f f e r e n t i a l Equations " , 2 ] ; 374 ]; 375 Ermis [ h , " Independent v a r i a b l e s : " , Union [ F l a t t e n [ EqsInfo [ [ 1 ] ] ] ] ] ; 376 Ermis [ h , " Dependent v a r i a b l e ( s ) : " , EqsInfo [ [ 2 ] ] ] ; 377 Do [ 378 Do [ 379 Ermis [ h , { " Order of P" I f [ d e l t a , " \ [ C a p i t a l D e l t a ] " , "D" ] < > " Es in r e s p e c t with " , " and " , " : " } , { EqsInfo [ [ 2 , i ] ] , EqsInfo [ [ 1 , i , j ] ] , Last [ EqsInfo [ [ 3 , i ] ] ] [ [ j ] ] } ] ; 380 , { j , 1 , Length [ EqsInfo [ [ 1 , i ] ] ] } ] 381 , { i , Length [ EqsInfo [ [ 2 ] ] ] } ] ; EqsInfo 382 ] 383 ] 384 385 C h a r a c t e r i z e E q [ eq_ , o p t s _ _ _ ] : = Module [ { EqInfo = { } , l e n =0 , v e r b o s e = Verbose / . { o p t s } / . Options [ C h a r a c t e r i z e E q ] , h =0 , temp =0 , d e l t a = F a l s e } , 386 EqInfo=GetRawInfo [ eq ] ; 387 I f [ EqInfo===$Aborted , Abort [ ] ] ; 388 I f [ Count [ eq , D e r i v a t i v e [ _ _ ] [ _ ] [ _ _ ] , I n f i n i t y ] == 0 , d e l t a =True ] ; 389 I f [ verbose , h=GetNotebookHandle [ " C h a r a c t e r i z e E q " ] ] ; 390 Ermis [ h , eq ] ; 391 I f [ Head [ eq ]=== Equal , 392 I f [ ! EqInfo = = = { } , 393 l e n =Length [ EqInfo [ [ 2 ] ] ] ; 394 I f [ l e n ==1 , 395 l e n =Length [ F l a t t e n [ EqInfo [ [ 1 ] ] ] ] ; 396 I f [ l e n ==1 , 397 Ermis [ h , " The Equation i s an Ordinary " I f [ d e l t a , " D i f f e r e n c e " , " D i f f e r e n t i a l " ] < > " Equation " , 2 ] ; 398 Ermis [ h , " Independent v a r i a b l e : " , F l a t t e n [ EqInfo [ [ 1 ] ] ] ] ; 399 Ermis [ h , " Dependent v a r i a b l e : " , EqInfo [ [ 2 ] ] ] ; 400 Ermis [ h , " Order of O" I f [ d e l t a , " \ [ C a p i t a l D e l t a ] " , "D" ] < > "E : " , Last [ F l a t t e n [ EqInfo [[3]] ,1]] ]; 401 , 402 Ermis [ h , " The Equation i s a P a r t i a l " I f [ d e l t a , " D i f f e r e n c e " , " D i f f e r e n t i a l " ] < > " Equation " , 2 ] ; 403 Ermis [ h , " Independent v a r i a b l e s : " , F l a t t e n [ EqInfo [ [ 1 ] ] ] ] ; 404 Ermis [ h , " Dependent v a r i a b l e : " , EqInfo [ [ 2 ] ] ] ; 405 Do [ 406 Ermis [ h , { " Order of P" I f [ d e l t a , " \ [ C a p i t a l D e l t a ] " , "D" ] < > "E in r e s p e c t with " , " : " } , { EqInfo [ [ 1 , 1 , i ] ] , Last [ EqInfo [ [ 3 , 1 ] ] ] [ [ i ] ] } ] 407 , { i , len } ] 408 ] ; EqInfo 409 , 410 l e n =Times@@Length / @EqInfo [ [ 1 ] ] ; 411 I f [ l e n ==1 && SameQ@@EqInfo [ [ 1 ] ] , 412 Ermis [ h , " The Equation i s an Ordinary " I f [ d e l t a , " D i f f e r e n c e " , " D i f f e r e n t i a l " ] < > " Equation " , 2 ] ; 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354

91

413 414 415 416 417 418 419 420 421 422 423 424

Ermis [ h , " Independent v a r i a b l e s : " , F l a t t e n [ EqInfo [ [ 1 ] ] ] ] ; Ermis [ h , " Dependent v a r i a b l e s : " , EqInfo [ [ 2 ] ] ] ; Do [ Ermis [ h , { " Order of O" I f [ d e l t a , " \ [ C a p i t a l D e l t a ] " , "D" ] < > "E in r e s p e c t with " , " : " } , { EqInfo [ [ 2 , i ] ] , Last [ F l a t t e n [ EqInfo [ [ 3 , i ] ] ] ] } ] , { i , Length [ EqInfo [ [ 2 ] ] ] } ] ; EqInfo , temp=Union [ F l a t t e n [ EqInfo [ [ 1 ] ] ] ] ; Ermis [ h , " The Equation i s a " I f [ d e l t a , " D i f f e r e n c e " , " D i f f e r e n t i a l " ] < > " Equation " ,2]; Ermis [ h , " Independent v a r i a b l e s : " , temp ] ; Ermis [ h , " Dependent v a r i a b l e s : " , EqInfo [ [ 2 ] ] ] ; Do [ Do [ Ermis [ h , { " Order of " I f [ d e l t a , " \ [ C a p i t a l D e l t a ] " , "D" ] < > "E in r e s p e c t with " , " and " , " : " } , { EqInfo [ [ 2 , i ] ] , EqInfo [ [ 1 , i , j ] ] , Last [ EqInfo [ [ 3 , i ] ] ] [ [ j ] ] } ] , { j , 1 , Length [ EqInfo [ [ 1 , i ] ] ] } ] , { i , Length [ EqInfo [ [ 2 ] ] ] } ] ; EqInfo ] ] , Ermis [ h , " This i s an A l g e b r a i c Equation " , 2 ] ; { } ] , Ermis [ h , " This i s not an Equation " , 2 ] ; { } ]

425 426 427 428 429 430 431 432 433 434 435 436 ] 437 438 (* 14/03/2006 *) 439 440 C l a s s i c a l S y m m e t r i e s [ e q s _ , o p t s _ _ _ ] / ; MatchQ [ eqs , _Equal | L i s t [ _ _ E q u a l ] ] : = Module [ { i n f g , d e t 1 , det2 , ans , oldvalue , i n c r e m e n t a l = I n c r e m e n t a l / . { o p t s } / . Options [ C l a s s i c a l S y m m e t r i e s ] , h , vars , s u b s t i t u t i o n s , remnant , DependentVariables , index , h i n t s } , 441 o l d v a l u e =$HistoryLength ; 442 $HistoryLength = 0 ; 443 I f [ ! i n c r e m e n t a l | | Head [ eqs ]=== Equal , 444 ans = DeterminingEqs [ eqs , o p t s ] ; 445 I f [ Length [ ans ] == 3 , { i n f g , d e t 1 , de t 2 } = ans , Return [ { } ] ] ; 446 , 447 (* In incremental mode the most simple of the symmetries conditions is solved and then substituted in the rest and so on *) 448 ans = DeterminingEqs [ eqs , o p t s ] ; 449 { h , DependentVariables , vars , s u b s t i t u t i o n s , i n f g , h i n t s , d e t 1 } = ans ; 450 det2 = { } ; 451 CreateAlias [ vars ] ; 452 While [ Length [ d e t 1 ] >0 , 453 I f [ Length [ d e t 1 ] > 1 , d e t 1 = S o r t [ d e t 1 , LeafCount [ # 1 ] < LeafCount [ # 2 ] & ] ] ; 454 AppendTo [ det2 , F i r s t [ d e t 1 ] ] ; 455 d e t 1 = Rest [ d e t 1 ] ; 456 index = Length [ d e t 2 ] ; 457 d e t 2 [ [ index ] ] = d e t 2 [ [ index ] ] / / . h i n t s / . s u b s t i t u t i o n s ; 458 ans = Complement [ Cases [ { de t 2 [ [ index ] ] } , D e r i v a t i v e [ _ _ I n t e g e r ] [ Alternatives@@DependentVariables ] [ _ _ ] , I n f i n i t y ] / / Union , v a r s ] ; 459 (* ’Elegqoc gia to an pragmatik’a qrei’azetai na dr’asei h entol’h Together p’anw stic grammikopoihm’enec sunj’hkec summetriac *) 460 I f [ Count [ Cases [ d e t 2 [ [ index ] ] , _ R a t i o n a l | Power [ _ , − 1 ] , I n f i n i t y ] / / Union , Alternatives@@ans , I n f i n i t y ] >0 , 461 d e t 2 [ [ index ] ] = Numerator [ Together [ d e t 2 [ [ index ] ] ] ] 462 ]; 463 Do [ d e t 2 [ [ index ] ] = F l a t t e n [ C o e f f i c i e n t L i s t [ d e t 2 [ [ index ] ] , ans [ [ i ] ] ] ] , { i , 1 , Length [ ans ] } ] ; 464 (* Sth parak’atw grammh oi kajoristik’ec exis’wseic aplopoio’untai lamb’anontac up’oyhn ’oti isq’uoun gia k’aje tim’h m’esa ston ant’istoiqo q’wro jet *) 465 d e t 2 [ [ index ] ] = RemoveIdentity [ Union [ S im pl if yE q [#==0 , Union [ vars , ans ] ] & / @det2 [ [ index ] ] ] ] ; 466 remnant = S e l e c t [ d e t 2 [ [ index ] ] , Count [ { # } , Alternatives@@ans , I n f i n i t y ] >0&]; 467 I f [ remnant = ! = { } , 468 P r i n t [ "Non polynomial form of t h e v a r i a b l e s " , remnant , " d e t e c t e d " ] ; 469 d e t 2 [ [ index ] ] = Union [ Complement [ d e t 2 [ [ index ] ] , remnant ] , F l a t t e n [ OrphanSplit [ # , ans , vars , 1 ] & / @remnant ] ] 470 ]; 471 { vars , d e t 2 [ [ index ] ] , d e t 1 } = { vars , d e t 2 [ [ index ] ] , d e t 1 } / . Reverse / @AliasTable ; 472 det2 = Flatten [ det2 ] ; 473 { det2 , d e t 1 } = { Si m pl if yE q [ Union [ Cases [ # , _Equal ] ] , v a r s ] , Union [ Numerator [ Together [ # ] ] & / @DeleteCases [ # , _Equal ] , I f [ Length [ d e t 1 ] >0 , Rest [ d e t 1 ] , { } ] ] } & @ F l a t t e n [ F i x e d P o i n t [ SimplifySystemOnce [ # , v a r s ] & , { { } , det2 , I f [ Length [ d e t 1 ] >0 , d e t 1 [ [ { 1 } ] ] / . s u b s t i t u t i o n s , { } ] } ] ] ; 474 d e t 2 = RemoveIdentity [ d e t 2 ] ; 475 { vars , d e t 1 } = { vars , d e t 1 } / . A l i a s T a b l e ; 476 ]; 477 d e t 2 = S o r t [ d e t 2 / . A l i a s T a b l e , LeafCount [ # 1 ] < LeafCount [ # 2 ] & ] 478 ]; 479 ans = SolveOverdeterminedEqs [ det2 , o p t s ] ; 480 I f [ MatchQ [ ans , { _ _ ? VectorQ } ] , 481 ans = MapAt [ S i m p l i f y O p e r a t o r [ i n f g / . # ] & , ans , 1 ] ; 482 ans = OneParameterAlgebra [ ans ] / / Union ; 483 ans = DeleteCases [ ans , { } ] ; 484 HistoryLength = o l d v a l u e ;

92

Κ S

485

486 487 488 489 490

S o r t [ I f [ Head [ # ] === L i s t && # = ! = { } , MapAt [ S i m p l i f y O p e r a t o r [ # , RemoveFactor −>True ] & , # , 1 ] / / F l a t t e n , S i m p l i f y O p e r a t o r [ # , RemoveFactor −>True ] ] & / @ans , LeafCount [ I f [ MatchQ [ # 1 , _ F u n c t i o n ] , # 1 , # 1 [ [ 1 ] ] ] ] < LeafCount [ I f [ MatchQ [ # 2 , _ F u n c t i o n ] , # 2 , # 2 [ [ 1 ] ] ] ] & ] , ans = MapAt [ S i m p l i f y O p e r a t o r [ i n f g / . # ] & , # , { 1 , 1 } ] & / @ans ; ans = MapAt [ Union [ OneParameterAlgebra [ # ] ] & , # , 1 ] & / @ans ; HistoryLength = o l d v a l u e ; MapAt [ S o r t [ I f [ Head [ # ] === L i s t && # = ! = { } , MapAt [ S i m p l i f y O p e r a t o r [ # , RemoveFactor −>True ] & , # , 1 ] / / F l a t t e n , S i m p l i f y O p e r a t o r [ # , RemoveFactor −>True ] ] & /@# , LeafCount [ I f [ MatchQ [ # 1 , _ F u n c t i o n ] , # 1 , # 1 [ [ 1 ] ] ] ] < LeafCount [ I f [ MatchQ [ # 2 , _ F u n c t i o n ] , # 2 , # 2 [ [ 1 ] ] ] ] & ] & , # , 1 ] & / @ans ]

491 492 ] 493 494 (* 04/11/2006 *) 495 496 C l a s s i f y S e t [ s e t _ L i s t ] : = Module [ { c s e t = { } , index = { } , remset = { } , MaxRank , MaxSelection } , 497 I f [ Length [ s e t ] == 1 , Return [ { s e t } ] ] ; 498 MaxRank = Max [ Length / @ s e t [ [ All , 1 ] ] ] ; 499 MaxSelection = S e l e c t [ s e t , Length [ # [ [ 1 ] ] ] == MaxRank& ] ; 500 index = MaxSelection [ [ All , 1 ] ] / / Union ; 501 I f [ Length [ index ] < Length [ MaxSelection ] , 502 MaxSelection = F l a t t e n [ S e l e c t [ MaxSelection , Function [ x , x [ [ 1 ] ] === # ] , 1 ] & / @ index , 1 ] 503 ]; 504 c s e t = { # , Sequence@@Select [ DeleteCases [ s e t , # ] , Function [ x , Union [ # [ [ 1 ] ] , x [ [ 1 ] ] ] === Union [ # [ [ 1 ] ] ] ] ]}& / @ MaxSelection ; 505 c s e t = S o r t [ # , Length [ # 1 [ [ 1 ] ] ] > Length [ # 2 [ [ 1 ] ] ] & ]& / @ c s e t ; 506 remset = Complement [ s e t , F l a t t e n [ c s e t , 1 ] ] ; 507 I f [ remset = ! = { } , 508 remset = C l a s s i f y S e t [ remset ] ; 509 Return [ J o i n [ c s e t , remset ] ] 510 , 511 Return [ c s e t ] 512 ] 513 ] 514 515 (* 1/09/2004 *) 516 517 CleanUpConstants [ s e t O f E q s _ L i s t ] : = Module [ { ReplacementRules = { } , len , o f f s e t } , 518 I f [ Count [ setOfEqs , Const [ _ I n t e g e r ] | FreeFunc [ _ I n t e g e r ] , I n f i n i t y , Heads −> True ] > 0 , 519 ReplacementRules = { Cases [ setOfEqs , FreeFunc [ i n d e x _ I n t e g e r ] , I n f i n i t y , Heads −> True ] / / Union , Cases [ setOfEqs , Const [ i n d e x _ I n t e g e r ] , I n f i n i t y , Heads −> True ] / / Union } ; 520 o f f s e t = Max [ Union [ Cases [ setOfEqs , HoldPattern [ FreeFunc [ i d x _ ]−> _ F u n c t i o n ]−>idx , I n f i n i t y ] , Cases [ A l i a s T a b l e [ [ All , 2 ] ] , FreeFunc [ i d x _ ]−>idx , I n f i n i t y ] , { 0 } ] ] ; 521 ReplacementRules [ [ 1 ] ] = DeleteCases [ ReplacementRules [ [ 1 ] ] , FreeFunc [ i _ / ; i { var } , I n f i n i t y ] ] / @ { op1 , op2 } ] ] ; 534 I f [ v a r s === { } , 535 r e s = op1 [ op2 [ TestFunc ] ] − op2 [ op1 [ TestFunc ] ] / / $ S i m p l i f i c a t i o n F u n c t i o n ; 536 Function@@ { r e s / . TestFunc −> S l o t [ 1 ] } 537 , 538 r e s = op1 [ op2 [ TestFunc@@vars ] ] − op2 [ op1 [ TestFunc@@vars ] ] / / $ S i m p l i f i c a t i o n F u n c t i o n ; 539 r e s = r e s / . { TestFunc@@vars −> S l o t [ 1 ] , HoldPattern [ D e r i v a t i v e [ i n d e x _ _ I n t e g e r ] [ TestFunc ] [ i v s _ _ ] ] : > P a r t i a l [ Sequence@@Flatten [ Table [ I f [ { index } [ [ i ] ] == 0 , { } , { i v s } [ [ i ] ] ∗ Array [ 1 & , { index } [ [ i ] ] ] ] , { i , 1 , Length [ { index } ] } ] ] ] } ; 540 I f [ Head [ r e s ] = ! = Function , Function@@ { r e s } , r e s ] 541 ] 542 ] 543 544 Commutator [ op1_Function , op2_ ] : = Module [ { } , 545 Commutator [ op1 , op2 #&] 546 ] 547 548 Commutator [ o p 1 _ , op2_Function ] : = Module [ { } , 549 − Commutator [ op2 , op1 ] 550 ] 551 552 Commutator [ o p 1 _ , op2_ ] : = Module [ { } , 553 I f [ op1 === op2 , Return [ 0 ] ] ; 554 Identity@@Commutator [ op1 #&,op2 #&] 555 ] 556 557 (* 15/09/2004 *) 558 559 (* TODO aporr’ofhsh metablht’wn m’esa stic auja’iretec sunart’hseic *) 560

93

561 CommutatorTable [ S u b S e t _ ? VectorQ , s t r u c t u r e c o n s t a n t s _ , o p t s _ _ _ ] / ; ArrayQ [ s t r u c t u r e c o n s t a n t s , 3 ] : = Module [ { showtable=ShowTable / . { o p t s } / . Options [ CommutatorTable ] , l e n = Dimensions [ s t r u c t u r e c o n s t a n t s ] [ [ 3 ] ] , index , xs } , 562 I f [ l e n < Length [ SubSet ] , P r i n t [ " The Base of t h e SubSet i s l a r g e r than t h e given Algebra " ] ; Abort []]; 563 index = F l a t t e n [ List@@@SubSet ] ; 564 xs = CommutatorTable [ s t r u c t u r e c o n s t a n t s [ [ index , index , A l l ] ] ] ; 565 I f [ showtable , P r i n t [ { Prepend [ SubSet , " [ , ] " ] , Sequence @@ Table [ { X[ index [ [ i ] ] ] , Sequence@@xs [ [ i , A l l ] ] } , { i , 1 , Length [ index ] } ] } / / TableForm ] ] ; 566 I f [ SubAlgebraQ [ s t r u c t u r e c o n s t a n t s , SubSet ] , s t r u c t u r e c o n s t a n t s [ [ # , # , # ] ] & [ index ] , P r i n t [ " Not A SubAlgebra " ] ] 567 ] 568 569 CommutatorTable [ o p l i s t _ ? VectorQ , o p t s _ _ _ ] : = Module [ { showtable=ShowTable / . { o p t s } / . Options [ CommutatorTable ] , l e n = Length [ o p l i s t ] , xs , c t a b l e , o p e r a t o r s = S i m p l i f y O p e r a t o r / @ S e l e c t [ o p l i s t , MatchQ [ # , _ F u n c t i o n ] & ] , v a r s = Cases [ o p l i s t , HoldPattern [D[ S l o t [ _ I n t e g e r ] , v a r _ _ ] ] : > { var } , I n f i n i t y ] / / F l a t t e n / / Union , rem , candies , TestFunc , f a c t o r , sc , matrixsum , pos } , 570 l e n = Length [ o p e r a t o r s ] ; 571 o p e r a t o r s = o p e r a t o r s / . ( # [ _ _ ] − >#&/@vars ) ; 572 $HistoryLength = 0 ; 573 c t a b l e = Array [ I f [ # 1 < #2 , Commutator [ o p e r a t o r s [ [ # 1 ] ] , o p e r a t o r s [ [ # 2 ] ] ] / / S i m p l i f y O p e r a t o r , 0 ] & , { len , len } ] ; 574 c t a b l e = c t a b l e / . Rule@@@Thread [ { o p e r a t o r s , Array [ X, l e n ] } ] / . ( 0 & ) −>0; 575 rem = Cases [ c t a b l e , Function [ _ ] , 2 ] / / Union ; 576 I f [ ! LinearIndependentQ [ o p e r a t o r s , v a r s ] , Message [ CommutatorTable : : lndep ] ] ; 577 Do [ 578 Do [ I f [ Commutator [ o p e r a t o r s [ [ j ] ] , rem [ [ i ] ] ] = ! = 0&, Continue [ ] ] ; 579 I f [ v a r s === { } , 580 I f [ Count [ { f a c t o r = $ S i m p l i f i c a t i o n F u n c t i o n [ o p e r a t o r s [ [ j ] ] [ TestFunc ] / rem [ [ i ] ] [ TestFunc ] ] } , A l t e r n a t i v e s @ @ v a r s , I n f i n i t y ] > 0 , Continue [ ] ] 581 , 582 I f [ Count [ { f a c t o r = $ S i m p l i f i c a t i o n F u n c t i o n [ o p e r a t o r s [ [ j ] ] [ TestFunc@@vars ] / rem [ [ i ] ] [ TestFunc@@vars ] ] } , A l t e r n a t i v e s @ @ v a r s , I n f i n i t y ] > 0 , Continue [ ] ] 583 ]; 584 c t a b l e = c t a b l e / . rem [ [ i ] ] −> (X[ j ] / f a c t o r ) ; 585 rem [ [ i ] ] = { } 586 , { j , 1 , len } ] 587 , { i , 1 , Length [ rem ] } ] ; 588 rem = F l a t t e n [ rem ] ; 589 Do [ f a c t o r = LinearDependency [ rem [ [ i ] ] , o p e r a t o r s , v a r s ] ; 590 I f [ factor =!= { } , 591 I f [ MatchQ [ f a c t o r , { _ L i s t , { _ _ R u l e } } ] , 592 I f [ ! And@@ ( F l a t t e n [ Function [ elem , MemberQ [ # 1 , elem ] ] / @#2&@@@( Union [ F l a t t e n [ Cases [ { # } , ( ( FreeFunc [ _ _ I n t e g e r ] | OverTilde [ FreeFunc [ _ _ I n t e g e r ] ] ) [ $ v a r s _ _ ] | D e r i v a t i v e [ _ _ I n t e g e r ] [ FreeFunc [ _ _ I n t e g e r ] | OverTilde [ FreeFunc [ _ _ I n t e g e r ] ] ] [ $ v a r s _ _ ] ) : > { $vars } , I n f i n i t y ] ] ] & / @ ( List@@ # ) &/ @ f a c t o r [ [ 2 ] ] ) ] ) , factor = { } ] ; 593 I f [ factor =!= { } , 594 pos = P o s i t i o n [ c t a b l e , rem [ [ i ] ] ] / / F i r s t ; 595 P r i n t [ StyleForm [ " For t h e commutator [ " , FontColor −>RGBColor [ 0 , 0 , 1 ] , FontSlant −>" I t a l i c " ] , StyleForm [X[ pos [ [ 1 ] ] ] , FontColor −>RGBColor [ 0 , 0 , 1 ] , FontSlant −>" I t a l i c " ] , StyleForm [ " , " , FontColor −>RGBColor [ 0 , 0 , 1 ] , FontSlant −>" I t a l i c " ] , StyleForm [X[ pos [ [ 2 ] ] ] , FontColor −>RGBColor [ 0 , 0 , 1 ] , FontSlant −>" I t a l i c " ] , StyleForm [ " ] I used t h e s u b s t i t u t i o n ( s ) : " , FontColor −>RGBColor [ 0 , 0 , 1 ] , FontSlant −>" Italic " ]]; 596 Print / @factor [ [ 2 ] ] ; 597 pos = . ; 598 factor = factor [ [ 1 ] ] 599 ] 600 ]; 601 I f [ factor =!= { } , 602 c t a b l e = c t a b l e / . rem [ [ i ] ] −> Sum [ f a c t o r [ [ j ] ] ∗ X[ j ] , { j , 1 , l e n } ] 603 , 604 c t a b l e = c t a b l e / . rem [ [ i ] ] −> { } 605 ] 606 ] 607 , { i , 1 , Length [ rem ] } ] ; 608 matrixsum = Sum [ s c [ i ] ∗ o p e r a t o r s [ [ i ] ] , { i , 1 , l e n } ] ; 609 I f [ showtable , 610 xs = c t a b l e − Transpose [ c t a b l e ] ; 611 xs = { Prepend [ Array [ X, l e n ] , " [ , ] " ] , Sequence @@ Table [ { X[ i ] , Sequence@@xs [ [ i , A l l ] ] } , { i , 1 , len } ] } ; 612 P r i n t [ TableForm [ xs ] ] 613 ]; 614 $HistoryLength = I n f i n i t y ; 615 Do [ c t a b l e [ [ i , i ] ] = Array [0& , l e n ] , { i , 1 , l e n } ] ; 616 Do [ Do [ I f [ i >= j , Continue [ ] ] ; 617 I f [ c t a b l e [ [ i , j ] ] === 0 , 618 c t a b l e [ [ i , j ] ] = Array [0& , l e n ] 619 , 620 c t a b l e [ [ i , j ] ] = C o e f f i c i e n t [ c t a b l e [ [ i , j ] ] , # ] & / @ Array [ X, l e n ] 621 ] 622 , { j , 1 , len } ] 623 , { i , 1 , len } ] ; 624 c t a b l e = c t a b l e − Transpose [ c t a b l e ] 625 ] 626 627 CommutatorTable [ o p l i s t : { ( _ F u n c t i o n | { _Function , { _ _ E q u a l } } ) . . } , o p t s _ _ _ ] : = { CommutatorTable [ Cases [ o p l i s t / / F l a t t e n , _ F u n c t i o n ] , o p t s ] , Cases [ o p l i s t / / F l a t t e n , _Equal ] } 628

94

Κ S

629 CommutatorTable [ o p l i s t _ L i s t , o p t s _ _ _ ] / ; MatchQ [ o p l i s t , { { _ L i s t , _ } . . } ] : = MapAt [ CommutatorTable [ # , o p t s ]& , # ,1]&/ @oplist 630 631 CommutatorTable [ s t r u c t u r e c o n s t a n t s _ ] / ; ArrayQ [ s t r u c t u r e c o n s t a n t s , 3 ] : = Module [ { l e n = Dimensions [ s t r u c t u r e c o n s t a n t s ] , i j l e n , AlgebraSet , xs } , 632 I f [ len [ [ 1 ] ] =!= len [ [ 2 ] ] , 633 P r i n t [ " I n v a l i d s t r u c t u r e c o n s t a n t s d e t e c t e d " ] ; Abort [ ] 634 , 635 i j l e n = len [ [ 1 ] ] ; 636 len = len [ [ 3 ] ] 637 ]; 638 A l g e b r a S e t = X/ @Table [ i , { i , l e n } ] ; 639 xs = Array [ 0 & , { i j l e n , i j l e n } ] ; 640 Do [ 641 Do [ I f [ i >= j , Continue [ ] ] ; 642 xs [ [ i , j ] ] = A l g e b r a S e t . s t r u c t u r e c o n s t a n t s [ [ i , j ] ] 643 ,{ j ,1 , ijlen }] 644 ,{ i ,1 , ijlen } ] ; 645 xs = xs − Transpose [ xs ] 646 ] 647 648 (* 13/07/2006 *) 649 650 C o m p a t i b i l i t i e s [ e q s _ L i s t ] : = Module [ { index = { } , maxorder , c o e f f , $A, vars , r e s u l t } , 651 v a r s = Cases [ eqs , D e r i v a t i v e [ _ _ ] [ _ ] [ i v s _ _ ] | FreeFunc [ _ _ I n t e g e r ] [ i v s _ _ ] − >{ i v s } , I n f i n i t y ] / / F l a t t e n / / Union ; 652 index = S e l e c t [ { # , LeadingOrder [ # , v a r s ] } & / @eqs , # [ [ 2 ] ] = ! = { } & ] ; 653 index = F l a t t e n [ I f [ ( c o e f f = C o e f f i c i e n t [ # 1 [ [ 1 ] ] − # 1 [ [ 2 ] ] , # 2 ] ) === 1 , F l a t t e n [ S o l v e [ # 1 , # 2 ] ] , Map [ c o e f f #1& , F l a t t e n [ S o l v e [ # 1 , # 2 ] ] , { 2 } ] ]&@@@index ] ; 654 index = DeleteCases [ Union / @Last [ Reap [ Sow [ # , Cases [ { # [ [ 1 ] ] } , D e r i v a t i v e [ _ _ ] [ f u n _ ] [ _ _ ]−>fun , I n f i n i t y , 1 ] / / F i r s t ]&/ @index ] ] , { _ } ] ; 655 I f [ index = = = { } , Return [ { } ] ] ; 656 I f [ $VersionNumber < 5 . 1 , 657 index = S e l e c t [ F l a t t e n [ DiscreteMath ‘ Combinatorica ‘ KSubsets [ # , 2 ] & / @index , 1 ] , # [ [ 1 ] ] = ! = #[[2]]&] 658 , 659 index = S e l e c t [ F l a t t e n [ S u b s e t s [ # , { 2 } ] & / @index , 1 ] , # [ [ 1 ] ] = ! = # [ [ 2 ] ] & ] 660 ]; 661 r e s u l t = DeleteCases [ ( maxorder=Cases [ { # } , D e r i v a t i v e [ i d x _ _ I n t e g e r ] [ _ ] [ i v s _ _ ] − >{{ i d x } , { i v s } } , I n f i n i t y , 1 ] [ [ 1 ] ] & / @ ( F i r s t / @{ # 1 , # 2 } ) ; v a r s = maxorder ; maxorder=maxorder [ [ All , 1 ] ] ; maxorder = Max@@@Transpose [ maxorder ] / / F l a t t e n ; c o e f f = { # 1 [ [ 1 ] ] , # 2 [ [ 1 ] ] } / . D e r i v a t i v e [ _ _ ] [ _ ] [ _ _ ] − >1; Si mp li fy E q [D [ # 1 [ [ 2 ] ] / c o e f f [ [ 1 ] ] , Sequence@@ ( Transpose [ { v a r s [ [ 1 , 2 ] ] , maxorder − v a r s [ [ 1 , 1 ] ] } ] ) ] − D [ # 2 [ [ 2 ] ] / c o e f f [ [ 2 ] ] , Sequence@@Transpose [ { v a r s [ [ 1 , 2 ] ] , maxorder − v a r s [ [ 2 , 1 ] ] } ] ] = = 0 , v a r s [ [ 1 , 2 ] ] ] ) &@@@index , True ] ; 662 maxorder = C h a r a c t e r i z e E q [ eqs ] [ [ 3 ] ] / . x : { _ , { _ _ I n t e g e r } } : > Rule@@x ; 663 r e s u l t = S e l e c t [ r e s u l t , C h a r a c t e r i z e E q [ # ] === { } | | And@@CharacterizeEq [ # ] [ [ 3 ] ] / . maxorder / . { x : { _ _ I n t e g e r } , y : { _ _ I n t e g e r } } : > And@@NonNegative [ x−y ] & ] ; 664 I f [ r e s u l t === { } | | Count [ r e s u l t , F a l s e ] >0 , r e s u l t , F l a t t e n [ { r e s u l t , C o m p a t i b i l i t i e s [ r e s u l t ] } ] ] 665 ] 666 667 (* 19/07/2008 *) 668 669 C o m p a t i b i l i t y L i s t [ c a n d i e s _ L i s t , l i s t _ L i s t ] / ; MatchQ [ l i s t , { { { _ _ R u l e } , { _ I n t e g e r } } . . } ] : = Module [ { temp , s u b s t i t u t i o n s , index = { } } , 670 I f [ MatchQ [ l i s t , { { { _ _ R u l e } , { _ I n t e g e r } } } ] , Return [ { R e p l a c e P a r t [ candies , F i r s t [ # ] , l i s t [ [ 1 , 2 ] ] ] , { } } & / @list [ [ 1 , 1 ] ] ] ] ; 671 Do [ temp = { l i s t [ [ 1 , 1 , { i } ] ] , l i s t [ [ 1 , 2 ] ] } ; 672 s u b s t i t u t i o n s = MakeRule [ temp [ [ 1 , 1 , 1 ] ] − > 0 ] ; 673 temp = J o i n [ { MapAt [ F i r s t / @#&,temp , 1 ] } , MapAt [ S e l e c t [ # , ( # [ [ 1 ] ] / / . s u b s t i t u t i o n s ) =!=0&]& ,# ,1]&/ @Rest [ l i s t ] ] ; 674 AppendTo [ index , temp ] 675 , { i , 1 , Length [ l i s t [ [ 1 , 1 ] ] ] } ] ; 676 { R e p l a c e P a r t [ candies , F i r s t [ # 1 ] , # 2 ] &@@ # [ [ 1 ] ] , Rest [ # ] } & / @index 677 ] 678 679 C o m p a t i b i l i t y L i s t [ c a n d i e s _ L i s t , { } ] = { { candies , { } } } 680 681 (* 06/05/2005 *) 682 683 CompleteSymmetries [ de_Equal ] : = Module [ { ps = C l a s s i c a l S y m m e t r i e s [ de ] } , 684 ps / . s : { _ _ F u n c t i o n } : > CompleteSymmetries [ de , s ] 685 ] 686 687 CompleteSymmetries [ de_Equal , Algebra : { _ _ F u n c t i o n } ] : = Module [ { c s = CommutatorTable [ Algebra , ShowTable −> F a l s e ] , t a r g e t s u b g r o u p s , c l o s e d s u b a l g e b r a s , e q i n f o = C h a r a c t e r i z e E q [ de ] , r e s u l t = { } , index } , 688 c l o s e d s u b a l g e b r a s = FindAllSubAlgebras [ cs , Algebra ] ; 689 index = Length [ J e t S p a c e [ Max / @eqinfo [ [ 3 , All , 2 ] ] , e q i n f o [ [ 1 ] ] , e q i n f o [ [ 2 ] ] ] ] − 1 ; 690 While [ r e s u l t === {}&& index S e l e c t [ s , MatchQ [ # , { True , _ } ] & ] / . { } | { False , _ } −> F a l s e ; 699 r e s u l t = F l a t t e n [ { Pick [ t a r g e t s u b g r o u p s , r e s u l t ] , Thread [ { Pick [ t a r g e t s u b g r o u p s , r e s u l t , { True , _ } ] , Cases [ r e s u l t , { True , s _ } −> s ] } ] } , 1 ] 700 ]

95

701 702 (* 28/03/2007 *) 703 704 CompleteSymmetryAlgebraQ [ de : D e r i v a t i v e [ _ _ ] [ _ ] [ _ _ ]== _ , Algebra : { _ _ F u n c t i o n } ] : = Module [ { e q i n f o = C h a r a c t e r i z e E q [ de ] , j e t , gform , system = { } , s o l u t i o n } , 705 j e t = J e t S p a c e [ Max / @eqinfo [ [ 3 , All , 2 ] ] , e q i n f o [ [ 1 ] ] , e q i n f o [ [ 2 ] ] ] ; 706 gform=de [ [ 1 ] ] ==Unique [ F ] @@DeleteCases [ j e t , de [ [ 1 ] ] ] ; 707 s o l u t i o n = C h a r a c t e r i s t i c D E q [ gform , Algebra ] ; 708 Which [ 709 MatchQ [ s o l u t i o n , _Equal ] , S i m p l i f y [ de [ [ 1 ] ] − de [ [ 2 ] ] − s o l u t i o n [ [ 1 ] ] + s o l u t i o n [ [ 2 ] ] ] = = = 0 , 710 MatchQ [ s o l u t i o n , { { _Equal , _ } . . } | { _Equal , _ } ] , s o l u t i o n / . { s_Equal , t _ } : > { S i m p l i f y [ de [ [ 1 ] ] − de [ [ 2 ] ] − s [ [ 1 ] ] + s [[2]]]===0 , t } , 711 True , F a l s e 712 ] 713 ] 714 715 (* 28/03/2007 *) 716 717 $Complex = F a l s e 718 719 C r e a t e A l i a s [ e x p r _ ] : = Module [ { r u l e } , 720 I f [ Head [ A l i a s T a b l e ] = ! = L i s t , RemoveAlias [ ] ] ; (* failsafe for the event of external tampering*) 721 I f [ Count [ A l i a s T a b l e [ [ All , 2 ] ] , e x p r ] == 0 , 722 r u l e = Unique [ A l i a s ] −> e x p r ; 723 AppendTo [ AliasIndex , r u l e [ [ 1 ] ] ] ; 724 AppendTo [ A l i a s T a b l e , r u l e ] ; 725 Return [ A l i a s I n d e x / / Last ] 726 ]; 727 ] 728 S e t A t t r i b u t e s [ C r e a t e A l i a s , L i s t a b l e ] 729 730 (* 01/05/2005 *) 731 732 DecoupleEq [ eq_Equal , d v s _ L i s t , i v s _ L i s t ] : = Module [ { myeqs = { eq } , neweq , a l g e b r a i c = False , s o l u t i o n , old , p r e v i o u s , tmp = { } , index , orphans , c l a s s , s e l e c t i o n = { } , SubInfo = { } , MaxRank , TargetOfElimination , I n v e s t i g a t i n g E q , SuitableOrphan , $I } , 733 I f [ MatchQ [ eq , HoldPattern [ Times [ _ _ ] = = 0 ] | HoldPattern [ D e r i v a t i v e [ _ _ ] [ _ ] [ _ _ ] = = 0 ] ] , Return [ myeqs ] ] ; 734 (* Se per’iptwsh pou h sun’arthsh e’inai kajar’a algebrik’h koitame gia to an peri’eqei metablht’ec *) 735 SubInfo = Cases [ eq , _ [ A l t e r n a t i v e s @@ i v s . . ] , I n f i n i t y ] / . D e r i v a t i v e [ _ _ I n t e g e r ] [ f u n _ ] [ v a r s _ _ ] : > fun [ v a r s ] / / Union ; 736 SubInfo = Reap [ Sow [ # , Head [ # ] ] & / @ SubInfo , _ , { L i s t @@@ #2 , # 1 } & ] / / Last ; 737 I f [ Plus@@ ( Length [ # 1 ] & @@@SubInfo ) ! = Length [ SubInfo ] , Return [ myeqs ] ] ; 738 SubInfo = F l a t t e n [ # , 1 ] & / @SubInfo ; 739 SubInfo = S e l e c t [ SubInfo , MemberQ [ dvs , # [ [ 2 ] ] ] & ] ; 740 741 (*Print["-->",{eq,dvs,ivs},SubInfo];*) 742 743 I f [ Count [ SubInfo , DummyVar [ _ I n t e g e r ] , I n f i n i t y ] >0 , 744 tmp = F l a t t e n [ GetDependenceOfDummyVar [ F i r s t [ # ] ] & / @SubInfo ] / / Union ; 745 I f [ Count [ eq , Alternatives@@tmp , I n f i n i t y ] >0 , Return [ myeqs ] ] 746 ]; 747 748 I f [ SubInfo === { } , 749 I f [ Count [ eq , A l t e r n a t i v e s @ @ i v s , I n f i n i t y ] == 0 , 750 Return [ myeqs ] 751 , 752 index = Cases [ eq , Const [ _ I n t e g e r ] , I n f i n i t y ] / / Union ; 753 a l g e b r a i c = True 754 ] 755 ]; 756 757 (* Sugk’entrwsh twn sunart’hsewn s’umfwna me thn ex’arthsh touc *) 758 If [ ! algebraic , 759 I f [ Length [ SubInfo ] > 1 , 760 tmp = Reap [ Sow [ # 2 , { Union [ # 1 ] } ] & @@@SubInfo , _ , { # 1 , Sequence @@ #2} & ] / / Last 761 , 762 tmp = SubInfo 763 ] 764 ]; 765 766 (* ’Elenqoc gia an pr’okeitai gia sp’asimo l’ogw "orfan’wn" metablht’wn ’h l’ogw thc morf’hc thc ex’iswshc kai ekt’elesh thc kat’alllhl’hc sun’arthshc *) 767 I f [ ( orphans = S e l e c t [ Complement [ i v s , tmp [ [ All , 1 ] ] / / F l a t t e n / / Union ] , Count [ eq , # , I n f i n i t y ] > 0&]) =!= { } , 768 myeqs = OrphanSplit [ eq , orphans , i v s ] ; 769 (* h ex’iswsh e’inai taut’othta *) 770 I f [ MatchQ [ myeqs , F a l s e | { } ] , Return [ myeqs ] ] ; 771 ]; 772 773 (* Afo’u telei’wsei to orphansplitting proqwr’aw sto functionsplitting *) 774 775 I f [ a l g e b r a i c | | I n t e g r a l Q [ eq ] , Return [ myeqs ] ] ; (* Sthn per’iptwsh algebrik’hc ex’iswshc den ’eqei no’hma to sunarthsiak’o sp’asimo *) 776 777 c l a s s = C l a s s i f y S e t [ tmp ] ; 778 779 (* Sthn per’iptwsh pou h ex’iswsh mac den peri’eqei orfan’ec metablht’ec proqwr’ame sto pijan’o sp’asimo thc arqik’hc mac metablht’hc*) 780 I f [ Length [ tmp ] == 1 | | Length [ c l a s s ] == 1 , Return [ myeqs ] ] ;

96

Κ S

781 782 783 784 785 786 787 788 789 790 791 792

793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845

846 847 848 849 850 851 852 853

I f [ myeqs === { eq } , F u n c t i o n S p l i t [ eq , c l a s s , i v s ] , F l a t t e n [ DecoupleEq [ # , dvs , i v s ]&/ @myeqs ] / / Union ] ] DecoupleEq [ o t h e r _ , d v s _ L i s t , i v s _ L i s t ] : = o t h e r

(* 27/08/2004 *) \ [ C a p i t a l D e l t a ] eterminingEqs [ eq_Equal , o p t s _ _ _ ] : = Module [ { v e r b o s e =Verbose / . { o p t s } / . Options [ \ [ C a p i t a l D e l t a ] eterminingEqs ] , h i n t =Hint / . { o p t s } / . Options [ \ [ C a p i t a l D e l t a ] eterminingEqs ] , h i s t o r y =KeepHistory / . { o p t s } / . Options [ \ [ C a p i t a l D e l t a ] eterminingEqs ] , c o n d i t i o n a l = C o n d i t i o n a l / . { o p t s } / . Options [ \ [ C a p i t a l D e l t a ] eterminingEqs ] , knownfunctions = KnownFunctions / . { o p t s } / . Options [ \ [ C a p i t a l D e l t a ] eterminingEqs ] , temp , h=0 , IndependentVariables , DependentVariable , F u l l A n a l y s i s , vars , Prolongation , C o e f f i c i e n t s , c a n d i e s = { } , index , remnant = { } , i n f i n i t e s i m a l G , s u b s t i t u t i o n } , $HistoryLength =0; DummyVarList = { } ; temp= C h a r a c t e r i z e E q [ eq , Verbose −>F a l s e ] ; I f [ verbose , h=GetNotebookHandle [ " DeterminingEqs " ] ] ; Ermis [ h , " Equation under i n v e s t i g a t i o n : " , 3 ] ; Ermis [ h , eq ] ; I f [ temp = = = { } , Ermis [ h , " This i s not a D i f f e r e n c e Equation , a b o r t i n g . . . " , 3 ] ; Return [ { } ] ]; I f [ Length [ temp [ [ 2 ] ] ] > 1 , Ermis [ h , " This i s not a w e l l Posed Equation " , 3 ] ; Return [ { } ] ]; I f [ knownfunctions = ! = { } , knownfunctions = I f [ Count [ { # } , A l t e r n a t i v e s @ @ ( Union [ F l a t t e n [ temp [ [ 1 ] ] ] ] ) , I n f i n i t y ] >0 ,Head [ # ] , # ] & / @knownfunctions ; index = F l a t t e n [ P o s i t i o n [ temp [ [ 2 ] ] , # ] & / @knownfunctions ] ; temp = temp [ [ All , Complement [ Range [ Length [ temp [ [ 2 ] ] ] ] , index ] ] ] ]; temp = F l a t t e n [ temp , 1 ] ; I f [ Length [ temp ] > 4 , P r i n t [ " This equation i n v o l v e s more than one unknown f u n c t i o n " ] ; Abort [ ] ] ; { IndependentVariables , DependentVariable , MaxOrder , F u l l A n a l y s i s } = temp ; v a r s = J e t S p a c e \ [ C a p i t a l D e l t a ] [ 0 , IndependentVariables , { DependentVariable } ] ; I f [ hint ==={} , I f [ MatchQ [ eq [ [ 1 ] ] , DependentVariable [ _ _ ] ] , h i n t = { Rule@@eq } , index = Plus@@ ( MaxOrder / / Last ) ; h i n t = DeleteCases [ { # 1 , S e l e c t [ { # # 2 } , Plus@@#== index &]}& @@FullAnalysis , { _ , { } } ] ; h i n t = #1 @@@Plus@@@Thread [ { IndependentVariables , # 2 } ] & @@hint ; ]; I f [ hint ==={} , Ermis [ h , " I cannot s u b s t i t u t e t h e equation t o t h e p r o l o n g a t i o n a h i n t i s needed , a b o r t i n g . . . " ,3]; Return [ { } ] ] ]; I f [ Head [ h i n t [ [ 1 ] ] ] = ! = Rule , h i n t = F l a t t e n [ S o l v e [ eq , # ] & / @hint ] ] ; I f [ Length [ h i n t ] > 1 , P r i n t [ " i n v h i n t : : I n v a l i d h i n t d e t e c t e d " ] ; Return [ { } ] ] ; Ermis [ h , " The symmetry g e n e r a t o r : " , 3 ] ; i n f i n i t e s i m a l G = I f [ c o n d i t i o n a l , Q[ 0 ] @@IndependentVariables P a r t i a l [ Last [ v a r s ] ] , Q[ 0 ] @@vars P a r t i a l [ Last [ v a r s ] ] ] ; Ermis [ h ,X[ 0 ] == i n f i n i t e s i m a l G ] ; P r o l o n g a t i o n = i n f i n i t e s i m a l G + Plus@@ ( S h i f t [ i n f i n i t e s i m a l G ,##]&@@@Union [ Thread [ { IndependentVariables , # } ] & / @Rest [ F u l l A n a l y s i s ] ] ) ; P r o l o n g a t i o n = $ S i m p l i f i c a t i o n F u n c t i o n [ P r o l o n g a t i o n [ eq [ [ 1 ] ] ] == P r o l o n g a t i o n [ eq [ [ 2 ] ] ] ] ; Ermis [ h , " Applying t h e prolonged o p e r a t o r t o t h e equation g i v e s : " , 2 ] ; Ermis [ h , P r o l o n g a t i o n ] ; I f [ ! conditional , DummyVarList = Table [ DummyVar [ i ]−>Function@@ { Cases [ { h i n t [ [ i , 2 ] ] } , DependentVariable [ _ _ ] , I n f i n i t y ] / / Union , h i n t [ [ i , 2 ] ] } , { i , 1 , Length [ h i n t ] } ] ; s u b s t i t u t i o n = Rule@@@Thread [ { h i n t [ [ All , 1 ] ] , # [ [ 1 ] ] @@# [ [ 2 , 1 ] ] & / @DummyVarList } ] ; Prolongation = Prolongation / . s u b s t i t u t i o n ; Ermis [ h , " Trying t o o b t a i n t h e determining e q u a t i o n s . . . " , 2 ] ; $Cache=OpenTemporary [ BinaryFormat −>True ] ; temp = CheckAbort [ F i x e d P o i n t [ Hunter@@ # & , { 1 , h , { P r o l o n g a t i o n } , Cases [ Prolongation , Q[ _ _ I n t e g e r ] [ _ _ ] , I n f i n i t y ] / / Union , v a r s } ] , P r i n t [ StyleForm [ " P r o c e s s aborted , r e t u r n i n g h i s t o r y so f a r . . . " , FontColor −> RGBColor [ 0 , 0 , 1 ] , FontSlant −>" I t a l i c " ] ] ; Return [ { i n f i n i t e s i m a l G , Prolongation , $Cache = OpenRead@@ { Close [ $Cache ] } ; h i s t o r y =ReadList [ $Cache ] ; D el ete Fil e@ @ { Close [ $Cache ] } ; $Cache = . ; h i s t o r y } ] ] ; { Prolongation , temp } = { Prolongation , temp [ [ 3 ] ] } / . ( Reverse / @ s u b s t i t u t i o n ) ; I f [ h i s t o r y , $Cache = OpenRead@@ { Close [ $Cache ] } ; h i s t o r y =ReadList [ $Cache ] ; De le teF il e@@ { Close [ $Cache ] } ; $Cache = . ] ; index = Union [ F l a t t e n [ Cases [ # ,Q [ _ _ I n t e g e r ] [ $ v a r s _ _ ] | D e r i v a t i v e [ _ _ I n t e g e r ] [ Q[ _ _ I n t e g e r ] ] [ $ v a r s _ _ ] − >{ $vars } , I n f i n i t y ] ] ] & / @{ Prolongation , temp } ; AppendTo [ index , DeleteCases [ Complement@@index , A l t e r n a t i v e s @ @ ( # | # + _ I n t e g e r &/ @IndependentVariables ) ] ] ; I f [ Count [ temp , A l t e r n a t i v e s @ @ i n d e x [ [ 3 ] ] , I n f i n i t y ] >0 , I f [ h i s t o r y = ! = False , h i s t o r y = J o i n [ h i s t o r y , temp ] ] ; temp = F l a t t e n [ OrphanSplit [ # , index [ [ 3 ] ] , index [ [ 1 ] ] ] & / @temp ] ; ];

97

854 855 856 857 858 859 860 861 862 863 864 865 866 867 868

I f [ Length [ temp ] > 1 , s u b s t i t u t i o n = C r e a t e A l i a s [ index [ [ 1 ] ] ] ; temp=temp / . Reverse / @AliasTable ; temp = Union [ Si m pl if yE q [ # , s u b s t i t u t i o n ]& / @ ( F l a t t e n [ F i x e d P o i n t [ SimplifySystemOnce [ # , s u b s t i t u t i o n ] & , { { } , temp , { } } ] ] ) ] ; temp = S o r t [ RemoveIdentity [ temp ] , LeafCount [ # 1 ] < LeafCount [ # 2 ] & ] ; temp = temp / . A l i a s T a b l e ; RemoveAlias [ s u b s t i t u t i o n ] ]; Ermis [ h , " The determining e q u a t i o n s are : " , 3 ] ; Do [ Ermis [ h , temp [ [ i ] ] ] , { i , 1 , Length [ temp ] } ] ; DummyVarList = { } ; $HistoryLength = I n f i n i t y ; I f [ h i s t o r y === False , { i n f i n i t e s i m a l G , Prolongation , temp } , { i n f i n i t e s i m a l G , Prolongation , h i s t o r y , temp } ] , $HistoryLength = I n f i n i t y ; { infinitesimalG , Prolongation } ]

869 870 871 872 873 ] 874 875 \ [ C a p i t a l D e l t a ] eterminingEqs [ e q s _ L i s t , o p t s _ _ _ ] : = Module [ { v e r b o s e =Verbose / . { o p t s } / . Options [ \ [ C a p i t a l D e l t a ] eterminingEqs ] , h i n t =Hint / . { o p t s } / . Options [ \ [ C a p i t a l D e l t a ] eterminingEqs ] , c o n d i t i o n a l = C o n d i t i o n a l / . { o p t s } / . Options [ \ [ C a p i t a l D e l t a ] eterminingEqs ] , knownfunctions = KnownFunctions / . { o p t s } / . Options [ \ [ C a p i t a l D e l t a ] eterminingEqs ] , temp , h=0 , IndependentVariables , NumberOfIndependentVariables , DependentVariables , NumberDependentVariables , MaxOrder , F u l l A n a l y s i s , vars , Prolongation , C o e f f i c i e n t s , c a n d i e s = { } ,V, index , dummyvars , l o c a l c a n d i e s = { } , tmp , remnant , s u b s t i t u t i o n s } , 876 $HistoryLength = 0 ; 877 temp= C h a r a c t e r i z e E q [ eqs , Verbose −>F a l s e ] ; 878 I f [ verbose , h=GetNotebookHandle [ " DeterminingEqs " ] ] ; 879 Ermis [ h , " Equations under i n v e s t i g a t i o n : " , 3 ] ; 880 Do [ 881 Ermis [ h , eqs [ [ i ] ] ] 882 , { i , 1 , Length [ eqs ] } ] ; 883 I f [ temp = = = { } , 884 Ermis [ h , " This i s not a system of D i f f e r e n c e Equations , a b o r t i n g . . . " , 3 ] ; 885 Return [ { } ] 886 ]; 887 I f [ knownfunctions = ! = { } , 888 knownfunctions = I f [ Count [ { # } , A l t e r n a t i v e s @ @ ( Union [ F l a t t e n [ temp [ [ 1 ] ] ] ] ) , I n f i n i t y ] >0 ,Head [ # ] , # ] & / @knownfunctions ; 889 index = F l a t t e n [ P o s i t i o n [ temp [ [ 2 ] ] , # ] & / @knownfunctions ] ; 890 temp = temp [ [ All , Complement [ Range [ Length [ temp [ [ 2 ] ] ] ] , index ] ] ] 891 ]; 892 I f [ Length [ temp [ [ 2 ] ] ] > Length [ eqs ] , 893 Ermis [ h , " o v e r d e t : : This i s an overdetermined system of e q u a t i o n s " , 3 ] ; 894 ]; 895 { IndependentVariables , DependentVariables , MaxOrder , F u l l A n a l y s i s }= temp ; 896 NumberOfDependentVariables=Length [ DependentVariables ] ; 897 v a r s = J e t S p a c e \ [ C a p i t a l D e l t a ] [ 0 , IndependentVariables , DependentVariables ] ; 898 I f [ And@@ ( MatchQ [ # , Alternatives@@DependentVariables [ _ _ ]== _ ]&/ @eqs ) , h i n t = Rule@@#&/ @eqs ] ; 899 I f [ 0 < Length [ h i n t ] < Length [ eqs ] , 900 (* ?? *) P r i n t [ " Under c o n s t r u c t i o n " ] ; 901 ]; 902 I f [ hint ==={} , 903 (* ?? *) P r i n t [ " Under c o n s t r u c t i o n " ] ; 904 ]; 905 I f [ hint ==={} , 906 Ermis [ h , " nohint : : I cannot s u b s t i t u t e t h e equation t o t h e p r o l o n g a t i o n a h i n t i s needed , a b o r t i n g . . . " ,3]; 907 Return [ { } ] 908 ]; 909 I f [ Or@@ ( Head [ # ] = ! = Rule &/ @hint ) , h i n t = F l a t t e n [ I f [ Head[#2]=== Rule , # 2 , S o l v e [ # 1 ,#2]]& @@@ Thread [ { eqs , h i n t } ] ] ] ; 910 I f [ Length [ h i n t ] ! = Length [ eqs ] , P r i n t [ " i n v h i n t : : I n v a l i d h i n t d e t e c t e d " ] ; Return [ { } ] ] ; 911 Ermis [ h , " The symmetry g e n e r a t o r : " , 3 ] ; 912 temp = Take [ vars ,− NumberOfDependentVariables ] ; 913 i n f i n i t e s i m a l G = I f [ c o n d i t i o n a l , Sum [Q [ i ] @@Union [ F l a t t e n [ I n d e p en d e n t V a ri a b l e s ] ] P a r t i a l [ temp [ [ i ] ] ] , { i , 1 , NumberOfDependentVariables } ] , Sum [Q [ i ] @@vars P a r t i a l [ temp [ [ i ] ] ] , { i , 1 , NumberOfDependentVariables } ] ] ; 914 Ermis [ h ,X[ 0 ] == i n f i n i t e s i m a l G ] ; 915 P r o l o n g a t i o n = i n f i n i t e s i m a l G + Plus@@ ( S h i f t [ i n f i n i t e s i m a l G ,##]&@@@Union [ F l a t t e n [ Table [ Thread [ { I n d e pe n d e n t Va r i a b l es [ [ i ] ] , # } ] & / @Rest [ F u l l A n a l y s i s [ [ i ] ] ] , { i , 1 , Length [ DependentVariables ] } ] , 1 ] ] ) ; 916 P r o l o n g a t i o n = P r o l o n g a t i o n [ # [ [ 1 ] ] ] == P r o l o n g a t i o n [ # [ [ 2 ] ] ] & / @eqs ; 917 Ermis [ h , " Applying t h e prolonged o p e r a t o r t o t h e equation g i v e s : " , 2 ] ; 918 Ermis [ h , # ] & / @Prolongation ; 919 $HistoryLength = I n f i n i t y ; 920 { infinitesimalG , $SimplificationFunction [ Prolongation ] } 921 ] 922 923 (* 21/03/2007 *) 924 925 DeterminingEqs [ eq_Equal , o p t s _ _ _ ] : = Module [ { v e r b o s e =Verbose / . { o p t s } / . Options [ DeterminingEqs ] , h i n t =Hint / . { o p t s } / . Options [ DeterminingEqs ] , c o n d i t i o n a l = C o n d i t i o n a l / . { o p t s } / . Options [ DeterminingEqs ] , j e t s p a c e = J e t s p a c e / . { o p t s } / . Options [ DeterminingEqs ] , knownfunctions = KnownFunctions / . { o p t s } / . Options [ DeterminingEqs ] , s im de te qs = SimplifyDeterminingEqs / . { o p t s } / . Options [ DeterminingEqs ] , temp , h=0 , IndependentVariables , DependentVariable , F u l l A n a l y s i s , vars , Prolongation , C o e f f i c i e n t s , c a n d i e s = { } , index , remnant = { } , i n f i n i t e s i m a l G , s u b s t i t u t i o n } ,

98

Κ S

926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004

I f [ Count [ eq , D e r i v a t i v e [ _ _ ] [ _ ] [ _ _ ] , I n f i n i t y ] == 0 , Return [ \ [ C a p i t a l D e l t a ] eterminingEqs [ eq , o p t s ] ] ] ; $HistoryLength =0; temp= C h a r a c t e r i z e E q [ eq , Verbose −>F a l s e ] ; I f [ verbose , h=GetNotebookHandle [ " DeterminingEqs " ] ] ; Ermis [ h , " Equation under i n v e s t i g a t i o n : " , 3 ] ; Ermis [ h , eq ] ; I f [ temp = = = { } , Ermis [ h , " This i s not a D i f f e r e n t i a l Equation , a b o r t i n g . . . " , 3 ] ; $HistoryLength = I n f i n i t y ; Return [ { } ] ]; I f [ Length [ temp [ [ 2 ] ] ] > 1 , Ermis [ h , " This i s not a w e l l Posed Equation " , 3 ] ; $HistoryLength = I n f i n i t y ; Return [ { } ] ]; I f [ knownfunctions = ! = { } , knownfunctions = I f [ Count [ { # } , A l t e r n a t i v e s @ @ ( Union [ F l a t t e n [ temp [ [ 1 ] ] ] ] ) , I n f i n i t y ] >0 ,Head [ # ] , # ] & / @knownfunctions ; index = F l a t t e n [ P o s i t i o n [ temp [ [ 2 ] ] , # ] & / @knownfunctions ] ; temp = temp [ [ All , Complement [ Range [ Length [ temp [ [ 2 ] ] ] ] , index ] ] ] ]; temp = F l a t t e n [ temp , 1 ] ; I f [ Length [ temp ] > 4 , P r i n t [ " This equation i n v o l v e s more than one unknown f u n c t i o n " ] ; Abort [ ] ] ; { IndependentVariables , DependentVariable , MaxOrder , F u l l A n a l y s i s } = temp ; v a r s = J e t S p a c e [ j e t s p a c e , IndependentVariables , { DependentVariable } ] ; s u b s t i t u t i o n = #−>Head [ # ] & / @DeleteCases [ vars , D e r i v a t i v e [ _ _ I n t e g e r ] [ _ ] [ _ _ ] | A l t e r n a t i v e s @ @ ( F l a t t e n [ I n d ep e n d e n tV a r i a b l es ] ) ] ; I f [ hint ==={} , I f [ MatchQ [ eq , D e r i v a t i v e [ _ _ I n t e g e r ] [ _ ] [ _ _ ]== _ ] , h i n t = { Rule@@eq } , h i n t = { S h e r l o c k [ eq , { F u l l A n a l y s i s } ] / / F i r s t } ]; I f [ hint ==={} , Ermis [ h , " I cannot s u b s t i t u t e t h e equation t o t h e p r o l o n g a t i o n a h i n t i s needed , a b o r t i n g . . . " ,3]; $HistoryLength = I n f i n i t y ; Return [ { } ] ] ]; I f [ Head [ h i n t [ [ 1 ] ] ] = ! = Rule , h i n t = F l a t t e n [ S o l v e [ eq , # ] & / @hint ] ] ; I f [ Length [ h i n t ] > 1 , P r i n t [ " i n v h i n t : : I n v a l i d h i n t d e t e c t e d " ] ; $HistoryLength = I n f i n i t y ; Return [ { } ] ] ; Ermis [ h , " The symmetry g e n e r a t o r : " , 3 ] ; I f [ jetspace =!=0 , v a r s = DeleteCases [ v a r s / / . MakeRule [ h i n t [ [ 1 , 1 ] ] − > 0 ] , 0 ] ; Ermis [ h ,X[ 0 ] = = ( i n f i n i t e s i m a l G =X[ 0 , I n d e p en d e n t V ar i a b l e s / / Union , Complement [ vars , In d e p e n de n t V a r ia b l e s ] ] [ ] / . substitution ) ] ; P r o l o n g a t i o n =X[ Complement [ vars , I n d e pe n d e n t V ar i a b l e s ] ] [ eq ] / / F i r s t , Ermis [ h ,X[ 0 ] = = ( i n f i n i t e s i m a l G =X[ 0 , IndependentVariables , { DependentVariable } ] [ ] / . s u b s t i t u t i o n ) ] ; P r o l o n g a t i o n =X[ IndependentVariables , { DependentVariable } ] [ eq ] / / F i r s t ]; I f [ TrueQ [ ! c o n d i t i o n a l ] , conditional = { } ; P r o l o n g a t i o n = P r o l o n g a t i o n / / . MakeRule [ h i n t ] , I f [ TrueQ [ c o n d i t i o n a l ] , (* TODO Full Conditional Support *) temp = Cases [ i n f i n i t e s i m a l G , HoldPattern [D[ S l o t [ _ I n t e g e r ] , v a r _ ]] − > var , I n f i n i t y ] / / Union ; N e s t L i s t [ RotateRight , PadRight [ { 1 } , Length [ temp ] ] , Length [ temp ] − 1] , temp = {# ,#}& @MakeRule [ c o n d i t i o n a l ] ; temp [ [ 2 ] ] = S e l e c t [ temp [ [ 2 ] ] , Count [ { P r o l o n g a t i o n } , # [ [ 1 ] ] , I n f i n i t y , Heads−>True ] == 0&]; P r o l o n g a t i o n = P r o l o n g a t i o n / / . J o i n [ MakeRule [ h i n t ] , Complement@@temp ] ; temp = temp [ [ 2 ] ] ; I f [ temp = ! = { } , temp = P o s i t i o n [ c o n d i t i o n a l [ [ All , 1 ] ] , Alternatives@@temp [ [ All , 1 ] ] ] ; S t y l e P r i n t [ "Some of t h e s u b s t i t u t i o n s of t h e C o n d i t i o n a l o p t i o n does not appear in t h e l i n e a r i z e d symmetry c o n d i t i o n ! " , FontColor −> RGBColor [ 0 , 0 , 1 ] , Fo nt Sl an t −> " I t a l i c " ] ; S t y l e P r i n t [ # , FontColor −> RGBColor [ 1 , 0 , 0 ] , Fo nt Sl an t −> " I t a l i c " ]&/ @Extract [ c o n d i t i o n a l , temp ] ] ] ]; temp = Complement [ Cases [ { P r o l o n g a t i o n } , D e r i v a t i v e [ _ _ I n t e g e r ] [ DependentVariable ] [ _ _ ] , I n f i n i t y ] / / Union , v a r s ] ; (* ’Elegqoc gia to an pragmatik’a qrei’azetai na dr’asei h entol’h Together p’anw stic grammikopoihm’enec sunj’hkec summetriac *) I f [ Count [ Cases [ { P r o l o n g a t i o n } , _ R a t i o n a l | Power [ _ , − 1 ] , I n f i n i t y ] / / Union , Alternatives@@temp , I n f i n i t y ] >0 , P r o l o n g a t i o n =Numerator [ Together [ P r o l o n g a t i o n ] ] / . s u b s t i t u t i o n , Prolongation=Prolongation / . s u b s t i t u t i o n ]; vars=vars / . s u b s t i t u t i o n ; Ermis [ h , " Applying t h e prolonged o p e r a t o r t o t h e equation t a k i n g i n t o account t h e s u b s t i t u t i o n : " ,2];

99

1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030

Ermis [ h , Equal@@First [ h i n t ] ] ; If [ conditional = ! = { } , Ermis [ h , " and t h e c o n d i t i o n ( s ) : " , 2 ] ; Ermis [ h , Short [ Equal@@ # , 1 0 ] & / @ c o n d i t i o n a l ] ]; Ermis [ h , " g i v e s : " , 2 ] ; Ermis [ h , Short [ P r o l o n g a t i o n = = 0 , 2 0 ] ] ; C o e f f i c i e n t s = Prolongation ; Prolongation = . ; Do [ C o e f f i c i e n t s = F l a t t e n [ C o e f f i c i e n t L i s t [ C o e f f i c i e n t s , temp [ [ i ] ] ] ] , { i , 1 , Length [ temp ] } ] ; I f [ temp = = = { } , C o e f f i c i e n t s = { C o e f f i c i e n t s } ] ; (* Sth parak’atw grammh oi kajoristik’ec exis’wseic aplopoio’untai lamb’anontac up’oyhn ’oti isq’uoun gia k’aje tim’h m’esa ston ant’istoiqo q’wro jet *) C o e f f i c i e n t s = S o r t [ RemoveIdentity [ Union [ Si m pl if yE q [#==0 , Union [ vars , temp ] ] & / @ C o e f f i c i e n t s ] ] , LeafCount [ # 1 ] < LeafCount [ # 2 ] & ] ; remnant = S e l e c t [ C o e f f i c i e n t s , Count [ { # } , Alternatives@@temp , I n f i n i t y ] >0&]; I f [ remnant = ! = { } , P r i n t [ "Non polynomial form f o r t h e v a r i a b l e ( s ) " , Cases [ remnant , Alternatives@@temp , I n f i n i t y ] / / Union , " d e t e c t e d " ] ; P r i n t [ " The e q u a t i o n s i n v o l v e d are : " ] ; S t y l e P r i n t [ # , FontColor −> RGBColor [ 0 , 0 , 1 ] , Fo nt Sl an t −> " I t a l i c " ]&/ @remnant ; C o e f f i c i e n t s = temp = Union [ Complement [ C o e f f i c i e n t s , remnant ] , F l a t t e n [ OrphanSplit [ # , temp , v a r s ]&/ @remnant ] ] , temp = C o e f f i c i e n t s ]; I f [ simdeteqs , s u b s t i t u t i o n = CreateAlias [ vars ] ; { vars , temp } = { vars , temp } / . Reverse / @AliasTable ; temp = Union [ Si mp l if yE q [ # , v a r s ]& / @ F l a t t e n [ F i x e d P o i n t [ SimplifySystemOnce [ # , v a r s ] & , { { } , temp ,{}}]]]; temp = RemoveIdentity [ temp ] ; temp = S o r t [ temp / . A l i a s T a b l e , LeafCount [ # 1 ] < LeafCount [ # 2 ] & ] ; RemoveAlias [ s u b s t i t u t i o n ] ; Ermis [ h , " The determining e q u a t i o n s are : " , 3 ] ; Do [ Ermis [ h , temp [ [ i ] ] ] , { i , 1 , Length [ temp ] } ] , Coefficients = {} ]; $HistoryLength = I n f i n i t y ; { i n f i n i t e s i m a l G , C o e f f i c i e n t s , temp }

1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 ] 1044 1045 DeterminingEqs [ e q s _ L i s t , o p t s _ _ _ ] : = Module [ { v e r b o s e =Verbose / . { o p t s } / . Options [ DeterminingEqs ] , h i n t =Hint / . { o p t s } / . Options [ DeterminingEqs ] , c o n d i t i o n a l = C o n d i t i o n a l / . { o p t s } / . Options [ DeterminingEqs ] , j e t s p a c e = J e t s p a c e / . { o p t s } / . Options [ DeterminingEqs ] , knownfunctions = KnownFunctions / . { o p t s } / . Options [ DeterminingEqs ] , i n c r e m e n t a l = I n c r e m e n t a l / . { o p t s } / . Options [ DeterminingEqs ] , si md et eq s = SimplifyDeterminingEqs / . { o p t s } / . Options [ DeterminingEqs ] , temp , h=0 , IndependentVariables , NumberOfIndependentVariables , DependentVariables , NumberDependentVariables , MaxOrder , F u l l A n a l y s i s , vars , Prolongation , C o e f f i c i e n t s , c a n d i e s = { } ,V, index , dummyvars , l o c a l c a n d i e s = { } , tmp , remnant , s u b s t i t u t i o n s , $x$ } , 1046 I f [ ! MatchQ [ eqs , { _ _ E q u a l } ] , Return [ eqs ] ] ; 1047 I f [ Count [ eqs , D e r i v a t i v e [ _ _ ] [ _ ] [ _ _ ] , I n f i n i t y ] == 0 , Return [ \ [ C a p i t a l D e l t a ] eterminingEqs [ eqs , o p t s ]]]; 1048 $HistoryLength = 0 ; 1049 temp= C h a r a c t e r i z e E q [ eqs , Verbose −>F a l s e ] ; 1050 I f [ verbose , h=GetNotebookHandle [ " DeterminingEqs " ] ] ; 1051 Ermis [ h , " Equations under i n v e s t i g a t i o n : " , 3 ] ; 1052 Do [ 1053 Ermis [ h , eqs [ [ i ] ] ] 1054 , { i , 1 , Length [ eqs ] } ] ; 1055 I f [ temp = = = { } , 1056 Ermis [ h , " This i s not a system of D i f f e r e n t i a l Equations , a b o r t i n g . . . " , 3 ] ; 1057 $HistoryLength = I n f i n i t y ; 1058 Return [ { } ] 1059 ]; 1060 I f [ knownfunctions = ! = { } , 1061 knownfunctions = I f [ Count [ { # } , A l t e r n a t i v e s @ @ ( Union [ F l a t t e n [ temp [ [ 1 ] ] ] ] ) , I n f i n i t y ] >0 ,Head [ # ] , # ] & / @knownfunctions ; 1062 index = F l a t t e n [ P o s i t i o n [ temp [ [ 2 ] ] , # ] & / @knownfunctions ] ; 1063 temp = temp [ [ All , Complement [ Range [ Length [ temp [ [ 2 ] ] ] ] , index ] ] ] 1064 ]; 1065 I f [ Length [ temp [ [ 2 ] ] ] < Length [ eqs ] && ! ( Length [ h i n t ] == Length [ eqs ] | | MatchQ [ eqs , { HoldPattern [ Equal [ Derivative [ __Integer ] [ _ ] [ _ _ ] , _ ] ] . . } ] ) , 1066 Message [ DeterminingEqs : : o v e r d e t ] 1067 ]; 1068 { IndependentVariables , DependentVariables , MaxOrder , F u l l A n a l y s i s }= temp ; 1069 I f [ SameQ@@IndependentVariables , I n d e pe n d e n t V ar i a b l e s = F i r s t [ I n d e p e nd e n t V a ri a b l e s ] ] ; 1070 NumberOfDependentVariables=Length [ DependentVariables ] ; 1071 v a r s = J e t S p a c e [ j e t s p a c e , IndependentVariables , DependentVariables ] ; 1072 s u b s t i t u t i o n s = #−>Head [ # ] & / @DeleteCases [ vars , D e r i v a t i v e [ _ _ I n t e g e r ] [ _ ] [ _ _ ] | A l t e r n a t i v e s @ @ ( F l a t t e n [ I n d e pe n d e n t Va r i a b l es ] ) ] ; 1073 I f [ And@@ ( MatchQ [ # , D e r i v a t i v e [ _ _ I n t e g e r ] [ _ ] [ _ _ ]== _ ]&/ @eqs ) , h i n t = Rule@@#&/ @eqs ] ; 1074 I f [ 0 < Length [ h i n t ] < Length [ eqs ] , 1075 temp = I f [ MatchQ [ # , D e r i v a t i v e [ _ _ I n t e g e r ] [ _ ] [ _ _ ] ] , # , # [ [ 1 ] ] ] & / @hint ; 1076 h i n t = S h e r l o c k [ eqs , F u l l A n a l y s i s ] ; 1077 h i n t = S e l e c t [ hint , Count [ { # } , Alternatives@@temp ]== Length [ temp ] & , 1 ] 1078 ];

100

Κ S

1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152

I f [ hint ==={} , h i n t = S h e r l o c k [ eqs , F u l l A n a l y s i s ] / / F i r s t ]; I f [ hint ==={} , Ermis [ h , " nohint : : I cannot s u b s t i t u t e t h e equation t o t h e p r o l o n g a t i o n a h i n t i s needed , a b o r t i n g . . . " ,3]; $HistoryLength = I n f i n i t y ; Return [ { } ] ]; I f [ Or@@ ( Head [ # ] = ! = Rule &/ @hint ) , h i n t = F l a t t e n [ I f [ Head[#2]=== Rule , # 2 , S o l v e [ # 1 ,#2]]& @@@ Thread [ { eqs , hint } ] ] ] ; I f [ Length [ h i n t ] ! = Length [ eqs ] , P r i n t [ " i n v h i n t : : I n v a l i d h i n t d e t e c t e d " ] ; $HistoryLength = I n f i n i t y ; Return [{}]]; Ermis [ h , " The symmetry g e n e r a t o r : " , 3 ] ; I f [ jetspace =!=0 , v a r s = DeleteCases [ v a r s / / . MakeRule [ # [ [ 1 ] ] − > 0 & / @hint ] , 0 ] ; Ermis [ h ,X[ 0 ] = = ( i n f i n i t e s i m a l G =X[ 0 , I n d e p en d e n t V ar i a b l e s / / Union , Complement [ vars , In d e p e n de n t V a r ia b l e s ] ] [ ] / . substitutions ) ] ; P r o l o n g a t i o n = F i r s t /@X[ Complement [ vars , I n d e p en d e n t V ar i a b l e s ] ] [ eqs ] , Ermis [ h ,X[ 0 ] = = ( i n f i n i t e s i m a l G =X[ 0 , IndependentVariables , DependentVariables ] [ ] / . s u b s t i t u t i o n s ) ] ; P r o l o n g a t i o n = F i r s t /@X[ IndependentVariables , DependentVariables ] [ eqs ] ]; (* ’Elegqoc sumbat’othtac antikatast’asewn *) I f [ Count [ h i n t [ [ All , 2 ] ] , A l t e r n a t i v e s @ @ ( MakeRule[#==0&/ @hint [ [ All , 1 ] ] ] [ [ All , 1 ] ] ) , I n f i n i t y ] > 0 , S t y l e P r i n t [ " Warning : The s u b s t i t u t i o n s choosen might l e a d t o an i n f i n i t e l o o p " , FontColor −> RGBColor [ 0 , 0 , 1 ] , F on tS la nt −> " I t a l i c " ] ]; I f [ TrueQ [ ! c o n d i t i o n a l ] , conditional = { } ; (* In case of incremental mode return the calculations up to this point *) I f [ TrueQ [ i n c r e m e n t a l ] , $HistoryLength = I n f i n i t y ; Return [ { h , DependentVariables , v a r s / . s u b s t i t u t i o n s , s u b s t i t u t i o n s , i n f i n i t e s i m a l G , MakeRule [ h i n t ] , P r o l o n g a t i o n } ] ] ; P r o l o n g a t i o n = P r o l o n g a t i o n / / . MakeRule [ h i n t ] , I f [ TrueQ [ c o n d i t i o n a l ] , (* TODO Full Conditional Support *) temp = Cases [ i n f i n i t e s i m a l G , HoldPattern [D[ S l o t [ _ I n t e g e r ] , v a r _ ]] − > var , I n f i n i t y ] / / Union ; Return [ { } ] , temp = {# ,#}& @MakeRule [ c o n d i t i o n a l ] ; temp [ [ 2 ] ] = S e l e c t [ temp [ [ 2 ] ] , Count [ Prolongation , # [ [ 1 ] ] , I n f i n i t y , Heads−>True ] == 0&]; P r o l o n g a t i o n = P r o l o n g a t i o n / / . J o i n [ MakeRule [ h i n t ] , Complement@@temp ] ; temp = temp [ [ 2 ] ] ; I f [ temp = ! = { } , temp = P o s i t i o n [ c o n d i t i o n a l [ [ All , 1 ] ] , Alternatives@@temp [ [ All , 1 ] ] ] ; S t y l e P r i n t [ "Some of t h e s u b s t i t u t i o n s of t h e C o n d i t i o n a l o p t i o n does not appear in t h e l i n e a r i z e d symmetry c o n d i t i o n s ! " , FontColor −> RGBColor [ 0 , 0 , 1 ] , Fo nt Sl an t −> " I t a l i c " ] ; S t y l e P r i n t [ # , FontColor −> RGBColor [ 1 , 0 , 0 ] , Fo nt Sl an t −> " I t a l i c " ]&/ @Extract [ c o n d i t i o n a l , temp ] ] ] ]; temp = Complement [ Cases [ Prolongation , D e r i v a t i v e [ _ _ I n t e g e r ] [ Alternatives@@DependentVariables ] [ _ _ ] , I n f i n i t y ] / / Union , v a r s ] ; (* ’Elegqoc gia to an pragmatik’a qrei’azetai na dr’asei h entol’h Together p’anw stic grammikopoihm’enec sunj’hkec summetriac *) P r o l o n g a t i o n = I f [ Count [ Cases [ { # } , _ R a t i o n a l | Power [ _ , − 1 ] , I n f i n i t y ] , Alternatives@@temp , I n f i n i t y ] >0 , Numerator [ Together [ # ] ] / . s u b s t i t u t i o n s , # /. substitutions ]&/ @Prolongation ; vars = vars / . s u b s t i t u t i o n s ; Ermis [ h , " Applying t h e prolonged o p e r a t o r t o t h e e q u a t i o n s t a k i n g i n t o account t h e s u b s t i t u t i o n s : " ,2]; Ermis [ h , Short [ # , 1 0 ] ] & / @Equal@@@hint ; If [ conditional = ! = { } , Ermis [ h , " and t h e c o n d i t i o n ( s ) : " , 2 ] ; Ermis [ h , Short [ Equal@@ # , 1 0 ] ] & / @ c o n d i t i o n a l ]; Ermis [ h , " g i v e s : " , 2 ] ; Ermis [ h , Short [ # , 2 0 ] ] & /@(#==0&/ @Prolongation ) ; C o e f f i c i e n t s = Prolongation ; Prolongation = . ; Do [ C o e f f i c i e n t s = F l a t t e n [ C o e f f i c i e n t L i s t [ C o e f f i c i e n t s , temp [ [ i ] ] ] ] , { i , 1 , Length [ temp ] } ] ; C o e f f i c i e n t s = S o r t [ RemoveIdentity [ Union [ S im pl if yE q [#==0 , Union [ vars , temp ] ] & / @ C o e f f i c i e n t s ] ] , LeafCount [ # 1 ] < LeafCount [ # 2 ] & ] ; (* Sth parak’atw grammh oi kajoristik’ec exis’wseic aplopoio’untai lamb’anontac up’oyhn ’oti isq’uoun gia k’aje tim’h m’esa ston ant’istoiqo q’wro jet *) remnant = S e l e c t [ C o e f f i c i e n t s , Count [ { # } , Alternatives@@temp , I n f i n i t y ] >0&]; I f [ remnant = ! = { } , P r i n t [ "Non polynomial form f o r t h e v a r i a b l e ( s ) " , Cases [ remnant , Alternatives@@temp , I n f i n i t y ] / / Union , " d e t e c t e d " ] ; P r i n t [ " The e q u a t i o n s i n v o l v e d are : " ] ; S t y l e P r i n t [ # , FontColor −> RGBColor [ 0 , 0 , 1 ] , Fo nt Sl an t −> " I t a l i c " ]&/ @remnant ; C o e f f i c i e n t s = temp = Union [ Complement [ C o e f f i c i e n t s , remnant ] , F l a t t e n [ OrphanSplit [ # , temp , v a r s ]&/ @remnant ] ] , temp = C o e f f i c i e n t s

101

1153 1154 1155 1156 1157

]; I f [ simdeteqs , s u b s t i t u t i o n s = CreateAlias [ vars ] ; { vars , temp } = { vars , temp } / . Reverse / @AliasTable ; temp = Union [ Si mp l if yE q [ # , v a r s ]&/ @ F l a t t e n [ F i x e d P o i n t [ SimplifySystemOnce [ # , v a r s ] & , { { } , temp ,{}}]]]; temp = RemoveIdentity [ temp ] ; temp = S o r t [ temp / . A l i a s T a b l e , LeafCount [ # 1 ] < LeafCount [ # 2 ] & ] ; RemoveAlias [ s u b s t i t u t i o n s ] ; Ermis [ h , " The determining e q u a t i o n s are : " , 3 ] ; Do [ Ermis [ h , temp [ [ i ] ] ] , { i , 1 , Length [ temp ] } ] , Coefficients ={} ]; $HistoryLength = I n f i n i t y ; { i n f i n i t e s i m a l G , C o e f f i c i e n t s , temp }

1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 ] 1171 1172 (* 15/03/2007 *) 1173 1174 D i f f e r e n t i a l B a c k s u b s t i t u t i o n [ L i s t [ l a _ L i s t , l b _ _ L i s t ] ] : = L i s t [ D i f f e r e n t i a l B a c k s u b s t i t u t i o n [ l a ] , DifferentialBacksubstitution [ lb ]] 1175 1176 D i f f e r e n t i a l B a c k s u b s t i t u t i o n [ e q s _ L i s t ] : = Module [ { r u l e s = MakeRule [ Rule @@@ eqs ] } , 1177 Union [ S e l e c t [ $ S i m p l i f i c a t i o n F u n c t i o n [ Table [ eqs [ [ i ] ] / / . Drop [ r u l e s , { i } ] , { i , 1 , Length [ eqs ] } ] ] , # = ! = True &]] 1178 ] 1179 1180 (* 13/05/2004 *) 1181 1182 DLT[ D e r i v a t i v e [ l 1 _ _ I n t e g e r ] [ f u n _ ] [ v a r s _ _ ] , D e r i v a t i v e [ l 2 _ _ I n t e g e r ] [ f u n _ ] [ v a r s _ _ ] ] / ; { l 1 } = ! = { l 2 } : = Module [ { } , And@@ ( NonNegative / @ ( { l 2 } − { l 1 } ) ) ] 1183 DLT[ _ _ ] = F a l s e 1184 1185 (* 27/11/2004 *) 1186 1187 DummyVarList = { } 1188 1189 (* 14/05/2004 *) 1190 1191 (* kan’onec exaf’anishc teqnik’wn posot’htwn kata thn diadikas’ia olokl’hrwshc thc entol’hc DSolve *) 1192 1193 Elim inationRules = { FreeFunc [ _ I n t e g e r ] [ i v _ _ ] | D e r i v a t i v e [ _ _ I n t e g e r ] [ FreeFunc [ _ I n t e g e r ] ] [ i v _ _ ] : > Unique [K ] / ; S e l e c t [ { i v } , StringMatchQ [ T o S t r i n g [ # ] , "K$∗ " ]&] = ! = { } , 1194 fun_Symbol [ i v _ _ ] : > Unique [K ] / ; S e l e c t [ { i v } , StringMatchQ [ T o S t r i n g [ # ] , "K$∗ " ]&] = ! = { } && fun = ! = L i s t && fun = ! = Times && fun = ! = Plus } 1195 1196 (* 05/01/2006 *) 1197 1198 EquivQ [ START_ , END_ , m a t r i x _ ? MatrixQ , L e v e l _ I n t e g e r : 1 , o p t s _ _ _ R u l e ] : = Module [ { o r b i t s , s t a r t = START / . Global ‘ \ [ Kappa ] −> Global ‘ s , end = END / . Global ‘ \ [ Kappa ] −> Global ‘ e , maxdepth = MaxDepth / . { o p t s } / . MaxDepth−>Dimensions [ matrix ] [ [ 1 ] ] , compareMatrix } , 1199 I f [ Level > maxdepth , Return [ { } ] ] ; 1200 o r b i t s = MapIndexed [ # 1 / . Global ‘ \ [ C u r l y E p s i l o n ] −> Global ‘ e p s i l o n [ # 2 [ [ 1 ] ] , Level ] &, matrix ] ; 1201 o r b i t s = o r b i t s / . Thread [ Array [ Global ‘ \ [ Kappa ] , Dimensions [ matrix ] [ [ 2 ] ] ] −> s t a r t ] ; 1202 compareMatrix = DeleteCases [ F l a t t e n [ Function [ v , S o l v e [ J o i n [ # , # ! = 0&/@v ] , v ] ] @ ( Cases [ # , Global ‘ e [ _ I n t e g e r ] | Global ‘ e p s i l o n [ _ _ I n t e g e r ] , I n f i n i t y ] / / Union ) &/ @ S e l e c t [ DeleteCases [ # / . { l _ , r _ } −> l == r &/ @Thread / @ D i s t r i b u t e [ { o r b i t s , { end } } , L i s t ] , True , I n f i n i t y ] , Count [ # , F a l s e , I n f i n i t y ] == 0 &] , 1 ] , { } ] / / Union ; 1203 compareMatrix = S e l e c t [ compareMatrix , Count [ # , _Complex , I n f i n i t y ] == 0 && Or@@And@@@ ( # / . { l _ , r _ } −> l == r &/@Thread / @ D i s t r i b u t e [ { o r b i t s , { end } } , L i s t ] ) / . # & ] ; 1204 I f [ compareMatrix === { } && Level { v } , { } ] / / Union 1206 ]; 1207 Cases [ compareMatrix , { _ _ R u l e } , I n f i n i t y ] / / Union 1208 ] 1209 1210 (* 18/07/2008 *) 1211 1212 Ermis [ _ ? NonPositive , _ _ ] : = Module [ { } , Return [ ] ] 1213 1214 Ermis [ handle_ , 1 ] : = Module [ { } , 1215 NotebookWrite [ handle , 1216 C e l l [ " " , " Text " , CellFrame − > { { 0 , 0 } , { 0 , 3 } } , ShowCellBracket −>False , CellMargins − > { { 0 , 0 } , { 1 , 1 } } , CellElementSpacings −>{" CellMinHeight " − >1} , CellFrameMargins −>False , CellFrameColor −>RGBColor [ 1 , 0 , 0 ] , C e l l S i z e −>{ I n h e r i t e d , 5 } 1217 ] 1218 ] 1219 ] 1220 1221 Ermis [ handle_ , 2 ] : = Module [ { } , 1222 NotebookWrite [ handle , 1223 C e l l [ " " , " Text " , ShowCellBracket −>False , CellMargins − > { { 0 , 0 } , { 1 , 1 } } , CellFrame − > { { 0 , 0 } , { 0 , 2 } } , CellFrameColor −>RGBColor [ 0 , 0 , 1 ] , C e l l S i z e −>{ I n h e r i t e d , 5 } ] 1224 ] 1225 ]

102

Κ S

1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242

Ermis [ handle_ , t e x t _ S t r i n g , 1 ] : = Module [ { } , NotebookWrite [ handle , C e l l [ t e x t , " Text " , ShowCellBracket −>False , TextAlignment −>Center ] ] ] Ermis [ handle_ , t e x t _ S t r i n g , 2 ] : = Module [ { } , NotebookWrite [ handle , C e l l [ t e x t , " Text " , Background −>GrayLevel [ 0 . 8 ] , CellFrame −>True , ShowCellBracket −>F a l s e ] ] ]

Ermis [ handle_ , t e x t _ S t r i n g , 3 ] : = Module [ { } , NotebookWrite [ handle , C e l l [ t e x t , " Text " , Background −>GrayLevel [ 0 . 8 ] , CellFrame −>True , ShowCellBracket −>False , TextAlignment −> Center 1243 ] 1244 ] 1245 ] 1246 1247 Ermis [ handle_ , t e x t _ S t r i n g , 4 ] : = Module [ { } , 1248 NotebookWrite [ handle , 1249 C e l l [ t e x t , " Text " , ShowCellBracket −>False , FontSize − >16,FontWeight −>" Bold " , TextAlignment −>0,FontColor −>RGBColor [ 0 . 0 , 0 . 0 , 1 . 0 ] 1250 ] 1251 ] 1252 ] 1253 1254 Ermis [ handle_ , t e x t _ S t r i n g , 5 ] : = Module [ { } , 1255 NotebookWrite [ handle , 1256 C e l l [ t e x t , " Text " , ShowCellBracket −>False , FontSize − >16,FontWeight −>" Bold " , FontColor −>RGBColor [0.0 ,0.0 ,1.0] 1257 ] 1258 ] 1259 ] 1260 1261 Ermis [ handle_ , HoldPattern [ Rule [ funhead_ , Function [ a r g s _ L i s t , body_ ] ] ] ] : = Module [ { equation =funhead@@args== Function [ args , body ] @@args , s e t =Rule [ funhead , Function [ args , body ] ] } , 1262 I f [ Count [ { equation } , A l t e r n a t i v e s @ @ A l i a s I n d e x , I n f i n i t y ] >0 , equation = equation / . A l i a s T a b l e ] ; 1263 NotebookWrite [ handle , 1264 C e l l [ BoxData [ FormBox [ ToBoxes [ Equal@@Through [ s e t [ Sequence@@First [ s e t [ [ 2 ] ] ] ] ] ] , TraditionalForm ] ] , " DisplayFormula " , ShowCellBracket −>False , TextAlignment −>0,FontColor −>RGBColor [ 0 . 0 , 0 . 0 , 1 . 0 ] 1265 ] 1266 ] 1267 ] 1268 1269 Ermis [ handle_ , HoldPattern [ Rule [ funhead_ , XFunction [ a r g s _ L i s t , body_ ] ] ] ] : = Module [ { equation =funhead@@args== XFunction [ args , body ] @@args , s e t =Rule [ funhead , XFunction [ args , body ] ] } , 1270 I f [ Count [ { equation } , A l t e r n a t i v e s @ @ A l i a s I n d e x , I n f i n i t y ] >0 , equation = equation / . A l i a s T a b l e ] ; 1271 NotebookWrite [ handle , 1272 C e l l [ BoxData [ FormBox [ ToBoxes [ Equal@@Through [ s e t [ Sequence@@First [ s e t [ [ 2 ] ] ] ] ] ] , TraditionalForm ] ] , " DisplayFormula " , ShowCellBracket −>False , TextAlignment −>0,FontColor −>RGBColor [ 0 . 0 , 0 . 0 , 1 . 0 ] 1273 ] 1274 ] 1275 ] 1276 1277 Ermis [ handle_ , t e x t _ S t r i n g , e x p r s _ L i s t ] : = Module [ { l o c a l = e x p r s } , 1278 I f [ Count [ l o c a l , A l t e r n a t i v e s @ @ A l i a s I n d e x , I n f i n i t y ] >0 , l o c a l = l o c a l / . A l i a s T a b l e ] ; 1279 NotebookWrite [ handle , 1280 C e l l [ TextData [ 1281 Drop [ F l a t t e n [ { t e x t , Table [ 1282 { C e l l [ BoxData [ FormBox [ ToBoxes [ l o c a l [ [ i ] ] ] , TraditionalForm ] ] (*,FontColor ->RGBColor [0.0,0.0,1.0]*) ] , " , " } 1283 , { i , 1 , Length [ l o c a l ] } ] } ] 1284 , − 1] 1285 ] , " Text " , Background −>GrayLevel [ 0 . 8 ] , CellFrame −>True , ShowCellBracket −>F a l s e 1286 ] 1287 ] 1288 ] 1289 1290 Ermis [ handle_ , t e x t s _ L i s t / ; Length [ t e x t s ]==2 , e x p r s _ L i s t / ; Length [ e x p r s ] = = 2 ] : = Module [ { l o c a l = e x p r s } , 1291 I f [ Count [ l o c a l , A l t e r n a t i v e s @ @ A l i a s I n d e x , I n f i n i t y ] >0 , l o c a l = l o c a l / . A l i a s T a b l e ] ; 1292 NotebookWrite [ handle , 1293 C e l l [ TextData [ 1294 { texts [ [ 1 ] ] , 1295 C e l l [ BoxData [ FormBox [ ToBoxes [ l o c a l [ [ 1 ] ] ] , TraditionalForm ] ] ] , 1296 texts [[2]] , 1297 C e l l [ BoxData [ FormBox [ ToBoxes [ l o c a l [ [ 2 ] ] ] , TraditionalForm ] ] , 1298 FontColor −>RGBColor [ 0 . 0 , 0 . 0 , 1 . 0 ] ] 1299 } 1300 ] , " Text " , Background −>GrayLevel [ 0 . 8 ] , CellFrame −>True , ShowCellBracket −>F a l s e 1301 ] 1302 ] 1303 ] 1304 1305 Ermis [ handle_ , t e x t s _ L i s t , e x p r s _ L i s t ] / ; Length [ t e x t s ] ==Length [ e x p r s ]==3 : = Module [ { l o c a l = e x p r s } , 1306 I f [ Count [ l o c a l , A l t e r n a t i v e s @ @ A l i a s I n d e x , I n f i n i t y ] >0 , l o c a l = l o c a l / . A l i a s T a b l e ] ;

103

1307 NotebookWrite [ handle , 1308 C e l l [ TextData [ 1309 { texts [ [ 1 ] ] , 1310 C e l l [ BoxData [ FormBox [ ToBoxes [ l o c a l [ [ 1 ] ] ] , TraditionalForm ] ] ] , 1311 texts [[2]] , 1312 C e l l [ BoxData [ FormBox [ ToBoxes [ l o c a l [ [ 2 ] ] ] , TraditionalForm ] ] ] , 1313 texts [[3]] , 1314 C e l l [ BoxData [ FormBox [ ToBoxes [ l o c a l [ [ 3 ] ] ] , TraditionalForm ] ] , 1315 FontColor −>RGBColor [ 0 . 0 , 0 . 0 , 1 . 0 ] ] 1316 } 1317 ] , " Text " , Background −>GrayLevel [ 0 . 8 ] , CellFrame −>True , ShowCellBracket −>F a l s e 1318 ] 1319 ] 1320 ] 1321 1322 Ermis [ handle_ , e x p r _ ] : = Module [ { l o c a l = e x p r } , 1323 I f [ Count [ { l o c a l } , A l t e r n a t i v e s @ @ A l i a s I n d e x , I n f i n i t y ] >0 , l o c a l = l o c a l / . A l i a s T a b l e ] ; 1324 NotebookWrite [ handle , 1325 C e l l [ BoxData [ FormBox [ ToBoxes [ l o c a l ] , TraditionalForm ] ] , " DisplayFormula " , ShowCellBracket −>False , TextAlignment −>0(*,FontColor ->RGBColor[0.0,0.0,1.0]*) 1326 ] 1327 ] 1328 ] 1329 1330 Eta [ i _ I n t e g e r , j _ I n t e g e r , v a r s _ _ , o f f s e t _ I n t e g e r : 0 ] : = Module [ { l e n = 1 , c i v } , 1331 I f [ j ==0 , 1332 Eta [ i ] [ v a r s ] 1333 , 1334 I f [ o f f s e t ! = 0 , len = o f f s e t ] ; 1335 civ = { vars } [ [ len+i , 1 ] ] ; 1336 D[ Eta [ i , j − 1, vars , o f f s e t ] , c i v ] − D [ { v a r s } [ [ i + l e n ] ] , { c i v , j } ] I f [ o f f s e t == 0 ,D[ Xi [ 0 ] [ v a r s ] , c i v ] , D [ ( Xi@@Flatten [ P o s i t i o n [ Take [ { v a r s } , o f f s e t ] , c i v ] ] ) [ v a r s ] , c i v ] ] 1337 ] 1338 ] 1339 1340 Eta [ i _ I n t e g e r , o r d e r _ L i s t , v a r s _ _ , o f f s e t _ I n t e g e r : 0 ] : = Module [ { l e n =Length [ o r d e r ] , index , tmp , c i v } , 1341 index= F l a t t e n [ P o s i t i o n [ order , _ ? ( # ! = 0 & ) ] ] ; 1342 I f [ index === { } , index =0 , index=Last [ index ] ] ; 1343 I f [ index == 0 , 1344 Eta [ i ] [ v a r s ] 1345 , 1346 I f [ o f f s e t ! = 0 , len = o f f s e t ] ; 1347 tmp= o r d e r;−−tmp [ [ index ] ] ; 1348 c i v = List@@ ( { v a r s } [ [ l e n + i ] ] ) ; (* current independent variables*) 1349 D[ Eta [ i , tmp , vars , o f f s e t ] , c i v [ [ index ] ] ] − Sum [D[ Xi [ k ] [ v a r s ] , c i v [ [ index ] ] ] D[ D e r i v a t i v e [ Sequence@@tmp ] [ Head [ { v a r s } [ [ i + l e n ] ] ] ] [ Sequence@@civ ] , { v a r s } [ [ k ] ] ] , { k , 1 , l e n } ] 1350 ] 1351 ] 1352 1353 Eta [ o r d e r _ L i s t , v a r s _ _ ] : = Module [ { l e n =Length [ { v a r s }] − 1 , index , tmp , c i v } , 1354 index = F l a t t e n [ P o s i t i o n [ order , _ ? ( # ! = 0 & ) ] ] ; 1355 I f [ index === { } , index =0 , index=Last [ index ] ] ; 1356 I f [ index ==0 , 1357 Eta [ 0 ] [ v a r s ] 1358 , 1359 tmp= o r d e r;−−tmp [ [ index ] ] ; 1360 c i v = List@@ ( { v a r s } / / Last ) ; 1361 D[ Eta [ tmp , v a r s ] , c i v [ [ index ] ] ] − Sum [D[ Xi [ k ] [ v a r s ] , c i v [ [ index ] ] ] D[ D e r i v a t i v e [ Sequence@@tmp ] [ Head [ { v a r s } [ [ l e n + 1 ] ] ] ] [ Sequence@@civ ] , { v a r s } [ [ k ] ] ] , { k , 1 , l e n } ] 1362 ] 1363 ] 1364 1365 Eta [ i _ I n t e g e r , v a r s _ _ ] : = Module [ { } , 1366 I f [ i ==0 , 1367 Eta [ 0 ] [ v a r s ] 1368 , 1369 D[ Eta [ i − 1, v a r s ] , { v a r s } [ [ 1 ] ] ] − D [ { v a r s } [ [ 2 ] ] , { { v a r s } [ [ 1 ] ] , i } ] D[ Xi [ 0 ] [ v a r s ] , { v a r s } [ [ 1 ] ] ] 1370 ] 1371 ] 1372 1373 (* 21/11/2005 *) 1374 1375 E ule rOp erat or [ i n d e x _ , f u n s _ ] [ e x p r s _ ? VectorQ ] : = Eul erO pera tor [ index , funs ] [ # ] & / @ e x p r s 1376 1377 E ule rOpe rat or [ 0 , f u n s _ ? VectorQ ] [ e x p r _ ] : = Module [ { $F , f r u l e s , v a r s =List@@@funs } , 1378 I f [ SameQ@@vars , Return [ Eule rOp erat or [ 0 v a r s [ [ 1 ] ] , funs ] [ e x p r ] ] ] ; 1379 v a r s = F l a t t e n [ v a r s ] / / Union ; 1380 f r u l e s = MapThread [ { # 1 −> Function@@ { vars , # 2 } , Head[#2] − > Function@@ { List@@ # 2 , # 1 @@vars } } & , { Array [ $F , Length [ funs ] ] , funs } ] / / Transpose ; 1381 Return [ E ule rOpe rat or [ 0 Range [ Length [ v a r s ] ] , funs / . f r u l e s [ [ 2 ] ] ] [ e x p r / . f r u l e s [ [ 2 ] ] ] / . f r u l e s [ [ 1 ] ] ] 1382 / ; ! SameQ@@vars 1383 ] 1384 1385 E ule rOp erat or [ i n d e x _ ? VectorQ , f u n s _ ? VectorQ ] [ e x p r _ ] : = I f [ Length [ funs ] == 1 , F i r s t [ # ] , # ] & [ Eu lerO per ato r [ index , # ] [ e x p r ] & / @ funs ] 1386 1387 E ule rOpe rat or [ i n d e x _ ? VectorQ , f u n _ [ v a r s _ _ ] ] [ e x p r _ ] / ; Length [ index ] == Length [ { v a r s } ] : = Module [ { dindex = Cases [ { e x p r } , D e r i v a t i v e [ i d x _ _ I n t e g e r ] [ fun ] [ v a r s ] −> { i d x } , I n f i n i t y ] } , 1388 dindex = Union [ { Table [ 0 , { Length [ index ] } ] } , dindex ] ;

104

Κ S

1389 1390 1391

dindex = S e l e c t [ dindex , And @@ ( LessEqual @@@ Transpose [ { index , # } ] ) & ] ; I f [ dindex === { } , Return [ 0 ] ] ; $ S i m p l i f i c a t i o n F u n c t i o n [ Plus@@ ( ( − 1 ) ^ ( Plus @@ ( # − index ) ) Times @@ ( Binomial @@@ Transpose [ { # , index } ] )D[D[ expr , D e r i v a t i v e [ Sequence @@ # ] [ fun ] [ v a r s ] ] , Sequence @@ Transpose [ { { v a r s } , # − index } ] ] & / @ dindex ) ]

1392 ] 1393 1394 (* 21/03/2007 *) 1395 1396 FindAllSubAlgebras [ s t r u c t u r e c o n s t a n t s _ , A l g e b r a B a s e I n d e x _ L i s t : { } ] / ; ArrayQ [ s t r u c t u r e c o n s t a n t s , 3 ] : = Module [ { l e n = Dimensions [ s t r u c t u r e c o n s t a n t s ] , BaseSet = AlgebraBaseIndex } , 1397 I f [ UnsameQ@@len , P r i n t [ " I n v a l i d s t r u c t u r e c o n s t a n t s d e t e c t e d " ] ; Abort [ ] , l e n = l e n [ [ 3 ] ] ] ; 1398 I f [ AlgebraBaseIndex === { } , BaseSet = Array [ X, l e n ] ] ; 1399 F l a t t e n [ F i x e d P o i n t L i s t [ F l a t t e n [ FindSubAlgebras [ s t r u c t u r e c o n s t a n t s , # , len , AlgebraBaseIndex ]&/@ # , 1 ] & , L i s t / @BaseSet ] , 1 ] 1400 ] 1401 1402 (* 1/10/2004 *) 1403 1404 FindSubAlgebras [ s t r u c t u r e c o n s t a n t s _ , SubBase_List , AlgebraRank_Integer , A l g e b r a B a s e I n d e x _ L i s t : { } ] / ; ArrayQ [ s t r u c t u r e c o n s t a n t s , 3 ] : = Module [ { l e n = Length [ SubBase ] , index , o f f s e t = 1 , A l g e b r a S e t = { } , newbatch = { } } , 1405 I f [ UnsameQ@@Dimensions [ s t r u c t u r e c o n s t a n t s ] , P r i n t [ " I n v a l i d s t r u c t u r e c o n s t a n t s d e t e c t e d " ] ; Abort [ ] ] ; 1406 I f [ AlgebraRank − Length [ SubBase ] == 1 , Return [ { } ] ] ; 1407 I f [ AlgebraBaseIndex = ! = { } , 1408 I f [ Length [ AlgebraBaseIndex ] ! = AlgebraRank , P r i n t [ " I n a l i d AlgebraBaseIndex d e t e c t e d " ] ; Abort []]; 1409 A l g e b r a S e t = Rule@@@Thread [ { Array [ X, AlgebraRank ] , AlgebraBaseIndex } ] 1410 ]; 1411 I f [ SubBase = ! = { } , o f f s e t = Max [ F l a t t e n [ List@@@ ( SubBase / . Reverse / @AlgebraSet ) ] ] + 1 ] ; 1412 index = Table [X[ i ] , { i , o f f s e t , AlgebraRank } ] / . A l g e b r a S e t ; 1413 Do [ I f [ SubAlgebraQ [ s t r u c t u r e c o n s t a n t s , { Sequence@@SubBase , index [ [ i ] ] } / . Reverse / @AlgebraSet ] , 1414 AppendTo [ newbatch , { Sequence@@SubBase , index [ [ i ] ] } ] 1415 , 1416 newbatch = Union [ newbatch , FindSubAlgebras [ s t r u c t u r e c o n s t a n t s , { Sequence@@SubBase , index [ [ i ] ] } , AlgebraRank , AlgebraBaseIndex ] ] 1417 ]; 1418 , { i , 1 , Length [ index ] } ] ; 1419 newbatch 1420 ] 1421 1422 (* 30/9/2004 *) 1423 1424 FreeFuncRules = { D e r i v a t i v e [ _ _ I n t e g e r ] [ FreeFunc [ i _ I n t e g e r ] ] [ i v s _ _ ] / ; i > TempOffSet : > FreeFunc [ i ] [ i v s ] , 1425 HoldPattern [ I n t e g r a t e [ FreeFunc [ i _ ] [ i v s _ _ ] , { i n t v a r _ , d l _ , u l _ } , o t h e r _ _ _ L i s t ] ] / ; ( i > TempOffSet && ! NumericQ [ u l ] && Count [ { i v s } , i n t v a r , I n f i n i t y ] >0) : > I f [ { o t h e r } === { } , FreeFunc [ i ] [ i v s ] / . i n t v a r −> ul , I n t e g r a t e [ FreeFunc [ i ] [ i v s ] / . i n t v a r −> ul , o t h e r ] ] , 1426 HoldPattern [ I n t e g r a t e [ FreeFunc [ i _ ] [ i v s _ _ ] , i n t v a r _ _ ] ] / ; i > TempOffSet && VectorQ [ { i n t v a r } ] && ( Cases [ { i v s } , A l t e r n a t i v e s [ i n t v a r ] , I n f i n i t y ] / / Union ) === Union [ { i n t v a r } ] : > FreeFunc [ i ] [ i v s ] 1427 } 1428 1429 (* 05/01/2006 *) 1430 1431 F u n c t i o n S p l i t [ eq_Equal , c l a s s _ L i s t , i v s _ L i s t ] : = Module [ { myeqs = { } , MaxRank = Max [ Length / @ c l a s s [ [ All , 1 , 1 ] ] ] , s e l e c t i o n , TargetOfElimination , orphans , tmp , I n v e s t i g a t i n g E q , SuitableOrphan , backup , index } , 1432 s e l e c t i o n = S o r t [ F i r s t / @ S e l e c t [ c l a s s , Length [ # [ [ 1 , 1 ] ] ] == MaxRank&] , Count [ eq , A l t e r n a t i v e s @ @ R e s t [ # 1 ] , I n f i n i t y ] > Count [ eq , A l t e r n a t i v e s @ @ R e s t [ # 2 ] , I n f i n i t y ] & ] ; 1433 (*If[Length[selection]>2,Print["~~>",selection ," cls::",class]];*) 1434 Do [ T a r g e t O f E l i m i n a t i o n = P o s i t i o n [ c l a s s , s e l e c t i o n [ [ i ] ] ] [ [ 1 , 1 ] ] ; 1435 T a r g e t O f E l i m i n a t i o n = DeleteCases [ Complement [ # , c l a s s [ [ T a r g e t O f E l i m i n a t i o n ] ] ]&/ @class , { } ] ; 1436 (*TargetOfElimination = Complement[Flatten[class ,1],class[[TargetOfElimination]] ];*) 1437 T a r g e t O f E l i m i n a t i o n = { # [ [ All , 1 ] ] / / F l a t t e n / / Union , DeleteCases [ F l a t t e n [ Rest / @# ] , A l t e r n a t i v e s @ @ F l a t t e n [ Rest / @ s e l e c t i o n [ [ i ] ] ] ] } & / @TargetOfElimination ; 1438 (*TargetOfElimination = {TargetOfElimination[[All ,1]]//Flatten//Union ,Flatten[Rest/ @TargetOfElimination]};*) 1439 (*orphans = Complement[selection[[i,1]] , Intersection[selection[[i,1]], TargetOfElimination [[1]] ] ]; *) 1440 orphans = F l a t t e n [ Complement [ s e l e c t i o n [ [ i , 1 ] ] , I n t e r s e c t i o n [ s e l e c t i o n [ [ i , 1 ] ] , # [ [ 1 ] ] ] ]&/ @TargetOfElimination ] / / Union ; 1441 1442 (*If[Length[selection]>2,Print["orphans&TOE::",orphans ,TargetOfElimination]];*) 1443 I f [ orphans === { } , Continue [ ] ] ; 1444 index = S o r t [ Cases [ eq , ( A l t e r n a t i v e s @ @ # ) [ _ _ ] | D e r i v a t i v e [ _ _ ] [ A l t e r n a t i v e s @ @ # ] [ _ _ ] , I n f i n i t y ]&/ @TargetOfElimination [ [ All , 2 ] ] , Length [ # 1 ] > Length [ # 2 ] & ] / / F i r s t / / Union ; 1445 (*index = Union[Flatten[Cases[eq,#[__] | Derivative[__][#][__],Infinity]&/@(Flatten[ TargetOfElimination[[All ,2]]])]];*) 1446 (*index = Union[Flatten[Cases[eq,#[__] | Derivative[__][#][__],Infinity]&/@( TargetOfElimination [[2]])]];*) 1447 orphans = S o r t [ orphans , Count [ eq , # 1 , I n f i n i t y ] < Count [ eq , # 2 , I n f i n i t y ]& ] ; 1448 index = S o r t [ index , Count [ eq , # 1 , I n f i n i t y ] > Count [ eq , # 2 , I n f i n i t y ]& ] ; 1449 (*Print["orphans::",orphans]; 1450 Print["index::",index]; 1451 Print["data::",Count[index ,#,Infinity]&/@orphans]; 1452 Print["data::",Count[#,Alternatives@@orphans ,Infinity]&/@index]; 1453 Print["data::",Count[eq,#,Infinity]&/@index];*) 1454 tmp = eq ; 1455 1456 Do [ I f [ Count [ tmp , index [ [ j ] ] , I n f i n i t y ] == 0 , Continue [ ] ] ; 1457 I n v e s t i g a t i n g E q = S o l v e [ tmp , index [ [ j ] ] ] / / F l a t t e n ;

105

1458

I f [ Length [ I n v e s t i g a t i n g E q ] == 0 , tmp = S im pl if yE q [ tmp , i v s , TimeConstrained [ $ S i m p l i f i c a t i o n F u n c t i o n [ # ] , $TimeConstrained , Message [ Si mp li f yE q : : OutOfTime , $TimeConstrained ] ; # ] & ] ; Continue [ ] ] ; I f [ Length [ I n v e s t i g a t i n g E q ] == 1 , I n v e s t i g a t i n g E q = Equal@@ ( I n v e s t i g a t i n g E q [ [ 1 ] ] ) , Continue [ ] ] ; SuitableOrphan = DeleteCases [ orphans , A l t e r n a t i v e s @ @ ( List@@index [ [ j ] ] ) ] ; backup = tmp ; Do [ tmp = Si m pl if yE q [D[ I n v e s t i g a t i n g E q , SuitableOrphan [ [ k ] ] ] , i v s ] ; I f [ tmp === True , Continue [ ] , Break [ ] ] , { k , 1 , Length [ SuitableOrphan ] } ] ; I f [ tmp === True , tmp = backup ] , { j , 1 , Length [ index ] } ] ; I f [ tmp === eq , Message [ F u n c t i o n S p l i t : : dcpl , eq , index ] ; Continue [ ] ] ; AppendTo [ myeqs , tmp ] , { i , 1 , Length [ s e l e c t i o n ] } ] ; myeqs

1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485

]

(* 18/01/2006 *) GetDependenceOfDummyVar [ v a r s _ L i s t ] / ; Count [ vars , DummyVar [ _ I n t e g e r ] ] > 0 : = Module [ { d l i s t = { } , tmp = { } } , d l i s t = #1−>Complement [ # 2 [ [ 1 ] ] , Complement [ vars , { # 1 } ] ] & @@@DummyVarList ; tmp = Cases [ vars , DummyVar [ _ I n t e g e r ] ] / / Union ; F l a t t e n [ tmp / . d l i s t ] / / Union ] GetDependenceOfDummyVar [ _ ] = { }

(* 01/01/2006 *) GetGlobalAnalysis [ e q s _ L i s t ] : = Union [ Thread [ C h a r a c t e r i z e E q [ S e l e c t [ eqs , ( ! I n t e g r a l Q [ # ] ) && C h a r a c t e r i z e E q [ # , Verbose −> F a l s e ] = ! = {}& ] , Verbose −> F a l s e ] [ [ { 1 , 2 } ] ] ] , Cases [ eqs , FreeFunc [ i _ ] [ i v _ _ ] −> { { i v } , FreeFunc [ i ] } , I n f i n i t y ] ]

1486 1487 GetGlobalAnalysis [ e q s _ L i s t , KnownFunctions_ ? VectorQ ] : = Module [ { temp = S e l e c t [ KnownFunctions , Count [ eqs , # , I n f i n i t y , Heads−>True ] >0&]} , 1488 I f [ temp === { } , GetGlobalAnalysis [ eqs ] , Union [ GetGlobalAnalysis [ eqs ] , F i r s t [ Union [ Cases [ eqs , ( D e r i v a t i v e [ _ _ I n t e g e r ] [ # ] | # ) [ v a r s _ _ ] : > { { v a r s } , # } , I n f i n i t y ] ] ] & / @temp ] ] 1489 ] 1490 1491 (* 29/01/2005 *) 1492 1493 GetNotebookHandle [ name_String ] : = Module [ { date = T o S t r i n g / @ Date [ ] } , 1494 NotebookCreate [ WindowTitle −> T o S t r i n g [ StringForm [ " ‘ 1 ‘ − ‘ ‘ _ ‘ ‘ _ ‘ ‘ ‘ ‘ − ‘ ‘ − ‘ ‘ " , name , date [ [ 4 ] ] , date [ [ 5 ] ] , S t r i n g T a k e [ date [ [ 6 ] ] , 5 ] , date [ [ 3 ] ] , date [ [ 2 ] ] , date [ [ 1 ] ] ] ] , PageWidth −> WindowWidth ] 1495 ] 1496 1497 (* 23/02/2005 *) 1498 1499 GetNotebookObject [ name_String ] : = Module [ { date = T o S t r i n g / @ Date [ ] , obj , path } , 1500 path = $WriteFilePath T o S t r i n g [ StringForm [ " ‘ 1 ‘ − ‘ ‘ _ ‘ ‘ _ ‘ ‘ ‘ ‘ − ‘ ‘ − ‘ ‘ " , " Log f i l e of " name , date [ [ 4 ] ] , date [ [ 5 ] ] , S t r i n g T a k e [ date [ [ 6 ] ] , 5 ] , date [ [ 3 ] ] , date [ [ 2 ] ] , date [ [ 1 ] ] ] ] < > " . nb " ; 1501 o b j = NotebookCreate [ V i s i b l e −>False , S t y l e D e f i n i t i o n s −>" C l a s s i c . nb " ] ; 1502 NotebookSave [ obj , path ] ; 1503 { obj , path } 1504 ] 1505 1506 (* 8/03/2006 *) 1507 1508 GetOptimalSystem [ rawdata_ ? MatrixQ ] : = Module [ { CasesIndex , optimalsystem } , 1509 Off [ S o l v e : : " s v a r s " ] ; 1510 CasesIndex = J o i n [ # , Union [ F l a t t e n [ I f [ # [ [ 4 ] ] = ! = { } , Function [ x , { 0 , # [ [ 2 ] ] , { Equal @@ x } , { } , { } } ] / @ # [ [ 4 ] ] ] , 1 ] & /@#]]&@Union [ I f [ Head [ # [ [ 1 ] ] ] === And , { # [ [ 2 , 1 ] ] , Last [ # ] , Cases [ # [ [ 1 ] ] , _Equal ] , Cases [ # [ [ 1 ] ] , _Unequal ] , { } } , { # [ [ 2 , 1 ] ] , Last [ # ] , { # [ [ 1 ] ] } , { } , { } } ] & / @ F l a t t e n [ D i s t r i b u t e [ # , Or , L i s t , L i s t , L i s t ]&/ @ S e l e c t [ Reap [ Function [ v , MapIndexed [ I f [ Count [ # 1 , Global ‘ \ [ C u r l y E p s i l o n ] , I n f i n i t y ] > 0 , Sow [ { # 1 , #2 , v } ] ] & , v ] ] / @rawdata ] [ [ 2 , 1 ] ] / . { eq_ , p o s _ ? ( MatchQ [ # , { _ I n t e g e r } ] &) , v _ L i s t } : > { S e l e c t [ LogicalExpand [ Reduce [ eq == 0 , Global ‘ \ [ C u r l y E p s i l o n ] ] / . { _Element | _NotElement −> True } ] , Count [ # , Global ‘ \ [ C u r l y E p s i l o n ] , I n f i n i t y ] > 0&] , pos , v } , Count [ # [ [ 1 ] ] , Global ‘ \ [ C u r l y E p s i l o n ] , I n f i n i t y ] > 0&] , 1 ] ] ; 1511 optimalsystem = Reap [ I f [ # 1 === { } , Sow [ { # 2 , # 3 } , { { RandomReal [ ] } } ] , Sow [ { # 2 , # 3 } , { # 1 } ] ] & @@@Union [ Cases [ Optimal [ rawdata , Complement [ CasesIndex , { # } ] ] [ # ] & / @CasesIndex , { _ L i s t , { Global ‘ \ [ Kappa ] [ _ I n t e g e r ] . . } , _ L i s t } , I n f i n i t y ] ] , _ , { # 1 / . { _ R e a l } −> { } , Sequence@@ ( MapAt [ I f [ # = ! = { } , I f [ Head [ # ] === And , List@@ # , { # } ] & @Simplify [ And@@# ] , #]& , Union [ F l a t t e n [ # ] ] & / @Thread [ # 2 ] , 2 ] ) } & ] [ [ 2 ] ] ; 1512 On [ S o l v e : : " s v a r s " ] ; 1513 optimalsystem =Reap [ Sow [ { # 1 , # 3 } , {#2}]& @@@optimalsystem , _ , Function [ { v1 , v2 } , { I f [ Length [ # ] = = 1 , F l a t t e n [ # , 1 ] , # ] & @Union [ # 1 ] , v1 , I f [ # = ! = { } , I f [ Head [ # ] === And , List@@ # , { # } ] & @Simplify [ And@@# ] , #]& @Union [ F l a t t e n [ # 2 , 1 ] ] } & @@Thread [ v2 ] ] ] [ [ 2 ] ] ; 1514 P r i n t [ " The o p t i m a l s e t has " , Length [ optimalsystem ] , " elements . For f u r t h e r r e f i n e m e n t use t h e invariants . " ] ; 1515 optimalsystem 1516 ] 1517 1518 GetOptimalSystem [ CommutatorTable_ ? ( MatchQ [ # , { { { _ _ I n t e g e r } . . } . . } ] & ) , o p t s _ _ _ ] : = I f [ RawData / . { o p t s } / . Options [ GetOptimalSystem ] , 1519 Append [ MapAt [ GetOptimalSystem , # , 1 ] / / Most , # [ [ 1 ] ] ] & @GetOptimalSystemRawData [ CommutatorTable ] 1520 , 1521 MapAt [ GetOptimalSystem , GetOptimalSystemRawData [ CommutatorTable ] , 1 ] / / Most 1522 ] 1523 1524 (* 16/07/2008 *)

106

Κ S

1525 1526 GetOptimalSystemRawData [ s t r u c t r u r e c o n s t a n t s _ L i s t ] / ; ArrayDepth [ s t r u c t r u r e c o n s t a n t s ]==3 : = Module [ { A, l e n = Dimensions [ s t r u c t r u r e c o n s t a n t s ] [ [ 1 ] ] , kappas = { } , i n v a r i a n t s , temp , output } , 1527 A = Table [ s t r u c t r u r e c o n s t a n t s [ [ All , i , A l l ] ] , { i , 1 , l e n } ] ; 1528 kappas = Array [ Global ‘ \ [ Kappa ] , l e n ] ; 1529 temp=kappas . # & /@A; 1530 P r i n t [ " The number of f u n c t i o n a l y independent i n v a r i a n t s are : " , len−MatrixRank [ temp ] ] ; 1531 temp = RowReduce [ temp ] ; 1532 i n v a r i a n t s =D[ Global ‘ \ [ S c r i p t C a p i t a l I ] @@kappas , # ] & / @kappas ; 1533 i n v a r i a n t s = DeleteCases [ temp . i n v a r i a n t s , 0 ] ; 1534 (*{kappas.MatrixExp[Global ‘\[CurlyEpsilon ]*#]&/@A, DeleteCases[temp.invariants ,0], kappas}*) 1535 temp = SolveOverdeterminedEqs [#==0&/ @ i n v a r i a n t s ] ; 1536 I f [ MatchQ [ temp , { { { Global ‘ \ [ S c r i p t C a p i t a l I ]−> _ } , { } } . . } | { { Global ‘ \ [ S c r i p t C a p i t a l I ]−> _ } , { } } ] , 1537 temp = Cases [ temp , Rule [ _ , f u n c _ ] : > List@@func [ [ 2 ] ] , I n f i n i t y ] / / Union ; 1538 I f [ Length [ temp ] == 1 , 1539 { kappas . MatrixExp [ Global ‘ \ [ C u r l y E p s i l o n ] ∗ #]&/@A, temp [ [ 1 ] ] , kappas } 1540 , 1541 { kappas . MatrixExp [ Global ‘ \ [ C u r l y E p s i l o n ] ∗ #]&/@A, # , kappas }&/ @temp 1542 ] 1543 , 1544 P r i n t [ "Can ’ t determine t h e i n v a r i a n t s . Giving t h e system of d i f f e r e n t i a l e q u a t i o n s i n s t e a d " ]; 1545 { kappas . MatrixExp [ Global ‘ \ [ C u r l y E p s i l o n ] ∗ #]&/@A, i n v a r i a n t s , kappas } 1546 ] 1547 ] 1548 1549 (* 02/01/2006 *) 1550 1551 GetRawInfo [ eq_Equal ] : = Module [ { I n d e p en d e n t V ar i a b l e s = { } , DependentVariables = { } , index = { } , o r d e r i n f o = { } , MaxOrder = { } , temp } , 1552 I f [ Count [ eq , HoldPattern [ D e r i v a t i v e [ x _ _ I n t e g e r ] [ y _ ] [ z _ _ ] ] , I n f i n i t y ]==0 , 1553 I f [ Count [ eq , ( ( fun_Symbol | Q) [ _ _ I n t e g e r ] | A l t e r n a t i v e s @ @ $ D i s c r e t e F u n c t i o n s I n d e x | ( A l t e r n a t i v e s @ @ $ D i s c r e t e F u n c t i o n s I n d e x ) [ _ _ I n t e g e r ] ) [ _ _ _ , _ + _ I n t e g e r , _ _ _ ] / ; Context [ fun ]=== " Global ‘ " , I n f i n i t y ] >0 , 1554 temp = Cases [ eq , ( fun_Symbol | ( f u n _ | Q) [ _ _ I n t e g e r ] ) [ _ _ _ , _ + _ I n t e g e r , _ _ _ ] / ; Context [ fun ]=== " Global ‘ " , I n f i n i t y ] / / Union ; 1555 temp = Union [ { Thread [ I f [ MatchQ [ # , _ + _ I n t e g e r ] , # / . ( v a r _ + i d x _ I n t e g e r ) −>{var , i d x } , { # , 0 } ] & / @List@@ # ] , Head [ # ] } & / @temp ] ; 1556 temp = F l a t t e n [ Reap [ Sow@@@temp , temp [ [ All , 2 ] ] / / Union , L i s t [ # 1 , Thread [ # 2 ] ] & ] / / Last ,1]; 1557 { IndependentVariables , o r d e r i n f o , DependentVariables } = Transpose [ MapAt [ I f [ SameQ@@# , F i r s t [ # ] , F a l s e ]& ,Append@@ ( Reverse [ # ] ) , 1 ] & / @temp ] ; 1558 I f [ ( temp = Complement [ DependentVariables , $ D i s c r e t e F u n c t i o n s I n d e x ] ) = ! = { } , AddDiscreteFunction [ temp ] ] ; 1559 I f [ MemberQ [ IndependentVariables , F a l s e ] , 1560 index = P o s i t i o n [ IndependentVariables , F a l s e ] ; 1561 Message [ GetRawInfo : : wellformed , eq , StringDrop [ StringDrop [ DependentVariables [ [ index / / F l a t t e n ] ] / / F l a t t e n / / Union / / ToString , − 1 ] , 1 ] ] ; 1562 Abort [ ] 1563 ]; 1564 MaxOrder = Transpose / @ o r d e r i n f o ; 1565 MaxOrder = Apply [ Max , MaxOrder , { 2 } ] ; 1566 Return [ { IndependentVariables , DependentVariables , Thread [ { DependentVariables , MaxOrder } ] , F l a t t e n [ # , 1 ] & / @Thread [ { DependentVariables , o r d e r i n f o } ] } ] 1567 , 1568 Return [ { } ] 1569 ] 1570 , 1571 temp=Cases [ eq , D e r i v a t i v e [ x _ _ I n t e g e r ] [ y _ ] [ z _ _ ] −> { { z } , { y } , { x } } , I n f i n i t y ] / / Union ; 1572 { IndependentVariables , DependentVariables , o r d e r i n f o }= Transpose [ temp ] ; 1573 DependentVariables = Union [ F l a t t e n [ DependentVariables ] ] ; 1574 index = F i r s t / @Position [ temp [ [ All , 2 ] ] , # ] & / @ DependentVariables ; 1575 I f [ ! And@@SameQ@@@ ( I n d e p en d e n t V ar i a b l e s =temp [ [ # ] ] [ [ All , 1 ] ] & / @ index ) , 1576 index = F i r s t / @ ( S e l e c t [ index , ! SameQ@@temp [ [ # ] ] [ [ All , 1 ] ] & ] ) ; 1577 Message [ GetRawInfo : : wellformed , eq , StringDrop [ StringDrop [ T o S t r i n g [ F l a t t e n [ temp [ [ index ] ] [ [ All , 2 ] ] ] ] , 1 ] , − 1 ] ] ; 1578 Abort [ ] 1579 ]; 1580 I n d e pe n d e n t Va r i a b l es = F i r s t / @IndependentVariables ; 1581 o r d e r i n f o = temp [ [ # ] ] [ [ All , 3 ] ] & /@ index ; 1582 MaxOrder = Transpose / @ o r d e r i n f o ; 1583 MaxOrder = Apply [ Max , MaxOrder , { 2 } ] ; 1584 { IndependentVariables , DependentVariables , Transpose [ { DependentVariables , MaxOrder } ] , F l a t t e n [ # , 1 ] & / @Transpose [ { DependentVariables , o r d e r i n f o } ] } 1585 ] 1586 ] 1587 1588 GetRawInfo : : wellformed = " The equation ‘ 1 ‘ i s not well −formed . The f u n c t i o n ( s ) ‘ 2 ‘ appear with d i f f e r e n t arguments " 1589 1590 S e t A t t r i b u t e s [ GetRawInfo , L i s t a b l e ] 1591 1592 (* 14/03/2006 *) 1593 1594 GlobalToLocal [ eq_Equal , G l o b a l A n a l y s i s _ L i s t ] : = S e l e c t [ GlobalAnalysis , Count [ eq , # [ [ 2 ] ] , I n f i n i t y , Heads −> True ] > 0& ] 1595 1596 (* 20/5/2004 *) 1597

107

1598 GroupFromAlgebra [ a l g e b r a _ F u n c t i o n ] : = Module [ { v a r s = Cases [ { a l g e b r a } , HoldPattern [D[ S l o t [ _ _ I n t e g e r ] , x _ ] ] : > x , I n f i n i t y , Heads −> True ] / / Union , rhs = { } , parameter = Unique [ Global ‘ \ [ C u r l y E p s i l o n ] ] , r u l e s = { } , system = { } , s o l u t i o n } , 1599 system = J o i n [ Equal@@@Thread [ { P a r t i a l [ parameter ] / @ ( v a r s / . s : A l t e r n a t i v e s @ @ v a r s : > OverTilde [ s ] [ parameter ] ) , ( a l g e b r a / @vars ) / . s : A l t e r n a t i v e s @ @ v a r s : > OverTilde [ s ] [ parameter ] } ] , OverTilde [ # ] [ 0 ] == #&/ @vars ] ; 1600 s o l u t i o n = DSolve [ system , OverTilde / @vars , parameter ] ; 1601 I f [ Head [ s o l u t i o n ] = ! = L i s t , system , F l a t t e n [ s o l u t i o n ] / / Union ] 1602 ] 1603 1604 (* 15/06/2006 *) 1605 1606 HomotopyOperator [ f u n s _ ? VectorQ ] [ e x p r _ ? VectorQ ] : = HomotopyOperator [ funs ] / @ e x p r 1607 1608 HomotopyOperator [ v a r _ , f u n _ [ v a r s _ _ ] , maximums_? VectorQ ] [ e x p r _ ] / ; Length [ maximums ] == Length [ { v a r s } ] : = Module [ { i , indexes , vpos = F l a t t e n [ P o s i t i o n [ { v a r s } , var ] ] , p r o t o t y p e = Array [ I f [ # == 1 , 1 , 0] &, Length [ { v a r s } ] ] , t a b l e i d x , summation } , 1609 i n d e x e s = Array [ i , { Length [ { v a r s } ] } ] ; 1610 t a b l e i d x = ( { # [ [ 1 ] ] , 0 , # [ [ 2 ] ] } & / @Transpose [ { indexes , maximums − RotateRight [ p r o t o t y p e , vpos − 1 ] } ] ) ; 1611 Sum [ ( 1 + i @@ # 1 ) / ( 1 + Plus @@ #2)D[ # 3 Eul erO pera tor [ # 2 + RotateRight [ p r o t o t y p e , #1 − 1 ] , # 3 ] [ # 4 ] , Sequence @@ Transpose [ { L i s t @@ #3 , # 2 } ] ] , ##5] &[ vpos , indexes , fun [ v a r s ] , expr , Sequence @@ t a b l e i d x ] 1612 ] 1613 1614 HomotopyOperator [ f u n s _ ? VectorQ ] [ e x p r _ ] : = Module [ { dindex = Cases [ { e x p r } , D e r i v a t i v e [ i d x _ _ I n t e g e r ] [ Head [ # ] ] [ Sequence @@ L i s t @@ # ] −> { i d x } , I n f i n i t y ] & / @ funs , v a r s = L i s t @@@ funs , Global ‘ \ [ Lambda ] , subs , res , $F , f r u l e s = { } } , 1615 I f [ MatchQ [ dindex , { { } . . } ] , Return [ { } ] ] ; 1616 I f [ SameQ@@vars , 1617 vars = vars [ [ 1 ] ] 1618 , 1619 v a r s = F l a t t e n [ v a r s ] / / Union ; 1620 f r u l e s = MapThread [ { # 1 −> Function@@ { vars , # 2 } , Head[#2] − > Function@@ { List@@ # 2 , # 1 @@vars } } & , { Array [ $F , Length [ funs ] ] , funs } ] / / Transpose ; 1621 Return [ Thread [ { HomotopyOperator [ funs / . f r u l e s [ [ 2 ] ] ] [ e x p r / . f r u l e s [ [ 2 ] ] ] / . f r u l e s [ [ 1 ] ] , v a r s } ] ] 1622 ]; 1623 subs = ( Head [ # ] −> Function @@ { vars , Global ‘ \ [ Lambda ] # } ) & / @ funs ; 1624 dindex = I f [ # = ! = { } , Max / @ Transpose [ # ] , 0 ] & / @ dindex ; 1625 I f [ Count [ dindex , 0 ] > 0 , dindex = MapThread [ I f [#1===0 ,0 List@@ # 2 , # 1 ] & , { dindex , funs } ] ] ; 1626 r e s = Function [ $x , Plus @@ ( HomotopyOperator [ $x , Sequence @@ # ] [ e x p r ] & / @Transpose [ { funs , dindex } ] ) ] /@ vars ; 1627 r e s = I n t e g r a t e [ ( # / . subs ) / Global ‘ \ [ Lambda ] , { Global ‘ \ [ Lambda ] , 0 , 1 } ] & / @ r e s ; 1628 $ S i m p l i f i c a t i o n F u n c t i o n [ I f [ Length [ v a r s ] == 1 , r e s [ [ 1 ] ] , r e s ] ] 1629 ] 1630 1631 (* 21/03/2007 *) 1632 1633 Hunter [ S t e p _ I n t e g e r , handle_ , SystemOfEqs_List , F u n c t i o n s T o E l i m i n a t e _ L i s t , V a r s _ L i s t ] : = Module [ { m a t r i c u l a t e d , F u n c t i o n s C l a s s i f i e d = F l a t t e n [ Reap [ Sow [ # , I f [ MatchQ [ # , D e r i v a t i v e [ _ _ ] [ _ ] [ _ _ ] ] , { { List@@ # [ [ 0 , 0 ] ] , List@@ # } } , { List@@ # } ] ] & / @FunctionsToEliminate , Union [ I f [ MatchQ [ # , D e r i v a t i v e [ _ _ ] [ _ ] [ _ _ ] ] , { List@@ # [ [ 0 , 0 ] ] , List@@ # } , List@@ #]&/ @FunctionsToEliminate ] , # 2 & ] / / Last , 1 ] , q u a r r i e s = { } , I n v e r s a b l e M a t r i c e s = { } , c h o i c e = { } , newsystem , f u n c t i o n s o n l y = DummyVarList [ [ All , 2 , 1 ] ] / / F l a t t e n / / Union } , 1634 I f [ FunctionsToEliminate = = = { } , Return [ { Step , handle , SystemOfEqs , FunctionsToEliminate , Vars } ] ] ; 1635 m a t r i c u l a t e d = SystemToMatrix [ SystemOfEqs , F u n c t i o n s C l a s s i f i e d ] ; 1636 (* ’Elenqoc ’uparxhc sunart’hsewn proc apaloif’h *) 1637 I n v e r s a b l e M a t r i c e s = S e l e c t [ m a t r i c u l a t e d , Count [ { # [ [ 1 ] ] } , DummyVar [ _ I n t e g e r ] [ _ _ ] , I n f i n i t y ]==0&]; 1638 I f [ I n v e r s a b l e M a t r i c e s === { } , 1639 I f [ Count [ m a t r i c u l a t e d [ [ All , 2 ] ] , A l t e r n a t i v e s @ @ f u n c t i o n s o n l y , I n f i n i t y ] == 0 , Return [ { Step , handle , SystemOfEqs , FunctionsToEliminate , Vars } ] ] ; 1640 q u a r r i e s = #1==#2@@# 2 [ [ 1 ] ] & @@@DummyVarList ; 1641 Return [ { Step , handle , ( XEliminate [ # , q u a r r i e s , f u n c t i o n s o n l y ] / . ( # 1 − > # 1@@# 2 [ [ 1 ] ] & @@@DummyVarList ) ) &/@ ( SystemOfEqs / . DummyVar[ i _ _ ] [ _ _ ]−>DummyVar [ i ] ) , { } , Vars } ] 1642 1643 ]; 1644 Ermis [ handle , " S t e p " T o S t r i n g [ S t e p ] , 5 ] ; 1645 Ermis [ handle , " The equation ( s ) : " , 2 ] ; 1646 Ermis [ handle , # ] & / @SystemOfEqs ; 1647 Ermis [ handle , " in matrix form are : " , 2 ] ; 1648 Ermis [ handle , TableForm [ Thread [ Map [ MatrixForm , m a t r i c u l a t e d , { 2 } ] ] ] ] ; 1649 I n v e r s a b l e M a t r i c e s = S e l e c t [ I n v e r s a b l e M a t r i c e s , F u l l S i m p l i f y [ Det [ # [ [ 2 ] ] ] ] = ! = 0&]; 1650 I n v e r s a b l e M a t r i c e s = Append [ # , Count [ { # [ [ 2 ] ] } , A l t e r n a t i v e s @ @ f u n c t i o n s o n l y , I n f i n i t y , Heads−>True ] LeafCount [ # [ [ 2 ] ] ] ] & / @ I n v e r s a b l e M a t r i c e s ; 1651 I n v e r s a b l e M a t r i c e s = Most / @Sort [ I n v e r s a b l e M a t r i c e s , # 1 [ [ 3 ] ] < # 2 [ [ 3 ] ] & ] ; 1652 choice = InversableMatrices / / F i r s t ; 1653 I f [ c h o i c e === { } , P r i n t [ " asychronous a n a l y s i s needed " ] ; Return [ { Step , handle , SystemOfEqs , FunctionsToEliminate , Vars } ] ] ; 1654 choice [ [ 2 ] ] = Inverse [ choice [ [ 2 ] ] ] ; 1655 Ermis [ handle , " and , I choose t o s o l v e in r e s p e c t t o t h e f u n c t i o n ( s ) : " , 2 ] ; 1656 Ermis [ handle , c h o i c e [ [ 1 ] ] / / MatrixForm ] ; 1657 m a t r i c u l a t e d =MapAt [ c h o i c e [ [ 2 ] ] ∗ # & , # , 2 ] & / @ m a t r i c u l a t e d ; 1658 newsystem = MatrixToSystem [ m a t r i c u l a t e d ] ; 1659 P r i n t [ m a t r i c u l a t e d [ [ All , 1 ] ] / / F l a t t e n ] ; 1660 matriculated = . ; 1661 q u a r r i e s = Complement [ f u n c t i o n s o n l y , F l a t t e n [ List@@@choice [ [ 1 ] ] ] ] ; 1662 I f [ q u a r r i e s === { } , Return [ { Step , handle , SystemOfEqs , FunctionsToEliminate , Vars } ] ] ; 1663 Ermis [ handle , " furthermore , I choose t o d i f f e r e n t i a t e t h e equation ( s ) : " , 2 ] ; 1664 Ermis [ handle , # ] & / @newsystem ; 1665 Ermis [ handle , " in r e s p e c t t o one of t h e v a r i a b l e s : " , 2 ] ; 1666 Ermis [ handle , # ] & / @ q u a r r i e s ;

108

Κ S

1667 1668 1669 1670 1671 1672 1673 1674 1675 1676

P r i n t [ " Before Si m pl if yE q " ] ; newsystem = ( ( P r i n t [ "D+ + : : " , LeafCount [ # ] ] ; S im pl if yE q [ # , Union [ Vars , f u n c t i o n s o n l y ] ] ) &/@D[ newsystem , # ] ) &/ @ q u a r r i e s ; P r i n t [ " A f t e r Si mp l if yE q " ] ; newsystem = S o r t [ newsystem / . ( # 1 − > # 1@@# 2 [ [ 1 ] ] & @@@DummyVarList ) , LeafCount [ # 1 ] < LeafCount [ # 2 ] & ] / / F i r s t ; Ermis [ handle , " such , o b t a i n i n g t h e equation ( s ) : " , 2 ] ; Ermis [ handle , # ] & / @newsystem ; Ermis [ handle , 1 ] ; Write [ $Cache , SystemOfEqs ] ; P r i n t [ Step , " M i s s i s s i p i " ] ; { S t e p + 1 , handle , newsystem , Union [ Cases [ newsystem , A lt e rn at i ve s@ @ Fu nc t io ns T oE li m in a te | D e r i v a t i v e [ _ _ ] [ _ ] [ _ _ ] , I n f i n i t y ] ] , Vars }

1677 ] 1678 1679 (* 07/04/2006 *) 1680 1681 IdealQ [ s t r u c t u r e c o n s t a n t s _ , S u b A l g e b r a _ L i s t , S u b A l g e b r a I n d e x _ L i s t : { } ] / ; ArrayQ [ s t r u c t u r e c o n s t a n t s , 3 ] : = Module [ { l e n = Dimensions [ s t r u c t u r e c o n s t a n t s ] , index = Union [ F l a t t e n [ List@@@SubAlgebra ] ] } , 1682 I f [ UnsameQ@@len , P r i n t [ " I n v a l i d s t r u c t u r e c o n s t a n t s d e t e c t e d " ] ; Abort [ ] , l e n = l e n [ [ 1 ] ] ] ; 1683 I f [ SubAlgebraIndex = ! = { } , 1684 I f [ Length [ SubAlgebraIndex ] = ! = len , 1685 P r i n t [ " I n v a l i d SubAlgebraIndex d e t e c t e d " ] ; Abort [ ] 1686 ]; 1687 index = Rule@@@Thread [ { Union [ SubAlgebraIndex ] , Array [ X, l e n ] } ] ; 1688 index = Union [ F l a t t e n [ List@@@ ( SubAlgebra / . index ) ] ] 1689 ]; 1690 ( s t r u c t u r e c o n s t a n t s [ [ index , # , # ] ] & [ Complement [ Array [#& , l e n ] , index ] ] / / F l a t t e n / / Union ) === { 0 } 1691 ] 1692 1693 (* 1/10/2004 *) 1694 1695 I n s t a l l H e l p F i l e s [ ] : = I n s t a l l H e l p F i l e s [ i n s t a l l ] 1696 1697 I n s t a l l H e l p F i l e s [ s : ( i n s t a l l | u n i n s t a l l ) ] : = Module [ { strm , d i r = $ I n s t a l l a t i o n D i r e c t o r y " \\ Documentation\\ E ng li sh \\AddOns\\ BrowserCategories .m" } , 1698 strm = OpenRead [ d i r ] ; 1699 BrowserCategories = Read [ strm ] ; 1700 Close [ strm ] ; 1701 I f [ Count [ BrowserCategories , H e l p D i r e c t o r y L i s t i n g [ "Sym" , F a l s e ] , I n f i n i t y ] > 0 && s === i n s t a l l , 1702 Return [ " Package a l r e a d y i n t e g r a t e d . Please , use t h e Rebuild Help Index command in t h e Help menu t o update t h e index of t h e Help Browser " ] 1703 ]; 1704 strm = OpenWrite [ d i r ] ; 1705 I f [ s === i n s t a l l , 1706 BrowserCategories = MapAt [ J o i n [ # , { H e l p D i r e c t o r y L i s t i n g [ { FrontEnd ‘ FileName [ { "AddOns" , "Sym" } ] } , F a l s e ] } ] &, BrowserCategories , 3 ] ; 1707 Write [ strm , BrowserCategories ] ; 1708 Close [ strm ] ; 1709 Return [ " Help f i l e s i n t e g r a t e d s u c c e s f u l l y ! Please , use t h e Rebuild Help Index command in t h e Help menu t o update t h e index of t h e Help Browser " ] 1710 , 1711 BrowserCategories = MapAt [ DeleteCases [ # , H e l p D i r e c t o r y L i s t i n g [ { FrontEnd ‘ FileName [ { "AddOns" , "Sym" } ] } , F a l s e ] , I n f i n i t y ] &, BrowserCategories , 3 ] ; Write [ strm , BrowserCategories ] ; 1712 Close [ strm ] ; 1713 Return [ " Help f i l e s removed s u c c e s f u l l y ! Please , use Rebuild Help Index command in t h e Help menu t o update t h e index of t h e Help Browser " ] 1714 ] 1715 ] 1716 1717 (* 29/09/2006 *) 1718 1719 I n t e g r a l Q [ e q _ ] : = Count [ { eq } , HoldPattern [ I n t e g r a t e [ _ _ _ ] ] , I n f i n i t y ] > 0 1720 1721 (* 21/04/2004 *) 1722 1723 I n t e g r a l R u l e s = { 1724 (* rule to turn definite integrals to indefinite *) 1725 HoldPattern [ I n t e g r a t e [ func_ , l i m _ L i s t ] ] : > I n t e g r a t e [ func / . { lim [ [ 1 ] ] −> lim [ [ 3 ] ] } , lim [ [ 3 ] ] ] / ; MatchQ [ lim [ [ 1 ] ] , K[ _ I n t e g e r ] ] , 1726 (* rule to turn succesive integrations to one multiple integral *) 1727 HoldPattern [ I n t e g r a t e [ I n t e g r a t e [ a r g _ , a _ _ ] , b _ _ ] ] : > I n t e g r a t e [ arg , a , b ] / ; VectorQ [ J o i n [ { a } , { b } ] ] && Count [ { arg } , HoldPattern [ I n t e g r a t e [ _ _ ] ] , I n f i n i t y ] == 0 , 1728 (* rule for expanding integrands *) 1729 HoldPattern [ I n t e g r a t e [ fun_ , o t h e r _ _ ] ] : > I n t e g r a t e [ Expand [ fun ] , o t h e r ] / ; Expand [ fun ] = ! = fun , 1730 (* rule for the linear attribute of integrals *) 1731 HoldPattern [ I n t e g r a t e [ Plus [ a_ , b _ _ ] , c _ _ , o p t s _ _ _ R u l e ] ] : > Plus@@ ( I n t e g r a t e [ # , c , o p t s ]&/@{ a , b } ) , 1732 HoldPattern [ I n t e g r a t e [ Times [ compon__ ] , { i n t v a r _ , l i m i t s _ _ } , o t h e r s _ _ _ L i s t , o p t s _ _ _ R u l e ] ] : > Module [ { i n d i e s = S e l e c t [ { compon } , D[ # , i n t v a r ] === 0 & ] } , I f [ { o t h e r s } === { } , Times [ Sequence @@ i n d i e s , I n t e g r a t e [ Times @@ Complement [ { compon } , i n d i e s ] , { i n t v a r , l i m i t s } , o p t s ] ] , I n t e g r a t e [ Times [ Sequence @@ i n d i e s , I n t e g r a t e [ Times @@ Complement [ { compon } , i n d i e s ] , { i n t v a r , l i m i t s } ] ] , others , opts ] ] / ; indies =!= { } ] , 1733 HoldPattern [ I n t e g r a t e [ Times [ compon__ ] , i n t v a r _ , r e s t _ _ _ , o p t s _ _ _ R u l e ] ] : > Module [ { i n d i e s = S e l e c t [ { compon } , D[ # , i n t v a r ] === 0 & ] } , I f [ { r e s t } === { } , Times [ Sequence @@ i n d i e s , I n t e g r a t e [ Times @@ Complement [ { compon } , i n d i e s ] , i n t v a r , o p t s ] ] , I n t e g r a t e [ Times [ Sequence @@ i n d i e s , I n t e g r a t e [ Times @@ Complement [ { compon } , i n d i e s ] , i n t v a r , o p t s ] ] , r e s t , o p t s ] ] / ; Head [ i n t v a r ] = ! = L i s t && i n d i e s = ! = { } ] ,

109

1734 1735

1736 1737 1738

(* rule for the integration by parts attribute *) HoldPattern [ I n t e g r a t e [ i t e r m : Times [ l t : _ _ _ , D e r i v a t i v e [ i d x 1 _ _ ] [ FreeFunc [ i d x 2 _ ] ] [ v a r s _ _ ] , r t : _ _ _ ] , i v a r _ ] ] / ; Count [ List@@iterm , HoldPattern [ I n t e g r a t e [ _ _ ] ] , I n f i n i t y ] == 0 && Count [ List@@iterm , FreeFunc [ _ ] , I n f i n i t y , Heads −> True ] == 1 && ( I f [ # === { } , F a l s e , { i d x 1 } [ [ # [ [ 1 , 1 ] ] ] ] > 0]& @Position [ { v a r s } , i v a r , 1 ] ) : > Module [ { pos = P o s i t i o n [ { v a r s } , i v a r ] [ [ 1 , 1 ] ] , t a r g e t = D e r i v a t i v e [ i d x 1 ] [ FreeFunc [ idx2 ] ] [ v a r s ] , newtarget } , newtarget = I n t e g r a t e [ t a r g e t , i v a r ]; Times [ l t , newtarget , r t ] − I n t e g r a t e [ $ S i m p l i f i c a t i o n F u n c t i o n [ Times [D[ Times [ l t , r t ] , i v a r ] , newtarget ] ] , i v a r ] ] } (* 06/02/2007 *)

1739 1740 1741 1742 1743 I n t e g r a l T o D i f f e r e n t i a l E q [ eq_ , v a r s _ ] : = 1744 Module [ { x = eq , Dvar , s o l u t i o n = { } , var , xold } , 1745 While [ I n t e g r a l Q [ x ] , 1746 Dvar = Cases [ x , HoldPattern [ I n t e g r a t e [ fun_ , i n t v _ _ ] ] , I n f i n i t y ] / / Union ; 1747 solution= { } ; 1748 Do [ s o l u t i o n = Check [ S o l v e [ x , Dvar [ [ i ] ] ] , { } ] / / F l a t t e n ; 1749 var = Last [ { ( List@@Dvar [ [ i ] ] ) [ [ 2 ] ] } / / F l a t t e n ] ; 1750 I f [ Head [ s o l u t i o n ]=== L i s t && Length [ s o l u t i o n ] == 1 && I n t e r s e c t i o n [ vars , { var } ] = ! = { } , Break [ ] , s o l u t i o n = { } ] 1751 , { i , 1 , Length [ Dvar ] } ] ; 1752 xold = x ; 1753 I f [ s o l u t i o n === { } , 1754 x = Si mp l if yE q [ x , vars , TimeConstrained [ $ S i m p l i f i c a t i o n F u n c t i o n [ # ] , $TimeConstrained , Message [ Si mp li fy E q : : OutOfTime , $TimeConstrained ] ; # ] & ] 1755 , 1756 x = D[ Equal@@First [ s o l u t i o n ] , var ] 1757 ]; 1758 I f [ x === xold , Return [ { } ] ] 1759 ]; 1760 Si mp li f yE q [ x , v a r s ] 1761 ] 1762 1763 (* 26/07/2004 *) 1764 1765 I n v a r i a n t S u r f a c e C o n d i t i o n [ symmetry_Function , D e p e n d e n t V a r i a b l e s _ L i s t ] : = Module [ { DummyFunc, i s c = { } , r u l e s = {}} , 1766 r u l e s = Rule@@@Thread [ { Head / @DependentVariables , Array [ DummyFunc, Length [ DependentVariables ] ] } ] ; 1767 i s c = $ S i m p l i f i c a t i o n F u n c t i o n [ MapThread [ Equal , { ( symmetry / @ r u l e s [ [ All , 1 ] ] ) / . r u l e s , symmetry / @ ( DependentVariables / . r u l e s ) } ] / . Reverse / @ r u l e s ] ; 1768 r u l e s = MakeRule [ Rule@@@Thread [ { DependentVariables , DependentVariables } ] ] ; 1769 i s c = i s c / . r u l e s / . Rule@@@Thread [ { r u l e s [ [ All , 2 ] ] , DependentVariables } ] ; 1770 I f [ Length [ i s c ] = = 1 , i s c [ [ 1 ] ] , i s c ] 1771 ] 1772 1773 I n v a r i a n t S u r f a c e C o n d i t i o n [ symmetry_Function , DependentVariables_ ] : = I n v a r i a n t S u r f a c e C o n d i t i o n [ symmetry , { DependentVariables } ] 1774 1775 (* 08/05/2005 *) 1776 1777 J e t S p a c e [ O r d e r _ I n t e g e r , i v _ ? VectorQ , { dv_ } ] : = Module [ { l e n = Length [ i v ] , ordermatrix , dmatrix , indexes , i } , 1778 i n d e x e s = Array [ i , l e n ] ; 1779 Fold [ T o S t r i n g [ StringForm [ "Do [ ‘ 1 ‘ , { ‘ 2 ‘ , 0 , ‘ 3 ‘ } ] " , # 1 , #2 , Order ] ] &, StringForm [ " I f [0 < Plus@@ ‘ 1 ‘ < = ‘ 2 ‘ , AppendTo [ ‘ 3 ‘ , ‘ 1 ‘ ] , Continue [ ] ] " , indexes , Order , o r d e r m a t r i x ] , 1780 i n d e x e s ] / / ( o r d e r m a t r i x = { } ; ToExpression [ # ] ) &; 1781 dmatrix = D e r i v a t i v e [ Sequence @@ # ] [ dv ] @@iv & / @ S o r t [ ordermatrix , Plus@@ #1 0 && And@@ ( # [ [ 1 ] ] OverTilde [ FreeFunc [ s ] ] ) − c s . o p e r a t o r s ; 1855 I f [ v a r s === { } , 1856 linearsum = linearsum [ TestFunc ] ; 1857 linearsum = OrphanSplit [ linearsum == 0 , Append [ vars , TestFunc ] , Append [ vars , TestFunc ] ] / / Union ; 1858 , 1859 I f [ ( temp = Cases [ { linearsum } , ( FreeFunc [ _ _ I n t e g e r ] | OverTilde [ FreeFunc [ _ _ I n t e g e r ] ] ) [ _ _ ] | D e r i v a t i v e [ _ _ I n t e g e r ] [ FreeFunc [ _ _ I n t e g e r ] | OverTilde [ FreeFunc [ _ _ I n t e g e r ] ] ] [ _ _ ] , I n f i n i t y ] / / Union ) = ! = { } , 1860 temp = Rule@@@Thread [ { temp , Array [ Unique [ x ]& , Length [ temp ] ] } ] ; 1861 linearsum = F l a t t e n [ OrphanSplit [#==0 , vars , J o i n [ vars , temp [ [ All , 2 ] ] ] ] & / @ ( linearsum / @vars / . temp ) / . Reverse / @temp ] / / Union ; 1862 temp = . ; 1863 linearsum = S im pl if yE q [ F i x e d P o i n t [ SimplifySystemOnce [ # , v a r s ] & , { { } , linearsum , { } } ] / / F l a t t e n , { } ] / / Union 1864 , 1865 linearsum = F l a t t e n [ OrphanSplit [#==0 , v a r s ]&/@ ( linearsum / @vars ) ] / / Union ; 1866 ] 1867 ]; 1868 I f [ Count [ { linearsum } , False , I n f i n i t y ] >0 , Return [ { } ] ] ; 1869 I f [ Count [ { linearsum } , FreeFunc [ _ _ I n t e g e r ] , I n f i n i t y , Heads−>True ] >0 , 1870 linearsum = { S e l e c t [ linearsum ,(#1 − #2 == 0 | | #2 == 0) &[Count [ { # } , FreeFunc [ _ _ I n t e g e r ] , I n f i n i t y , Heads−>True ] , Count [ { # } , OverTilde [ FreeFunc [ _ _ I n t e g e r ] ] , I n f i n i t y , Heads−>True ] ] & ] , linearsum } ; 1871 linearsum [ [ 2 ] ] = Complement@@ ( Reverse [ linearsum ] ) ;

111

1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882

I f [ Count [ linearsum [ [ 1 ] ] , FreeFunc [ _ _ I n t e g e r ] , I n f i n i t y , Heads−>True ] >0 , temp = Cases [ { linearsum } , ( FreeFunc [ _ _ I n t e g e r ] | OverTilde [ FreeFunc [ _ _ I n t e g e r ] ] ) [ _ _ ] | D e r i v a t i v e [ _ _ I n t e g e r ] [ FreeFunc [ _ _ I n t e g e r ] | OverTilde [ FreeFunc [ _ _ I n t e g e r ] ] ] [ _ _ ] , I n f i n i t y ] / / Union ; temp = Rule@@@Thread [ { temp , Array [ Unique [ x ]& , Length [ temp ] ] } ] ; linearsum [ [ 1 ] ] = linearsum [ [ 1 ] ] / . temp ; linearsum [ [ 1 ] ] = F l a t t e n [ OrphanSplit [ # , temp [ [ All , 2 ] ] ] & / @linearsum [ [ 1 ] ] ] / / Union ; I f [ Count [ linearsum [ [ 1 ] ] , F a l s e ] >0 , Return [ { } ] ] ; ]; s o l u t i o n s = S o l v e [ linearsum [ [ 1 ] ] , S e l e c t [ cs , Count [ linearsum [ [ 1 ] ] , # , I n f i n i t y ] > 0 & ] ] / / F l a t t e n ; s o l u t i o n s = J o i n [ s o l u t i o n s ,# − >1&/@Complement [ cs , s o l u t i o n s [ [ All , 1 ] ] ] ] ; linearsum = Si m pl if yE q [ linearsum [ [ 2 ] ] / . s o l u t i o n s , { } ] ; linearsum = S o l v e [ linearsum , Cases [ linearsum , FreeFunc [ _ _ I n t e g e r ] [ _ _ ] | D e r i v a t i v e [ _ _ I n t e g e r ] [ FreeFunc [ _ _ I n t e g e r ] ] [ _ _ ] , I n f i n i t y ] / / Union ] / / F l a t t e n ; , s o l u t i o n s = S o l v e [ linearsum , S e l e c t [ cs , Count [ linearsum , # , I n f i n i t y ] > 0 & ] ] / / F l a t t e n ; linearsum = { } ]; I f [ linearsum === { } , c s / . s o l u t i o n s , { c s / . s o l u t i o n s , linearsum } ]

1883 1884 1885 1886 1887 1888 ] 1889 1890 (* 11/05/2006 *) 1891 1892 LinearIndependentQ [ o p e r a t o r s _ L i s t , v a r s _ L i s t ] : = Module [ { linearsum , cs , c , TestFunc , s o l u t i o n s , l e n = Length [ operators ] } , 1893 c s = Array [ c , l e n ] ; 1894 linearsum = c s . o p e r a t o r s ; 1895 I f [ v a r s === { } , 1896 linearsum = linearsum [ TestFunc ] 1897 , 1898 linearsum = linearsum [ TestFunc@@vars ] 1899 ]; 1900 linearsum = OrphanSplit [ linearsum == 0 , Append [ vars , TestFunc ] , Append [ vars , TestFunc ] ] / / Union ; 1901 I f [ ( s o l u t i o n s = S e l e c t [ cs , Count [ { linearsum } , # , I n f i n i t y ] >0&]) = ! = cs , Return [ F a l s e ] ] ; 1902 s o l u t i o n s = S o l v e [ linearsum , s o l u t i o n s ] / / F l a t t e n ; 1903 I f [ Length [ s o l u t i o n s ] < len , Return [ F a l s e ] ] ; 1904 SameQ@@ ( { Sequence@@cs , 0 } / . s o l u t i o n s ) 1905 ] 1906 1907 (* 28/09/2004 *) 1908 1909 MakeRule [ e x p r : { _ _ E q u a l } , r e p t e r m _ L i s t ] / ; Length [ e x p r ] == Length [ repterm ] : = MapThread [ MakeRule , { expr , repterm } ] 1910 1911 MakeRule [ exp r_E qua l , r e p t e r m _ ] : = Module [ { s o l v e r e s = S o l v e [ expr , repterm ] / / F l a t t e n } , 1912 I f [ Length [ s o l v e r e s ] > 1 , Message [ MakeRule : : NoRepl , expr , repterm ] ; Return [ Null ] ] ; 1913 MakeRule [ s o l v e r e s [ [ 1 ] ] ] 1914 ] 1915 1916 MakeRule [ r _ R u l e ] : = Module [ { iv , dv , Order , command } , 1917 I f [ MatchQ [ r [ [ 1 ] ] , D e r i v a t i v e [ _ _ I n t e g e r ] [ _ ] [ _ _ ] ] , 1918 { iv , dv , Order }= T o S t r i n g [ FullForm [ # ] ] & / @ F l a t t e n [ Cases [ { r [ [ 1 ] ] } , D e r i v a t i v e [ x _ _ ] [ y _ ] [ z _ _ ] − >{{ z } , y , { x }}] ,1]; 1919 command=" HoldPattern [ D e r i v a t i v e [ o r d e r _ _ I n t e g e r / ; And@@NonNegative [ { o r d e r}− " Order " ] ] [ " dv " ] " StringDrop [ iv , 4 ] " ] : >D[ " T o S t r i n g [ FullForm [ r [ [ 2 ] ] ] ] " , Sequence@@Transpose [ { " i v " , { o r d e r } −" Order " } ] ] " ; 1920 command = ToExpression [ command ] 1921 , 1922 i v = L i s t @@ r [ [ 1 ] ] ; 1923 ToExpression [ " Rule [ " T o S t r i n g [ FullForm [ Head [ r [ [ 1 ] ] ] ] ] < > " , Function [ " T o S t r i n g [ FullForm [ i v ]] < > " , " T o S t r i n g [ FullForm [ r [ [ 2 ] ] ] ] < > " ] ] " ] 1924 ] 1925 ] / ; Head [ ExpandAll [ r [ [ 1 ] ] ] ] = ! = Plus 1926 1927 MakeRule [ r _ E q u a l ] : = MakeRule [ Rule@@r ] 1928 1929 S e t A t t r i b u t e s [ MakeRule , L i s t a b l e ] 1930 1931 (* 27/07/2006 *) 1932 1933 MakeItSo [ f u n _ ] : = Module [ { s } , 1934 ToExpression [ T o S t r i n g [ fun ] < > " / : MakeBoxes [ " T o S t r i n g [ fun ] < > " [ j _ _ I n t e g e r ] , form_ : StandardForm ] : = I n t e r p r e t a t i o n B o x @ @ { RowBox [ { S u p e r s c r i p t B o x [ MakeBoxes [ " T o S t r i n g [ fun ] < > " , form ] , RowBox [ { \ " ( \ " , Sequence@@ ( Rest [ F l a t t e n [ { Array [ \ " ,\ " &, Length [ { j } ] ] , MakeBoxes [ # , form ] & / @ { j } } / / Transpose ] ] ) ,\ " ) \ " } ] ] } ] , " T o S t r i n g [ fun ] < > " [ j ] } " ] 1935 ] 1936 S e t A t t r i b u t e s [ MakeItSo , L i s t a b l e ] 1937 1938 (* 23/06/2006 *) 1939 1940 MatrixToSystem [ M a t r i x S e t _ L i s t ] : = # == 0 & / @ Plus @@ Dot @@@ M a t r i x S e t 1941 1942 MatrixToSystem [ M a t r i x L i s t _ L i s t , S e t O f V a r s _ L i s t ] : = MatrixToSystem [ Thread [ { SetOfVars , M a t r i x L i s t } ] ] 1943 1944 (* 27/03/2005 *) 1945 1946 MaximalSet [ S e t s _ L i s t ] : = Module [ { maxlen = Max [ Length / @Sets ] , l e a d e r s , u n d e r t h e l e a d e r s , remained } , 1947 I f [ S e t s === { } , Return [ { } ] ] ; 1948 l e a d e r s = Union [ S e l e c t [ Sets , Length [ # ] == maxlen & ] ] ; 1949 u n d e r t h e l e a d e r s = S e l e c t [ Sets , Function [ x , Union [ x , # ] === # ] ] & / @ l e a d e r s ;

112

Κ S

1950 1951 1952 1953 1954 1955 1956 1957 1958

1959 1960 1961 1962 1963 1964 1965 1966 1967 1968

1969 1970 1971 1972 1973 1974 1975 1976 1977

remained = Complement [ Sets , F l a t t e n [ u n d e r t h e l e a d e r s , 1 ] ] ; I f [ remained = ! = { } , Union [ l e a d e r s , MaximalSet [ remained ] ] , l e a d e r s ] ]

(* 2/10/2004 *) OffSet = {0 ,0} OneParameterAlgebra [ { op_Function , eqs : { _ _ _ E q u a l } } ] : = Module [ { Consts = Cases [ op , Const [ _ I n t e g e r ] , I n f i n i t y ] / / Union , F r e e s = Complement [ Cases [ op , FreeFunc [ _ I n t e g e r ] , I n f i n i t y , Heads −> True ] / / Union , Cases [ op , HoldPattern [D[ S l o t [ _ I n t e g e r ] , s _ ] ] : > s , I n f i n i t y ] / / Union ] , len , r u l e s , secondary } , I f [ ( l e n = Length [ Consts ] ) >0 , Consts = { Consts , Array [ I f [ # == 1 , # , 0] &, l e n ] } , Consts = { } ]; l e n = Length [ F r e e s ] ; I f [ Consts === F r e e s === { } , Return [ { op , eqs } ] ] ; I f [ Consts === { } , r u l e s = Table [ Rule@@@Thread [ { DeleteCases [ Frees , F r e e s [ [ i ] ] ] , Array [ ( 0 & ) &, len − 1 ] } ] , { i , 1 , l e n } ]; Return [ I f [ MatchQ [ # , { _Function , { } } ] , F i r s t [ # ] , # ] & / @Union [ { Check [ S i m p l i f y O p e r a t o r [ op / . # , RemoveFactor −>True ] , op , Power : : i n f y , I n f i n i t y : : i n d e t ] , DeleteCases [ eqs / . # , True ] } & / @rules , SameTest −>( I f [ Count [ { # 1 [ [ 1 ] ] } , FreeFunc [ _ _ I n t e g e r ] , I n f i n i t y , Heads−>True ] ∗ Count [ { # 2 [ [ 1 ] ] } , FreeFunc [ _ _ I n t e g e r ] , I n f i n i t y , Heads−>True ] == 0 , SameQ [ # 1 , # 2 ] , Function [ $x$ , I f [ Length [ $x$ ] ! = 2 , False , SameQ@@ ( { # 1 , # 2 } / . Rule@@$x$ ) ] ] @Union [ Cases [ { # 1 , # 2 } , FreeFunc [ _ _ I n t e g e r ] , I n f i n i t y , Heads−>True ] ] ] & ) ] ] , secondary =Rule@@@Thread [ { Frees , Array [ Function [ 0 ] & , l e n ] } ] ; r u l e s = Table [ J o i n [ Rule@@@Thread [ MapAt [ RotateRight [ # , i − 1]&, Consts , 2 ] ] , secondary ] , { i , 1 , Length [ Consts [ [ 1 ] ] ] } ] ]; I f [ Frees =!= { } , secondary =Rule@@@Thread [ { Consts [ [ 1 ] ] , Array [0& , Length [ Consts [ [ 1 ] ] ] ] } ] ; r u l e s = J o i n [ r u l e s , Table [ J o i n [ secondary , Rule@@@Thread [ { DeleteCases [ Frees , F r e e s [ [ i ] ] ] , Array [ ( 0 & ) &, len − 1 ] } ] ] , { i , 1 , l e n } ] ] ]; I f [ MatchQ [ # , { _Function , { } } ] , F i r s t [ # ] , # ] & / @Union [ { Check [ S i m p l i f y O p e r a t o r [ op / . # , RemoveFactor −>True ] , op , Power : : i n f y , I n f i n i t y : : i n d e t ] , DeleteCases [ Check [ eqs / . # , eqs , Power : : i n f y , I n f i n i t y : : i n d e t ] , True ] } & / @rules , SameTest −>( I f [ Count [ { # 1 [ [ 1 ] ] } , FreeFunc [ _ _ I n t e g e r ] , I n f i n i t y , Heads−>True ] ∗ Count [ { # 2 [ [ 1 ] ] } , FreeFunc [ _ _ I n t e g e r ] , I n f i n i t y , Heads−>True ] == 0 , SameQ [ # 1 , # 2 ] , Function [ $x$ , I f [ Length [ $x$ ] ! = 2 , False , SameQ@@ ( { # 1 , # 2 } / . Rule@@$x$ ) ] ] @Union [ Cases [ { # 1 , # 2 } , FreeFunc [ _ _ I n t e g e r ] , I n f i n i t y , Heads−>True ] ] ] & ) ] ]

1978 1979 1980 OneParameterAlgebra [ a l g e b r a s _ L i s t ] / ; MatchQ [ a l g e b r a s , { { { _Function , { _ _ _ E q u a l } } , _ } . . } ] : = MapAt [ OneParameterAlgebra , # , 1 ] & / @ a l g e b r a s 1981 1982 OneParameterAlgebra [ a l g e b r a _ F u n c t i o n ] : = OneParameterAlgebra [ { a l g e b r a , { } } ] 1983 1984 (* 12/10/2006 *) 1985 1986 Optimal [ MainIndex_List , C a s e s I n d e x _ L i s t ] [ C u r r e n t C a s e _ L i s t ] : = Module [ { z e r o i n d e x = CurrentCase [ [ 5 ] ] , maineq = S e l e c t [ CurrentCase [ [ 3 ] ] , Count [ # , Global ‘ \ [ C u r l y E p s i l o n ] , \ [ I n f i n i t y ] ] > 0 &] , auxeq = { } , l o c a l i n d e x = { } , newcases = CasesIndex , pos , temp = { } , ineq = { } } , 1987 I f [ MainIndex === { } , Return [ { MainIndex , Union [ Global ‘ \ [ Kappa ] / @zeroindex ] , CurrentCase [ [ 4 ] ] } ] ] ; 1988 I f [ ! MemberQ [ MainIndex , CurrentCase [ [ 2 ] ] ] , Return [ { } ] ] ; 1989 auxeq = Complement [ CurrentCase [ [ 3 ] ] , maineq ] ; 1990 I f [ Length [ maineq ] > 1 , 1991 maineq = F i r s t [ maineq ] 1992 ]; 1993 i neq = DeleteCases [ { Reduce [ J o i n [ maineq , auxeq ] , Reals ] / . { _Equal −>True , _Unequal −>True } } , True ] ; 1994 maineq = S o l v e [ maineq , Global ‘ \ [ C u r l y E p s i l o n ] ] [ [ 1 ] ] ; 1995 auxeq = S o l v e [ auxeq ] [ [ 1 ] ] ; 1996 l o c a l i n d e x = MainIndex / . maineq / . auxeq ; 1997 (* -------------------------------------------------------------------------------------------------------*) 1998 I f [ CurrentCase [ [ 1 ] ] == 0 , 1999 newcases = S e l e c t [ newcases / . { s_Unequal : > ( s / . auxeq ) } , Count [ # , False , I n f i n i t y ] == 0 &]; 2000 pos = S o r t [ F l a t t e n [ P o s i t i o n [ # , 0 ] ] & / @ l o c a l i n d e x , Length [ # 1 ] > Length [ # 2 ] & ] [ [ 1 ] ] ; 2001 pos = Complement [ pos , z e r o i n d e x ] ; 2002 newcases = DeleteCases [ S e l e c t [ newcases , ! MemberQ [ pos , # [ [ 1 ] ] ] &] / . auxeq , True , I n f i n i t y ]; 2003 newcases = S e l e c t [ newcases , # [ [ 3 ] ] = ! = { } & ] ; 2004 z e r o i n d e x = J o i n [ zer oin de x , pos ] ; 2005 (* -------------------------------------------------------------------------------------------------------*) 2006 I f [ Min [ Count [ # , 0] & / @ l o c a l i n d e x ] ! = Length [ z e r o i n d e x ] , 2007 pos = S e l e c t [ zer oi nde x , ! SameQ [ Sequence@@localindex [ [ All , # ] ] , 0 ] & ] ; 2008 I f [ Length [ pos ] > 1 , I f [ Count [ S o l v e [#==0&/@# , Global ‘ \ [ C u r l y E p s i l o n ] ] & / @ l o c a l i n d e x [ [ All , pos ] ] , { } , I n f i n i t y ] >0 , Return [ { } ] ] ] ; 2009 temp = S e l e c t [ l o c a l i n d e x , Count [ # [ [ pos ] ] , Global ‘ \ [ C u r l y E p s i l o n ] , I n f i n i t y ] > 0 & ] ; 2010 I f [ Count [ Drop [ # , pos ]&/ @temp , Global ‘ \ [ C u r l y E p s i l o n ] , I n f i n i t y ] >0 && ! Or@@ ( Count [ # 1 , Global ‘ \ [ C u r l y E p s i l o n ] , I n f i n i t y ] > Count [ # 1 / . # 2 , Global ‘ \ [ C u r l y E p s i l o n ] , I n f i n i t y ]&@@@MapThread [ { # , SolveAlways [#==0&/@#2 , Global ‘ \ [ C u r l y E p s i l o n ] ] / / F l a t t e n } & , { Drop [ # , pos ]&/ @temp , temp [ [ All , pos ] ] } ] ) , 2011 Return [ { } ] 2012 ]; 2013 newcases = S e l e c t [ newcases , ! MemberQ [ temp , # [ [ 2 ] ] ] & ] ;

113

2014 2015 2016 2017 2018 2019 2020 2021 2022

2023 2024 2025 2026

2027 2028 2029

2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040

2041 2042 2043 2044 2045

2046 2047 2048 2049 2050 2051 2052 2053 2054

2055 2056 2057 2058 2059

2060 2061

l o c a l i n d e x = Complement [ l o c a l i n d e x , temp ] ; (* temp= Flatten[Select[Union[Flatten[List@@@Cases[Reduce[#==0]&/@Union[Flatten[temp [[All,pos]]]],_Or]]],Count[{#},e,\[Infinity ]]==0&]/.{Equal ->Unequal ,And->List}]; *) ]; temp = { } ; newcases = S e l e c t [ newcases , MemberQ [ l o c a l i n d e x , # [ [ 2 ] ] ] & ] ; newcases = S e l e c t [ newcases , S i m p l i f y [ And @@ Union [ CurrentCase [ [ 4 ] ] , temp , # [ [ 3 ] ] ] ] = ! = F a l s e && And @@ ( Union [ CurrentCase [ [ 4 ] ] , temp ] / . Global ‘ \ [ Kappa ] [ # [ [ 1 ] ] ] −> 0) = ! = F a l s e & ] ; (* -------------------------------------------------------------------------------------------------------*) I f [ newcases === { } , Return [ { l o c a l i n d e x / / Union , Union [ Global ‘ \ [ Kappa ] / @ z e r o i n d e x ] , S i m p l i f y [ Union [ CurrentCase [ [ 4 ] ] , temp , ineq ] / . ( Global ‘ \ [ Kappa][#] − >0&/ @zeroindex ) ] } ] , Return [ Optimal [ S e l e c t [ l o c a l i n d e x , Count [ # , Global ‘ \ [ C u r l y E p s i l o n ] , I n f i n i t y ] > 0 & ] / / Union , Complement [ newcases , { # } ] ] [ { # [ [ 1 ] ] , # [ [ 2 ] ] , # [ [ 3 ] ] , S i m p l i f y [ Union [ # [ [ 4 ] ] , CurrentCase [ [ 4 ] ] , temp , i neq ] / . ( Global ‘ \ [ Kappa][#] − >0&/ @zeroindex ) ] , z e r o i n d e x } ] & / @newcases ] ] ]; (* -------------------------------------------------------------------------------------------------------*) z e r o i n d e x = Append [ zer oin de x , CurrentCase [ [ 1 ] ] ] ; l o c a l i n d e x = Complement [ MainIndex , CurrentCase [ [ { 2 } ] ] ] ; newcases = S e l e c t [ newcases , # [ [ 1 ] ] ! = CurrentCase [ [ 1 ] ] & ] ; newcases = S e l e c t [ newcases , S i m p l i f y [ And@@ ( # [ [ 4 ] ] / . ( Global ‘ \ [ Kappa ] [ # ] −> 0&/ @zeroindex ) ) ] = ! = False &]; (* newcases=Pick[newcases ,If[Count[#,False ,\[Infinity]]>0 ,False ,True]&/@(newcases/.{ s_Unequal:>Simplify[s&&(And@@(k[#]==0&/ @zeroindex))],s_Equal:>Simplify[s&&(And@@CurrentCase [[4]])]})]; *) l o c a l i n d e x = l o c a l i n d e x / . ( Global ‘ \ [ Kappa ] [ # ] −> 0&/ @zeroindex ) ; newcases = DeleteCases [ newcases / . ( Global ‘ \ [ Kappa ] [ # ] −> 0&/ @zeroindex ) , True , I n f i n i t y ] ; newcases = S e l e c t [ newcases , # [ [ 3 ] ] = ! = { } & ] ; (* -------------------------------------------------------------------------------------------------------*) I f [ Min [ Count [ # , 0]&/ @ l o c a l i n d e x ] ! = Length [ z e r o i n d e x ] , pos = S e l e c t [ zer oi nde x , ! SameQ [ Sequence@@localindex [ [ All , # ] ] , 0]& ] ; I f [ Length [ pos ] > 1 , P r i n t [ " Leak d e t e c t e d ! " ] ] ; temp = S e l e c t [ l o c a l i n d e x , Count [ # [ [ pos ] ] , Global ‘ \ [ C u r l y E p s i l o n ] , I n f i n i t y ] > 0 & ] ; I f [ Count [ Drop [ # , pos ]&/ @temp , Global ‘ \ [ C u r l y E p s i l o n ] , I n f i n i t y ] >0 && ! Or@@ ( Count [ # 1 , Global ‘ \ [ C u r l y E p s i l o n ] , I n f i n i t y ] > Count [ # 1 / . # 2 , Global ‘ \ [ C u r l y E p s i l o n ] , I n f i n i t y ]&@@@MapThread [ { # , SolveAlways [#==0&/@#2 , Global ‘ \ [ C u r l y E p s i l o n ] ] / / F l a t t e n } & , { Drop [ # , pos ]&/ @temp , temp [ [ All , pos ] ] } ] ) , Return [ { } ] ]; newcases = S e l e c t [ newcases , ! MemberQ [ temp , # [ [ 2 ] ] ] & ] ; l o c a l i n d e x = Complement [ l o c a l i n d e x , temp ] ; (* temp= Flatten[Select[Union[Flatten[List@@@Cases[Reduce[#==0]&/@Union[Flatten[temp [[All,pos]]]],_Or]]],Count[{#},e,\[Infinity ]]==0&]/.{Equal ->Unequal ,And->List}]; *) ]; (* -------------------------------------------------------------------------------------------------------*) temp = { } ; newcases = S e l e c t [ newcases , MemberQ [ l o c a l i n d e x , # [ [ 2 ] ] ] & ] ; newcases = S e l e c t [ newcases , S i m p l i f y [ And@@Union [ CurrentCase [ [ 4 ] ] , temp , # [ [ 3 ] ] ] ] = ! = F a l s e && And@@ ( Union [ CurrentCase [ [ 4 ] ] , temp ] / . Global ‘ \ [ Kappa ] [ # [ [ 1 ] ] ] −> 0) = ! = F a l s e & ] ; I f [ newcases === { } , Return [ { S e l e c t [ Complement [ l o c a l i n d e x , { CurrentCase [ [ 2 ] ] / . ( Global ‘ \ [ Kappa ] [ # ] −> 0&/ @zeroindex ) } ] , Count [ # , Global ‘ \ [ C u r l y E p s i l o n ] , I n f i n i t y ] > 0 & ] / / Union , Union [ Global ‘ \ [ Kappa ] / @zeroindex ] , S i m p l i f y [ Union [ CurrentCase [ [ 4 ] ] , temp , ine q ] / . ( Global ‘ \ [ Kappa][#] − >0&/ @zeroindex ) ] } ] , Optimal [ S e l e c t [ Complement [ l o c a l i n d e x , { CurrentCase [ [ 2 ] ] / . ( Global ‘ \ [ Kappa ] [ # ] −> 0&/ @zeroindex ) } ] , Count [ # , Global ‘ \ [ C u r l y E p s i l o n ] , \ [ I n f i n i t y ] ] > 0 & ] / / Union , Complement [ newcases , { # } ] ] [ { # [ [ 1 ] ] , # [ [ 2 ] ] , # [ [ 3 ] ] , S i m p l i f y [ Union [ # [ [ 4 ] ] , CurrentCase [ [ 4 ] ] , temp , in eq ] / . ( Global ‘ \ [ Kappa ][#] − >0&/ @zeroindex ) ] , z e r o i n d e x } ] & / @newcases ] ]

2062 2063 2064 2065 (* 11/07/2008 *) 2066 2067 OrphanSplit [ eq_Equal , o v _ L i s t , i v s _ L i s t , d e p t h _ : − 1] : = Module [ { c h i l d r e n = { } , recon , remain = TrigExpand [ Si m pl if yE q [ eq , i v s ] [ [ 1 ] ] ] , temp , s u b s e t s = { } } , 2068 recon = ExpandAll [ remain ] ; 2069 recon = I f [ Head [#]=== Plus , List@@ # , { # } ] & [ recon ] ; 2070 c h i l d r e n = S e l e c t [ recon , Count [ { # } , Alternatives@@ov , I n f i n i t y ] == 0&]; 2071 I f [ children =!= { } , 2072 recon = Complement [ recon , c h i l d r e n ] ; 2073 c h i l d r e n = Plus@@children ; 2074 remain = Plus@@recon 2075 ]; 2076 I f [ depth == 0 , Return [#==0&/@{ c h i l d r e n , remain } ] ] ; 2077 recon = I f [ Head [ # ] === Times , List@@ # , # ] & /@ recon ;

114

Κ S

2078 2079 2080

recon = S e l e c t [ F l a t t e n [ recon ] / / Union , Count [ { # } , Alternatives@@ov , I n f i n i t y ] > 0&]; temp = Complement [ S e l e c t [ Cases [ recon , _Symbol | _Symbol [ _ _ I n t e g e r ] , I n f i n i t y ] / / Union , ( ! NumericQ [ # ] ) &&(Head[#]=== Symbol | | Context [ Evaluate [ Head [ # ] ] ] = ! = " System ‘ " ) &] , i v s ] ; (* E’uresh param’etrwn *) I f [ Length [ temp ] >0 && Length [ recon ] > 1 , Message [ OrphanSplit : : ExtraParam , eq , temp ] ; I f [ c h i l d r e n === { } , s u b s e t s = recon , s u b s e t s = J o i n [ recon , { 1 } ] ]; I f [ $VersionNumber < 5 . 1 , s u b s e t s = S e l e c t [ DiscreteMath ‘ Combinatorica ‘ S u b s e t s [ s u b s e t s ] , Length [ # ] > 1 & ] , s u b s e t s = S e l e c t [ S u b s e t s [ s u b s e t s ] , Length [ # ] > 1 & ] ]; s u b s e t s = F l a t t e n [ S e l e c t [ Function [ x , S o l v e [ $ S i m p l i f i c a t i o n F u n c t i o n [ Equal@@x ] , # ] ] / @subsets ,#=!={}&& Count [ { # } , A l t e r n a t i v e s @ @ i v s , I n f i n i t y ]==0&]]&/ @temp ; s u b s e t s = DeleteCases [ s u b s e t s , { } ] ; I f [ subsets =!= { } , s u b s e t s = Union [ s u b s e t s [ [ 1 ] ] ] ]; s u b s e t s = Times@@ ( # [ [ 1 ] ] − # [ [ 2 ] ] & / @subsets ) ];

2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122

2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161

I f [ depth >= 0 && Length [ recon ] ! = depth , Return [#==0&/ @DeleteCases [ { c h i l d r e n , remain } , { } ] ] ] ; remain = { remain } ; temp = # −> Unique [ ] & / @recon ; recon = temp [ [ All , 2 ] ] ; remain = remain / . temp ; Do [ remain = C o e f f i c i e n t L i s t [ remain , recon [ [ i ] ] ] / / F l a t t e n / / Union , { i , 1 , Length [ recon ] } ] ; children =

Union [ RemoveIdentity [ S im pl if yE q [ # , i v s ]& / @ (#==0&/ @ F l a t t e n [ { c h i l d r e n , remain } ] ) ] ] ;

I f [ Count [ c h i l d r e n , F a l s e ] >0 , Return [ { F a l s e } ] ] ; I f [ s u b s e t s = = = { } , c h i l d r e n , s u b s e t s ( # 1 [ [ 1 ] ] − # 1 [ [ 2 ] ] ) ==0&/ @ c h i l d r e n ] ] OrphanSplit [ eq_Equal , o v _ L i s t ] : = OrphanSplit [ eq , ov , ov ]

(* 25/04/2007 *) P a r t i a l [ x _ _ ] : = D[ # 1 , x]&

(* Partial[x_List ,const_List] := Dt[#1,x,Constants -> const]& Total Derivative approach for the action of the infinitesimal generator , at the end /.HoldPattern[Dt[__]]->0 to clear any remaining constant away *) (* 15/02/2005 *) ReAlignEq [ eq_Equal ] : = I f [ eq [ [ 2 ] ] = = = 0 , eq , eq [ [ 1 ] ] − eq [ [ 2 ] ] = = 0 ] S e t A t t r i b u t e s [ ReAlignEq , L i s t a b l e ]

(* 21/04/2004 *) RemoveAlias [ ] : = Module [ { tmp = A l i a s T a b l e } , A l i a s I n d e x = A l i a s T a b l e = { } ; Return [ tmp ] ] (* Resets the AliasIndex & AliasTable *) RemoveAlias [ v a r _ ] : = Module [ { } , Which [ Count [ AliasIndex , var ] == 1 , A l i a s I n d e x = DeleteCases [ AliasIndex , var ] ; A l i a s T a b l e = S e l e c t [ A l i a s T a b l e , # [ [ 1 ] ] = ! = var & ] ; Return [ var ] , Count [ AliasIndex , var ] > 1 , Abort [ ] ]; ] S e t A t t r i b u t e s [ RemoveAlias , L i s t a b l e ]

(* 02/05/2005 *) RemoveDiscreteFunction [ f u n _ ?AtomQ] : = Module [ { } , I f [ MemberQ [ $ D i s c r e t e F u n c t i o n s I n d e x , fun ] , $ D i s c r e t e F u n c t i o n s I n d e x = DeleteCases [ $ D i s c r e t e F u n c t i o n s I n d e x , fun ] ; Clear [ fun ] ; fun , Message [ RemoveDiscreteFunction : : nonexst , fun ] ; {} ] ] RemoveDiscreteFunction [ f u n _ [ _ _ ] | f u n _ [ _ _ I n t e g e r ] ] : = RemoveDiscreteFunction [ fun ] S e t A t t r i b u t e s [ RemoveDiscreteFunction , L i s t a b l e ]

115

2162 2163 2164 2165 2166 2167 2168 2169

2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198

2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212

(* 22/03/2006 *) RemoveIdentity [ e q _ L i s t ] : = S e l e c t [ eq , # = ! =

True&]

(* 19/04/2004 *) S h e r l o c k [ e q _ L i s t , F u l l A n a l y s i s _ L i s t ] : = Module [ { candies , index , l e n =Length [ eq ] , temp , s u b s t i t u t i o n s } , index = Table [ { eq [ [ i ] ] , { # [ [ 1 ] ] , Union [ Cases [ eq [ [ i ] ] , ( A l t e r n a t i v e s @@ D e r i v a t i v e @@@ Rest [ # ] ) [ # [ [ 1 ] ] ] , I n f i n i t y , Heads −> True ] ] / . D e r i v a t i v e [ i d x _ _ I n t e g e r ] [ _ ] : > { i d x } } & / @ F u l l A n a l y s i s } , { i , 1 , Length [ eq ] } ] ; index = DeleteCases [ index , { _ , { } } , I n f i n i t y ] ; index = MapAt [ F l a t t e n [ # , 1 ] & /@#& ,# ,2]&/ @index ; Do [ Do [ c a n d i e s = Rest [ index [ [ i , 2 , j ] ] ] ; I f [ Length [ c a n d i e s [ [ 1 ] ] ] = = 1 , c a n d i e s = { S o r t [ c a n d i e s ] / / Last } , c a n d i e s = S o r t [ S e l e c t [ candies , Function [ x , And@@ ( I f [ Equal [ 0 , Sequence @@ # ] , True , Or @@ Negative [ # ] ] & [ # − x ]&/ @candies ) ] ] , Plus@@#1 < Plus@@#2&] ]; index [ [ i , 2 , j ] ] = J o i n [ { index [ [ i , 2 , j , 1 ] ] } , c a n d i e s ] , { j , 1 , Length [ index [ [ i , 2 ] ] ] } ] , { i , 1 , len } ] ; index = F l a t t e n [ MapAt [ Function [ $x , Function [ $y , Union [ Cases [ # [ [ 1 ] ] , ( A l t e r n a t i v e s @ @ ( Derivative@@ #&/ @Rest [ $y ] ) ) [ $y [ [ 1 ] ] ] [ _ _ ] , I n f i n i t y ] ] ] / @$x ] , # , 2 ] ] & / @index ; index = DeleteCases [ Function [ $x , DeleteCases [ S o l v e [ $x [ [ 1 ] ] , # ] & / @Rest [ $x ] , { } | _ S o l v e | { _ , _ _ } , I n f i n i t y ] / / F l a t t e n ] / @index , { } ] ; I f [ l e n ==1 , Return [ S o r t [ F l a t t e n [ index ] , ( # 1 [ [ 1 ] ] < # 2 [ [ 1 ] ] ) / . D e r i v a t i v e [ i d x _ _ I n t e g e r ] [ _ ] [ _ _ ] : > Plus [ i d x ]&]] ]; index = MapIndexed [ L i s t [ S o r t [ # 1 , ( # 1 [ [ 1 ] ] < # 2 [ [ 1 ] ] ) / . D e r i v a t i v e [ i d x _ _ I n t e g e r ] [ _ ] [ _ _ ] : > Plus [ i d x ] &] , #2 ]& , index ] ; c a n d i e s = Array [ { } & , l e n ] ; (* Zero Step *) temp = S e l e c t [ index , Length [ # [ [ 1 ] ] ] = = 1 & ] ; index = DeleteCases [ index , Alternatives@@temp ] ; I f [ Length [ temp ] > 0 , ( c a n d i e s = R e p l a c e P a r t [ candies , # 1 [ [ 1 , 1 ] ] , # 2 ] & @@# ) &/@temp ] ; s u b s t i t u t i o n s = MakeRule[# − >0]&/ @DeleteCases [ candies , { } ] ; index = MapAt [ S e l e c t [ # , ( # [ [ 1 ] ] / / . s u b s t i t u t i o n s ) =!=0&]& ,# ,1]&/ @index ; c a n d i e s = S e l e c t [ F i x e d P o i n t [ F l a t t e n [ C o m p a t i b i l i t y L i s t @ @ #&/@# , 1 ] & , { { candies , index } } ] [ [ All , 1 ] ] , Count [# ,{}]==0&]; c a n d i e s = F l a t t e n [ Solve@@@Thread [ { eq , # } ] ] & / @candies ; c a n d i e s = S o r t [ S e l e c t [ candies , And@@ ( Function [ x , temp = Fold [ # 1 / / . # 2 & , x [ [ 2 ] ] , MakeRule [ DeleteCases [ # , x ] ] ] ; Count [ $ S i m p l i f i c a t i o n F u n c t i o n [ { temp } ] , MakeRule [ x [ [ 1 ] ] − > 0 ] [ [ 1 ] ] , I n f i n i t y ] = = 0 ] /@# ) &] , Plus@@Flatten [ List@@@ # 1 [ [ All , 1 , 0 , 0 ] ] ] < Plus@@Flatten [ List@@@ # 2 [ [ All , 1 , 0 , 0 ] ] ] & ] ] S h e r l o c k [ eq_ , F u l l A n a l y s i s _ L i s t ] : = S h e r l o c k [ { eq } , F u l l A n a l y s i s ]

(* 02/05/2006 *) SetToLeadingOrder [ eq_Equal ] : = Equal @@@ F l a t t e n [ S o l v e [ eq , LeadingOrder [ eq ] ] ] S e t A t t r i b u t e s [ SetToLeadingOrder , L i s t a b l e ]

(* 13/05/2004 *)

Shift [ expr_ , d i r e c t i o n s _ _ L i s t ] := Module [ { v a r s = Union [ { d i r e c t i o n s } [ [ All , 1 ] ] ] } , S h i f t [ expr , Sequence @@ ( Reap [ Sow @@@ Reverse / @ { d i r e c t i o n s } , vars , Sequence @@ L i s t [ # 1 , Plus @@ ( F l a t t e n [ # 2 ] ) ] &] / / Last ) ] / ; MatchQ [ { d i r e c t i o n s } , { { _ , _ I n t e g e r } . . } ] && Length [ v a r s ] < Length [ { directions }] 2213 ] 2214 2215 S h i f t [ e x p r _ , d i r e c t i o n s _ _ L i s t ] : = e x p r / . Rule @@@ ( { # 1 , #1 + #2} & @@@ { d i r e c t i o n s } ) 2216 2217 S h i f t [ e x p r _ , d i r e c t i o n s _ _ ] / ; VectorQ [ { d i r e c t i o n s } ] : = 2218 Module [ { } , 2219 S h i f t [ expr , Sequence @@ ( Thread [ { { d i r e c t i o n s } , Array [ 1 &, Length [ { d i r e c t i o n s } ] ] } ] ) ] 2220 ] 2221 2222 S h i f t [ e x p r _ , d i r e c t i o n s _ _ ] / ; Not [ VectorQ [ { d i r e c t i o n s } ] ] : = 2223 Module [ { v a r s = DeleteCases [ { d i r e c t i o n s } , { _ , _ I n t e g e r } ] } , 2224 S h i f t [ expr , Sequence @@ ( J o i n [ DeleteCases [ { d i r e c t i o n s } , A l t e r n a t i v e s @@ v a r s ] , { # , 1 } & / @ v a r s ] ) ] 2225 ] 2226 2227 (* 15/03/2006 *) 2228 2229 Si mp li f yE q [ eq : HoldPattern [ Equal [ Power [ _ , _ ] , 0 ] ] | HoldPattern [ Equal [ Times [ __Power ] , 0 ] ] , o p t s _ _ _ ] (*/;MatchQ[eq ,]*) : = S i mp li fy Eq [ eq / . Power [ l p _ , _ ]−> l p , o p t s ] 2230 2231 Si mp li fy E q [ eq_Equal , V a r s _ L i s t : { } , AuxFun_ : $ S i m p l i f i c a t i o n F u n c t i o n ] : = Module [ { l h s = AuxFun [ F a c t o r [ Numerator [ Together [ eq [ [ 1 ] ] − eq [ [ 2 ] ] ] ] ] ] , temp , r u l e s } , 2232 I f [ Count [ { l h s } ,DummyVar [ _ I n t e g e r ] [ _ _ ] , I n f i n i t y ] > 0 && ! I n t e g r a l Q [ l h s ] , 2233 temp = Cases [ { l h s } , ( FreeFunc [ i _ I n t e g e r ] | D e r i v a t i v e [ _ _ I n t e g e r ] [ FreeFunc [ i _ I n t e g e r ] ] ) [ v a r s _ _ ] / ; MemberQ [ { v a r s } , DummyVar[ _ I n t e g e r ] [ _ _ ] ] : > FreeFunc [ i ] [ v a r s ] , I n f i n i t y ] / / Union ; 2234 temp = { # 1 , Complement [ # 2 , # 1 ] } &@@@ ( { S e l e c t [ # , MatchQ [ # , _Symbol | _Symbol [ _ I n t e g e r ] ] & ] , # } & / @List@@@temp ) ;

116

Κ S

2235 2236 2237

temp = F l a t t e n [ Function [ { x , y } , { # , Complement [ List@@ # , x ] } & / @y ] @@@temp , 1 ] / / Union ; l h s = l h s / . DummyVar [ i _ I n t e g e r ] [ _ _ ] : > DummyVar [ i ] ; r u l e s = Union [ F l a t t e n [ Cases [ { l h s } , ( FreeFunc [ _ I n t e g e r ] | D e r i v a t i v e [ _ _ I n t e g e r ] [ FreeFunc [ _ I n t e g e r ] ] ) [ i v _ _ ] − >{ i v } , I n f i n i t y ] ] ] ; temp = DeleteCases [ { # 1 , Complement [ # 2 , r u l e s ]}&@@@temp , { _ , { } } ] ; I f [ temp === { } , Return [ Si m pl if yE q [ l h s ==0 ,Vars , AuxFun ] ] , r u l e s = #−>Unique [ $K$]&/ @Union [ Cases [ { l h s } , ( D e r i v a t i v e [ _ _ I n t e g e r ] [ FreeFunc [ _ I n t e g e r ] ] | FreeFunc [ _ I n t e g e r ] ) [ _ _ ] , I n f i n i t y ] ] ; lhs = lhs / . rules ; temp = { F i r s t [ Cases [ DummyVarList , HoldPattern [ Rule [ # , s _ ] ] : > #== s [ Sequence@@s [ [ 1 ] ] ] ]&@Head [ # 1 ] ] , Cases [ { l h s } , A l t e r n a t i v e s @ @ #2 , I n f i n i t y ] / / Union}&@@@temp ; I f [ MatchQ [ temp [ [ All , 2 ] ] , { { } . . } ] , Return [ S im pl if y Eq [ ( l h s ==0) / . ( Reverse / @ r u l e s ) , Vars , AuxFun ] ] ] ; temp = XEliminate [ l h s ==0 , temp [ [ All , 1 ] ] , temp [ [ All , 2 ] ] ] / . ( Reverse / @ r u l e s ) ; ]; l h s = AuxFun [ Numerator [ Together [ temp [ [ 1 ] ] − temp [ [ 2 ] ] ] ] ] ;

2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251

]; I f [ Count [ { l h s } ,DummyVar [ _ I n t e g e r ] , I n f i n i t y ] > 0 && Count [ { l h s } , FreeFunc [ _ I n t e g e r ] , I n f i n i t y , Heads −>True ] > 0 && Count [ F l a t t e n [ List@@@ ( Cases [ { l h s } , FreeFunc [ i _ I n t e g e r ] [ v a r s _ _ ] | D e r i v a t i v e [ _ _ I n t e g e r ] [ FreeFunc [ i _ I n t e g e r ] ] [ v a r s _ _ ] : > FreeFunc [ i ] [ v a r s ] , I n f i n i t y ] / / Union ) ] ,DummyVar [ _ I n t e g e r ] ] = = 0 , l h s = l h s / / . ( Rule [ # 1 , I f [ Head [ # 2 [ [ 1 ] ] ] === L i s t , # 2@@ # 2 [ [ 1 ] ] , # 2 [ # 2 [ [ 1 ] ] ] ] ]& @@@DummyVarList ) ]; I f [ Head [ l h s ] === Times , I f [ Vars === { } , Return [ AuxFun [ l h s ==0]] , l h s = Times@@Flatten [ Last [ Reap [ Sow@@@ ( { # , NumericQ [ # / . { HoldPattern [ I n t e g r a t e [ body_ , v a r _ _ ]] − >Unique [ I n t e g r a l ] } / . Rule@@@Thread [ { Vars , Array [ Random[ ] & , Length [ Vars ] ] } ] ] } & / @ List@@lhs ) , { True , False } ] ] / . { } − > { { } } , 1 ] [ [ 2 ] ] ] ]; I f [ Head [ l h s ] === Power , Si m pl if yE q [ l h s == 0 , Vars , AuxFun ] , l h s == 0]

2252 2253 2254 2255 2256 2257 2258

2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270

2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293

] Si mp li fy E q [ a r g 1 _ L i s t , s _ _ _ ] : = Si mp l if yE q [ # , s ]&/ @arg1 Si mp li f yE q [ a r g 1 _ , _ _ _ ] : = a r g 1

(* 09/01/2008 *) S i m p l i f y O p e r a t o r [ op_Function , o p t s _ _ _ R u l e ] : = Module [ { remfac=RemoveFactor / . { o p t s } / . Options [ S i m p l i f y O p e r a t o r ] , v a r s = Union [ F l a t t e n [ Cases [ { op } , HoldPattern [D[ S l o t [ _ I n t e g e r ] , v a r _ _ ] ] : > { var } , I n f i n i t y ] ] ] , TestFunc , r e s } , I f [ v a r s === { } , I f [ remfac , r e s = FactorTerms [ $ S i m p l i f i c a t i o n F u n c t i o n [ op [ TestFunc ] ] ] ; I f [ Head [ r e s ]=== Times , r e s = Times@@ ( S e l e c t [ List@@res , ! NumericQ [ # ] & ] ) ]; r e s = r e s == 0 , r e s = $ S i m p l i f i c a t i o n F u n c t i o n [ op [ TestFunc ]]==0 ]; I f [ r e s ===True , Return [ 0 & ] ] ; I f [ r e s === False , Return [ 1 & ] ] ; Function@@ { # [ [ 1 ] ] − # [ [ 2 ] ] & @res / . { TestFunc −>S l o t [ 1 ] } } , I f [ remfac , r e s = FactorTerms [ $ S i m p l i f i c a t i o n F u n c t i o n [ op [ TestFunc@@vars ] ] ] ; I f [ Head [ r e s ]=== Times , r e s = Times@@ ( S e l e c t [ List@@res , ! NumericQ [ # ] & ] ) ]; r e s = r e s == 0 ; I f [ r e s ===True , Return [ 0 & ] ] ; I f [ r e s === False , Return [ r e s ] ] ; r e s = r e s [ [ 1 ] ] / . HoldPattern [ D e r i v a t i v e [ i n d e x _ _ I n t e g e r ] [ TestFunc ] [ i v s _ _ ] ] : > P a r t i a l [ Sequence@@Flatten [ Table [ I f [ { index } [ [ i ] ] == 0 , { } , { i v s } [ [ i ] ] ∗ Array [ 1 & , { index } [ [ i ] ] ] ] , { i , 1 , Length [ { index } ] } ] ] ] ; r e s = r e s / @vars , r e s = $ S i m p l i f i c a t i o n F u n c t i o n [ op / @vars ] ]; I f [ v a r s === { } , r e s = r e s [ [ 1 ] ] − r e s [ [ 2 ] ] / . TestFunc@@vars −>S l o t [ 1 ] , r e s = Inner [ I f [#1===0 ,0 ,#1 ∗ #2]& , res , P a r t i a l / @vars ] ]; I f [ Head [ r e s ] = ! = Function , Function@@ { r e s } , r e s ] ] ]

2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 S i m p l i f y O p e r a t o r [ { o p _ _ F u n c t i o n } , o p t s _ _ _ R u l e ] : = S i m p l i f y O p e r a t o r [ # , o p t s ]&/@{ op } 2308 2309 S i m p l i f y O p e r a t o r [ op_ , _ _ ] = op 2310

117

2311 2312 2313 2314 2315 2316 2317 2318 2319

(* 19/05/2006 *) (* TODO Se m’ia per’iptwsh to aplopoihm’eno s’usthma perie’iqe kai ena False en’w kata touc upologismo’uc e’iqe antimetwp’isei mia aprosdi’oristh ekfrash thc morfhc 1/0: Na prosteje’i ’elegqoc gia na antimetwpisto’un t’etoiec peript’wseic me parakamyh thc "problhmatik’hc" ex’iswshc (pisteuw oti pr’okeitai gia antikat’astash se exiswsh en’oc leading term pou mhden’izei ton paranomast’h kal’o e’inai na baleic ena Print gia na deic akrib’wc ti paizei) *)

SimplifySystemOnce [ e q s _ L i s t , i v s _ L i s t , P e r c e n t _ : $Percent ] : = Module [ { index = { } , l e a d e r s = eqs [ [ 1 ] ] , newleader = { } , mainbody = eqs [ [ 2 ] ] , n e u t r a l = eqs [ [ 3 ] ] , r u l e , l e a f , tmp = { } , MeanLeaf } , 2320 temp = S e l e c t [ n e u t r a l , Head [ # ] === Equal && Count [ # , D e r i v a t i v e [ _ _ I n t e g e r ] [ _ ] [ _ _ ] , I n f i n i t y ] > 0&]; 2321 I f [ Length [ temp ] > 0 , mainbody = Union [ mainbody , temp ] ; n e u t r a l = Complement [ n e u t r a l , temp ] ] ; 2322 2323 mainbody = S o r t [ mainbody , LeafCount [ # 1 ] < LeafCount [ # 2 ] & ] ; 2324 2325 mainbody = mainbody / . s : HoldPattern [ Times [ _ _ _ , D e r i v a t i v e [ _ _ I n t e g e r ] [ _ ] [ _ _ ] , _ _ _ ] = = 0 ] : > S im p li fy Eq [ s , ivs ] ; 2326 2327 index = Cases [ mainbody , D e r i v a t i v e [ _ _ I n t e g e r ] [ _ ] [ _ _ ] = = 0 ] ; 2328 I f [ index = ! = { } , 2329 index = F i r s t [ index ] ; 2330 mainbody = DeleteCases [ mainbody , index ] ; 2331 newleader = index 2332 ]; 2333 2334 I f [ mainbody === { } | | P e r c e n t == 0 , Return [ eqs ] ] ; 2335 I f [ P e r c e n t 1 , MeanLeaf = Through [ { Mean , P e r c e n t ∗ StandardDeviation } [ LeafCount / @mainbody ] ] ] ; 2337 temp = S e l e c t [ mainbody , LeafCount [ # ] > Plus@@MeanLeaf & ] ; 2338 I f [ temp = ! = { } , 2339 mainbody = Complement [ mainbody , temp ] ; 2340 n e u t r a l = J o i n [ n e u t r a l , temp ] 2341 ] 2342 ]; 2343 2344 I f [ leaders =!= { } , 2345 temp = S e l e c t [ l e a d e r s , # [ [ 1 ] ] = ! = LeadingOrder [ # , i v s ] & ] ; 2346 I f [ temp = ! = { } , 2347 l e a d e r s = Complement [ l e a d e r s , temp ] ; 2348 mainbody = J o i n [ mainbody , temp ] 2349 ] 2350 ]; 2351 2352 temp = S e l e c t [ mainbody , Count [ # , D e r i v a t i v e [ _ _ I n t e g e r ] [ _ ] [ _ _ ] , I n f i n i t y ] == 0&]; 2353 I f [ Length [ temp ] > 0 , mainbody = Complement [ mainbody , temp ] ; n e u t r a l = J o i n [ n e u t r a l , temp ] ] ; 2354 2355 I f [ newleader === { } , 2356 Do [ I f [ MatchQ [ mainbody [ [ i ] ] , HoldPattern [ Times [ _ _ ] = = 0 ] ] , Continue [ ] ] ; 2357 temp = LeadingOrder [ mainbody [ [ i ] ] , i v s ] ; 2358 I f [ temp === { } , 2359 AppendTo [ n e u t r a l , S im pl if yE q [ mainbody [ [ i ] ] , i v s , TimeConstrained [ $ S i m p l i f i c a t i o n F u n c t i o n [ # ] , $TimeConstrained , Message [ Si mp li f yE q : : OutOfTime , $TimeConstrained ] ; # ] & ] ] ; 2360 mainbody [ [ i ] ] = True ; 2361 Continue [ ] 2362 ]; 2363 temp = S o l v e [ mainbody [ [ i ] ] , temp ] / / F l a t t e n ; 2364 mainbody [ [ i ] ] = Equal@@temp [ [ 1 ] ] ; 2365 AppendTo [ newleader , temp [ [ 1 , 1 ] ] ] 2366 , { i , 1 , Length [ mainbody ] } ] ; 2367 mainbody = mainbody / / RemoveIdentity ; 2368 newleader = Union [ newleader ] ; 2369 I f [ newleader === { } , Return [ eqs ] ] ; 2370 newleader = F i r s t [ S o r t [ newleader , SortFuncTot ] ] ; 2371 newleader = S o r t [ S e l e c t [ mainbody , # [ [ 1 ] ] === newleader &] , LeafCount [ # 1 ] < LeafCount [ # 2 ] & ] / / First ; 2372 ]; 2373 2374 r u l e = MakeRule [ Rule@@newleader ] ; 2375 Do [ l e a f = LeafCount [ l e a d e r s [ [ i ] ] ] ; 2376 I f [ Count [ { l e a d e r s [ [ i ] ] } , r u l e [ [ 1 ] ] , I n f i n i t y ] == 0 , Continue [ ] ] ; 2377 temp = l e a d e r s [ [ i ] ] / / . r u l e ; 2378 I f [ Count [ { temp } , F a l s e | I n f i n i t y | C o m p l e x I n f i n i t y | Indeterminate , I n f i n i t y ] >0 , Return [ eqs ] ] ; 2379 I f [ r u l e [ [ 2 , 1 ] ] === 0 | | Head [ ExpandAll [ r u l e [ [ 2 , 1 ] ] ] ] = ! = Plus , l e a d e r s [ [ i ] ] = temp ; Continue [ ] ] ; 2380 I f [ LeafCount [ temp ] 0 , Return [ eqs ] ] ; I f [ r u l e [ [ 2 , 1 ] ] === 0 | | Head [ ExpandAll [ r u l e [ [ 2 , 1 ] ] ] ] = ! = Plus (*|| Count[{ExpandAll[rule [[2,1]]]},_Plus ,Infinity] == 0*) , mainbody [ [ i ] ] = temp ; Continue [ ] ] ; I f [ LeafCount [ temp ] " I t a l i c " ] ] ; $Stream = GetNotebookObject [ " SolveOverdeterminedEqs " ] ] ; 2431 pos = { Cases [ SystemOfEqs , Const [ i d x _ I n t e g e r ]−>idx , I n f i n i t y , Heads−>True ] / / Union , Cases [ SystemOfEqs , FreeFunc [ i d x _ I n t e g e r ]−>idx , I n f i n i t y , Heads−>True ] / / Union } ; 2432 O f f S e t = I f [ # === { } , 0 ,Max@@#]&/ @pos ; 2433 TempOffSet = 0 ; 2434 RemoveAlias [ ] ; 2435 DummyVarList = { } ; 2436 Threads = { } ; 2437 I f [ $assumptions = ! = { } , I f [ Head [ $assumptions ] === L i s t , $AdditionalAssumptions = And@@$assumptions , $AdditionalAssumptions = $assumptions ] ] ; 2438 EqsInfo = C h a r a c t e r i z e E q [ S e l e c t [ System , Count [ # , D e r i v a t i v e , I n f i n i t y , Heads−>True ] >0&] , Verbose −> F a l s e ]; 2439 I f [ Count [ F l a t t e n [ EqsInfo [ [ 1 ] ] ] , _ [ _ _ ] ] > 0 | | Count [ SystemOfEqs , Const [ _ _ I n t e g e r ] , I n f i n i t y ] > 0 , 2440 C r e a t e A l i a s [ Cases [ F l a t t e n [ EqsInfo [ [ 1 ] ] ] , _ [ _ _ ] ] ] ; 2441 C r e a t e A l i a s [ C o n s t O f f s e t = Cases [ SystemOfEqs , Const [ _ _ I n t e g e r ] , I n f i n i t y ] ] ; 2442 I f [ C o n s t O f f s e t = ! = 0 , C o n s t O f f s e t = Max [ C o n s t O f f s e t / . Const [ i d x _ ]−> i d x ] ] ; 2443 System = System / . Reverse / @AliasTable ; 2444 EqsInfo = C h a r a c t e r i z e E q [ System , Verbose −> F a l s e ] 2445 , 2446 EqsInfo = C h a r a c t e r i z e E q [ System , Verbose −> F a l s e ] ; 2447 ]; 2448 2449 v a r i a b l e s = Union [ F l a t t e n [ EqsInfo [ [ 1 ] ] ] ] ; 2450 I f [ knownfunctions = ! = { } , 2451 knownfunctions = I f [ Count [ { # } , A l t e r n a t i v e s @ @ v a r i a b l e s , I n f i n i t y ] >0 ,Head [ # ] , # ] & / @knownfunctions ; 2452 knownfunctions = S e l e c t [ knownfunctions , Count [ SystemOfEqs , # , I n f i n i t y , Heads−>True ] >0&] 2453 ]; 2454 l e n = Length [ EqsInfo [ [ 2 ] ] ] ; 2455 r e s =CheckAbort [ F i x e d P o i n t [ SystemSolveOnce , { 1 , h , System , { } , { } , { } , { } , Union [ knownfunctions , EqsInfo [ [ 2 ] ] ] , { } , knownfunctions , v a r i a b l e s } ] , 2456 $HistoryLength = I n f i n i t y ; 2457 I f [ verbose , NotebookClose [ h ] ] ; 2458 I f [ log , NotebookWrite [ $Stream [ [ 1 ] ] , C e l l [ " Aborted by t h e user " , " Text " , FontColor −>RGBColor [ 1 , 0 , 0 ] , FontSlant −>" I t a l i c " ] ] ; $Stream [ [ 1 ] ] = NotebookPut [ NotebookGet [ $Stream [ [ 1 ] ] ] / . ( V i s i b l e −> F a l s e ) −> ( V i s i b l e −> True ) , $Stream [ [ 1 ] ] ] ; NotebookSave [ $Stream [ [ 1 ] ] ] ; NotebookClose [ $Stream [ [ 1 ] ] ] ; $Stream = 0 ] ;

119

2459 2460 2461 2462 2463 2464 2465 2466

2467 2468 2469 2470 2471

2472 2473 2474 2475 2476 2477

2478 2479 2480 2481

2482 2483 2484

2485 2486

2487 2488 2489 2490 2491

2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520

I f [ Length [ Threads ]==0 , Return [ { } ] , I f [ $VersionNumber >= 5 . 1 , l e n = GUIKit ‘ GUIRunModal [ " AbortDialog " ] ; I f [ len , s k i p p e d =OpenAppend [ $WriteFilePath " SkippedCases . nb " ] ; Write [ skipped , System / . A l i a s T a b l e ] ; " " , I f [ s k i p p e d =!= − 1 , Close [ s k i p p e d ] ] ; Abort [ ] ] , Switch [ # , 1 , I f [ s k i p p e d =!= − 1 , Close [ s k i p p e d ] ] ; Abort [ ] , _ , s k i p p e d =OpenAppend [ $WriteFilePath " SkippedCases . nb " ] ; Write [ skipped , System / . A l i a s T a b l e ] ; " " ]&@Input [ " User i n t e r r u p t i o n d e t e c t e d ! \ n I f you want t o a b o r t t h e p r o c e s s p r e s s 1 . \ n I f you want t o s k i p t h i s case and proceed t o t h e ne xt one p r e s s 2 . " ] ] ] ]; I f [ Length [ Threads ] >0 , Threads [ [ 1 ] ] = I f [ r e s === { } | | r e s === " " , I f [ verbose , NotebookClose [ h ] ] ; I f [ l o g && $Stream = ! = 0 , $Stream [ [ 1 ] ] = NotebookPut [ NotebookGet [ $Stream [ [ 1 ] ] ] / . ( V i s i b l e −> F a l s e ) −> ( V i s i b l e −> True ) , $Stream [ [ 1 ] ] ] ; NotebookSave [ $Stream [ [ 1 ] ] ] ; NotebookClose [ $Stream [ [ 1 ] ] ] ; I f [ r e s = = = { } , D e l e t e F i l e [ $Stream [ [ 2 ] ] ] ] ; $Stream = 0 ] ; False , Threads [ [ 1 , 2 ] ] ] ]; r e s ={ r e s } ; While [ Count [ Threads = DeleteCases [ Threads , { "+" , False , _ _ } ] , { "+" , _ _ } ] >0 , pos = P o s i t i o n [ Threads , { "+" , _ _ } ] [ [ 1 , 1 ] ] ; I f [ verbose , h=GetNotebookHandle [ " SolveOverdeterminedEqs " ] ] ; I f [ log , I f [ $Stream = ! = 0 , $Stream [ [ 1 ] ] = NotebookPut [ NotebookGet [ $Stream [ [ 1 ] ] ] / . ( V i s i b l e −> F a l s e ) −> ( V i s i b l e −> True ) , $Stream [ [ 1 ] ] ] ; NotebookSave [ $Stream [ [ 1 ] ] ] ; NotebookClose [ $Stream [ [ 1 ] ] ] , $Stream = GetNotebookObject [ " SolveOverdeterminedEqs " ] ; NotebookWrite [ $Stream [ [ 1 ] ] , C e l l [ " The System I n i t i a l l y " , " S e c t i o n " , FontSlant −>" I t a l i c " ] ] ; NotebookWrite [ $Stream [ [ 1 ] ] , C e l l [ T o S t r i n g [ Reverse [ { Most [ Rest [ # ] ] / / F l a t t e n , Last [ # ] , F i r s t [ # ] } & @Take [ Drop [ Rest [ # ] , { 2 , 3 } ] , 6 ] ] & @Threads [ [ pos ] ] / . A l i a s T a b l e , InputForm ] , " Input " ] ] ] ] ; r e s =Append [ res , CheckAbort [ F i x e d P o i n t [ SystemSolveOnce , J o i n [ { 1 , h } , Drop [ Threads [ [ pos ] ] , 4 ] ] ] , $HistoryLength = I n f i n i t y ; I f [ verbose , NotebookClose [ h ] ] ; I f [ log , NotebookWrite [ $Stream [ [ 1 ] ] , C e l l [ " Aborted by t h e user " , " Text " , FontColor −>RGBColor [ 1 , 0 , 0 ] , FontSlant −>" I t a l i c " ] ] ; $Stream [ [ 1 ] ] = NotebookPut [ NotebookGet [ $Stream [ [ 1 ] ] ] / . ( V i s i b l e −> F a l s e ) −> ( V i s i b l e −> True ) , $Stream [ [ 1 ] ] ] ; NotebookSave [ $Stream [ [ 1 ] ] ] ; NotebookClose [ $Stream [ [ 1 ] ] ] ; $Stream = 0 ] ; I f [ $VersionNumber >= 5 . 1 , l e n = GUIKit ‘ GUIRunModal [ " AbortDialog " ] ; I f [ len , I f [ s k i p p e d === − 1, s k i p p e d =OpenAppend [ $WriteFilePath " SkippedCases . nb " ] ] ; Write [ skipped , Reverse [ { Most [ Rest [ # ] ] / / F l a t t e n , Last [ # ] , F i r s t [ # ] } & @Take [ Drop [ Rest [ # ] , { 2 , 3 } ] , 6 ] ] & @Threads [ [ pos ] ] / . A l i a s T a b l e ] ; " " , I f [ s k i p p e d =!= − 1 , Close [ s k i p p e d ] ] ; Abort [ ] ] , Switch [ # , 1 , I f [ s k i p p e d =!= − 1 , Close [ s k i p p e d ] ] ; Abort [ ] , _ , I f [ s k i p p e d === − 1, s k i p p e d =OpenAppend [ $WriteFilePath " SkippedCases . nb " ] ] ; Write [ skipped , Reverse [ { Most [ Rest [ # ] ] / / F l a t t e n , Last [ # ] , F i r s t [ # ] } & @Take [ Drop [ Rest [ # ] , { 2 , 3 } ] , 6 ] ] & @Threads [ [ pos ] ] / . A l i a s T a b l e ] ; " " ]&@Input [ " User i n t e r r u p t i o n d e t e c t e d ! \ n I f you want t o a b o r t t h e p r o c e s s p r e s s 1 . \ n I f you want t o s k i p t h i s case and proceed t o t h e ne xt one p r e s s 2 . " ] ] ] ]; I f [ Last [ r e s ] === { } | | Last [ r e s ] === " " , NotebookClose [ h ] ; I f [ l o g && $Stream = ! = 0 , $Stream [ [ 1 ] ] = NotebookPut [ NotebookGet [ $Stream [ [ 1 ] ] ] / . ( V i s i b l e −> F a l s e ) −> ( V i s i b l e −> True ) , $Stream [ [ 1 ] ] ] ; NotebookSave [ $Stream [ [ 1 ] ] ] ; NotebookClose [ $Stream [ [ 1 ] ] ] ; I f [ r e s = = = { } , D e l e t e F i l e [ $Stream [ [ 2 ] ] ] ] ; $Stream = 0 ] ; Threads [ [ pos ] ] = F a l s e , Threads [ [ pos ] ] = Threads [ [ pos , 2 ] ] ; ] ]; I f [ Length [ Threads ] >0 , I f [ # = = = { } , Return [ { } ] , { Threads , r e s } = #]&@MapThread [ L i s t , DeleteCases [ Thread [ { Threads , r e s } ] , { False , _ } ] ] ] ; I f [ ! ( MemberQ [ F l a t t e n [ r e s ] , F a l s e ] | | r e s === { { } } ) , I f [ Length [ r e s ]== 1 && Threads === { } , r e s = F l a t t e n [ res , 1 ] ; r e s =Drop [ res , 2 ] ; (*{DEQs , AlgEQs , UnresolvedEQs , Reserve , set, Uknowns , UnresolvedUknowns , KnownFunctions , ivs}*) r e s ={MapAt [ Function@@$SimplificationFunction [ List@@ # / . DummyVarList]& , # , { 2 } ] & / @ S e l e c t [ r e s [ [ 5 ] ] , Count [ { # [ [ 1 ] ] } , A l t e r n a t i v e s @ @ E q s I n f o [ [ 2 ] ] ] > 0 & ] , J o i n [ r e s [ [ 1 ] ] , r e s [ [ 2 ] ] , r e s [ [ 3 ] ] , r e s [ [ 4 ] ] ] } ; r e s = ( r e s / . CleanUpConstants [ r e s ] ) / . A l i a s T a b l e ; DummyVarList = DummyVarList / . A l i a s T a b l e ; RemoveAlias [ ] ; (* Removing integral equations already existing as differential *) r e s [ [ 2 ] ] = Union [ DeleteCases [ S im pl if yE q [ r e s [ [ 2 ] ] , EqsInfo [ [ 1 ] ] / / F l a t t e n / / Union , I d e n t i t y ] , True ] , SameTest −>( $ S i m p l i f i c a t i o n F u n c t i o n [ # 1 [ [ 1 ] ] / # 2 [ [ 1 ] ] ] = = = − 1 | | #1 === #2&) ] ; I f [ Or@@ ( I n t e g r a l Q / @res [ [ 2 ] ] ) , inteqs = Select [ res [ [ 2 ] ] , IntegralQ ] ; r e s [ [ 2 ] ] = Complement [ r e s [ [ 2 ] ] , I n t e g r a l T o D i f f e r e n t i a l E q [ # , Union [ F l a t t e n [ EqsInfo [ [ 1 ] ] ] ] ] & / @inteqs , SameTest −>( $ S i m p l i f i c a t i o n F u n c t i o n [ # 1 [ [ 1 ] ] / # 2 [ [ 1 ] ] ] = = = − 1 | | #1 === #2&) ] ; ]; Ermis [ h , " The c o e f f i c i e n t s of t h e I n f i n i t e s i m a l Generator are : " , 1 ] ; Ermis [ h , # ] & / @res [ [ 1 ] ] ; I f [ F l a t t e n [ Rest [ r e s ] ] = ! = { } , r e s [ [ 2 ] ] = r e s [ [ 2 ] ] / / . ( # [ [ 1 ] ] − > # [ [ 2 ] ] [ # [ [ 2 , 1 ] ] ] & / @DummyVarList ) ; Ermis [ h , " in a d d i t i o n we have t h e c o n s t r a i n t ( s ) " , 1 ] ; Do [ Ermis [ h , r e s [ [ 2 , i ] ] ] , { i , r e s [ [ 2 ] ] / / Length } ] ]

120

Κ S

2521 2522 2523 2524 2525 2526 2527 2528 2529

2530 2531 2532 2533 2534 2535 2536 2537

2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563

, r e s =Drop [ # , 2 ] & / @res ; r e s ={MapAt [ Function@@$SimplificationFunction [ List@@ # / . DummyVarList]& , # , { 2 } ] & / @ S e l e c t [ # [ [ 5 ] ] , Count [ { # [ [ 1 ] ] } , A l t e r n a t i v e s @ @ E q s I n f o [ [ 2 ] ] ] > 0 & ] , J o i n [ # [ [ 1 ] ] , # [ [ 2 ] ] , # [ [ 3 ] ] , # [ [ 4 ] ] ] } & / @res ; r e s = MapThread [ ( { # 1 , # 2 } / . CleanUpConstants [ # 2 ] ) / . A l i a s T a b l e & ,{ Threads , r e s } ] ; variables = variables / . AliasTable ; (* omadopoi’w tic ’idiec peript’wseic *) r e s = Reap [ Sow [ # [ [ 1 ] ] , { # [ [ 2 ] ] } ] & / @res , _ , L i s t ] / / Last ; r e s = DeleteCases [ res , { { { } . . } , _ _ } ] ; r e s = MapAt [ ( Check [ Reduce [ # , S e l e c t [ Cases [ # , _Symbol | _Symbol [ _ I n t e g e r ] , I n f i n i t y ] / / Union , ! NumericQ [ # ] & ] , B a c k s u b s t i t u t i o n −>True ] , # ] ) &[Or@@ ( # / . { HoldPattern [ Equal [ b o d y _ _ ] ] / ; Count [ { body } , D e r i v a t i v e [ _ _ ] [ FreeFunc [ _ _ ] ] [ _ _ ] , I n f i n i t y ] > 0 −> True } / . { HoldPattern [ Equal [ b o d y _ _ ] ] / ; Count [ { body } , A l t e r n a t i v e s @ @ ( J o i n [ Complement [ EqsInfo [ [ 2 ] ] , knownfunctions ] , v a r i a b l e s ] ) | Const [ i d x _ I n t e g e r / ; i d x > C o n s t O f f s e t ] , I n f i n i t y , Heads−>True ] > 0 −> F a l s e } ) ] & , # , 2 ] & / @res ; r e s = DeleteCases [ res , { _ L i s t , F a l s e } ] ; DummyVarList = DummyVarList / . A l i a s T a b l e ; RemoveAlias [ ] ; (* Removing integral equations already existing as differential *) Do [ r e s [ [ i , 1 , 2 ] ] = Union [ DeleteCases [ S im pl if yE q [ r e s [ [ i , 1 , 2 ] ] , EqsInfo [ [ 1 ] ] / / F l a t t e n / / Union , I d e n t i t y ] , True ] , SameTest −>( $ S i m p l i f i c a t i o n F u n c t i o n [ # 1 [ [ 1 ] ] / # 2 [ [ 1 ] ] ] = = = − 1 | | #1 === #2&) ] ; I f [ Or@@ ( I n t e g r a l Q / @res [ [ i , 1 , 2 ] ] ) , inteqs = Select [ res [ [ i , 1 , 2 ] ] , IntegralQ ] ; r e s [ [ i , 1 , 2 ] ] = Complement [ r e s [ [ i , 1 , 2 ] ] , I n t e g r a l T o D i f f e r e n t i a l E q [ # , Union [ F l a t t e n [ EqsInfo [ [ 1 ] ] ] ] ] & / @inteqs , SameTest −>( $ S i m p l i f i c a t i o n F u n c t i o n [ # 1 [ [ 1 ] ] / # 2 [ [ 1 ] ] ] = = = − 1 | | #1 === #2&) ] ; ] , { i , 1 , Length [ r e s ] } ] ; I f [ $showreport , h=GetNotebookHandle [ " Report " ] ; Ermis [ h , " R e s u l t s " , 4 ] ; Do [ Ermis [ h , " Case : " T o S t r i n g [ i ] < > " : : " , { r e s [ [ i , 2 ] ] } ] ; Ermis [ h , " The c o e f f i c i e n t s of t h e I n f i n i t e s i m a l Generator are : " , 1 ] ; Ermis [ h , # ] & / @res [ [ i , 1 , 1 ] ] ; I f [ F l a t t e n [ Rest [ r e s [ [ i , 1 ] ] ] ] = ! = { } , res [ [ i , 1 , 2 ] ] = res [ [ i , 1 , 2 ] ] / / . ( # [ [ 1 ] ] − > # [ [ 2 ] ] [ # [ [ 2 , 1 ] ] ] & / @DummyVarList ) ; Ermis [ h , " in a d d i t i o n we have t h e c o n s t r a i n t ( s ) " , 1 ] ; Do [ Ermis [ h , r e s [ [ i , 1 , 2 , j ] ] ] , { j , r e s [ [ i , 1 , 2 ] ] / / Length } ] ] , { i , 1 , Length [ r e s ] } ] ] ] ]; $HistoryLength = I n f i n i t y ; Threads = { } ; $AdditionalAssumptions = { } ; DummyVarList = { } ; I f [ s k i p p e d = ! = − 1, Close [ s k i p p e d ] ] ; I f [ log , I f [ $Stream = ! = 0 , $Stream [ [ 1 ] ] = NotebookPut [ NotebookGet [ $Stream [ [ 1 ] ] ] / . ( V i s i b l e −> F a l s e ) −> ( V i s i b l e −> True ) , $Stream [ [ 1 ] ] ] ; NotebookSave [ $Stream [ [ 1 ] ] ] ; NotebookClose [ $Stream [ [ 1 ] ] ] ] ] ; (*Se TeXForm? *) res

2564 2565 ] 2566 2567 (* 25/04/2007 *) 2568 2569 SortFuncLex [ D e r i v a t i v e [ o r d e r 1 _ _ I n t e g e r ] [ f u n 1 _ ] [ _ _ ] , D e r i v a t i v e [ o r d e r 2 _ _ I n t e g e r ] [ fun2_ ] [ _ _ ] ] : = I f [ fun1 === fun2 , OrderedQ [ { { o r d e r 1 } , { order2 } } ] , OrderedQ [ { fun1 , fun2 } ] ] 2570 2571 SortFuncLex [ D e r i v a t i v e [ o r d e r 1 _ _ I n t e g e r ] [ f u n 1 _ ] [ _ _ ] , fun2_ [ _ _ ] ] : = F a l s e 2572 2573 SortFuncLex [ f u n 1 _ [ _ _ ] , D e r i v a t i v e [ o r d e r 2 _ _ I n t e g e r ] [ fun2_ ] [ _ _ ] ] : = True 2574 2575 SortFuncLex [ smth1_ , smth2_ ] : = OrderedQ [ { smth1 , smth2 } ] 2576 2577 (* 17/07/2004 *) 2578 2579 SortFuncTot [ D e r i v a t i v e [ o r d e r 1 _ _ I n t e g e r ] [ f u n 1 _ ] [ _ _ ] , D e r i v a t i v e [ o r d e r 2 _ _ I n t e g e r ] [ fun2_ ] [ _ _ ] ] : = Module [ { sum1 = Plus [ o r d e r 1 ] , sum2 = Plus [ order2 ] } , 2580 I f [ sum1 == sum2 , 2581 I f [ { o r d e r 1 } === { order2 } , 2582 OrderedQ [ { fun1 , fun2 } ] 2583 , 2584 OrderedQ [ { o r d e r 1 , order2 } ] 2585 ] 2586 , 2587 sum1 < sum2 2588 ] 2589 ] 2590 2591 SortFuncTot [ D e r i v a t i v e [ o r d e r 1 _ _ I n t e g e r ] [ f u n 1 _ ] [ _ _ ] , fun2_ [ _ _ ] ] : = F a l s e 2592 2593 SortFuncTot [ f u n 1 _ [ _ _ ] , D e r i v a t i v e [ o r d e r 2 _ _ I n t e g e r ] [ fun2_ ] [ _ _ ] ] : = True 2594 2595 SortFuncTot [ smth1_ , smth2_ ] : = OrderedQ [ { smth1 , smth2 } ] 2596

121

2597 (* 24/11/2006 *) 2598 2599 2600 SubAlgebraQ [ s t r u c t u r e c o n s t a n t s _ , A l g e b r a B a s e I n d e x _ L i s t , S u b A l g e b r a I n d e x _ L i s t : { } ] / ; ArrayQ [ s t r u c t u r e c o n s t a n t s , 3 ] : = Module [ { l e n = Dimensions [ s t r u c t u r e c o n s t a n t s ] , index = { } } , 2601 I f [ UnsameQ@@len , P r i n t [ " I n v a l i d s t r u c t u r e c o n s t a n t s d e t e c t e d " ] ; Abort [ ] , l e n = l e n [ [ 1 ] ] ] ; 2602 I f [ SubAlgebraIndex = ! = { } , 2603 I f [ Length [ SubAlgebraIndex ] = ! = len , 2604 P r i n t [ " I n v a l i d SubAlgebraIndex d e t e c t e d " ] ; Abort [ ] 2605 ]; 2606 index = Rule@@@Thread [ { Union [ SubAlgebraIndex ] , Array [ X, l e n ] } ] ; 2607 index = Union [ F l a t t e n [ List@@@ ( AlgebraBaseIndex / . index ) ] ] 2608 , 2609 index = Union [ F l a t t e n [ List@@@AlgebraBaseIndex ] ] 2610 ]; 2611 I f [ Length [ AlgebraBaseIndex ] == len , Return [ True ] ] ; 2612 ( s t r u c t u r e c o n s t a n t s [ [ index , index , # ] ] & / @Complement [ Array [#& , l e n ] , index ] / / F l a t t e n / / Union ) === { 0 } 2613 ] 2614 2615 (* 1/10/2004 *) 2616 2617 SymmetryReduce [ deqs : _Equal | { _ _ E q u a l } , o p e r _ F u n c t i o n ] : = Module [ { v a r s = Apply @@@ Thread [ Reverse [ Take [ C h a r a c t e r i z e E q [ deqs ] , 2 ] ] ] , i s c , s i m i l a r i t y s o l u t i o n s , s i m i l a r i t y v a r i a b l e s = { } , simrules , reducedeqs = {}} , 2618 i s c = I n v a r i a n t S u r f a c e C o n d i t i o n [ oper , v a r s ] ; 2619 I f [ ! MatchQ [ i s c , { _ _ E q u a l } | _Equal ] , Return [ { } ] ] ; 2620 I f [ Length [ v a r s ] == 1 , 2621 s i m i l a r i t y s o l u t i o n s = DSolve [ i s c , Head [ v a r s [ [ 1 ] ] ] , L i s t @@ v a r s [ [ 1 ] ] , GeneratedParameters −> ( FreeFunc [ # ] &) ] / / F l a t t e n 2622 , 2623 s i m i l a r i t y s o l u t i o n s = SolveOverdeterminedEqs [ i s c ] [ [ 1 ] ] 2624 ]; 2625 (* TODO Must anticipate the situation where the solve gives multiple solutions *) 2626 s i m i l a r i t y v a r i a b l e s = Cases [ s i m i l a r i t y s o l u t i o n s , FreeFunc [ _ I n t e g e r ] [ _ _ ] , I n f i n i t y ] / / Union ; 2627 s i m i l a r i t y v a r i a b l e s = F l a t t e n [ L i s t @@@ s i m i l a r i t y v a r i a b l e s ] / / Union ; 2628 s i m i l a r i t y v a r i a b l e s = Complement [ s i m i l a r i t y v a r i a b l e s , L i s t @@@ v a r s / / F l a t t e n / / Union ] ; 2629 I f [ s i m i l a r i t y v a r i a b l e s === { } , s i m r u l e s = { } , 2630 I f [ Length [ s i m i l a r i t y v a r i a b l e s ] == 1 , 2631 s i m r u l e s = { Global ‘ \ [ Zeta ] −> s i m i l a r i t y v a r i a b l e s [ [ 1 ] ] } , 2632 s i m r u l e s = Rule @@@Thread [ { Array [ Global ‘ \ [ Zeta ] , Length [ s i m i l a r i t y v a r i a b l e s ] ] , similarityvariables }] 2633 ] 2634 ]; 2635 v a r s = Union [ List@@@vars / / F l a t t e n , s i m r u l e s [ [ All , 1 ] ] ] ; 2636 I f [ simrules =!= { } , 2637 reducedeqs = Si mp l if yE q [ XEliminate [ deqs / . s i m i l a r i t y s o l u t i o n s , Equal @@@ simrules , v a r s ] , v a r s ] 2638 , 2639 reducedeqs = Si mp l if yE q [ deqs / . s i m i l a r i t y s o l u t i o n s , v a r s ] 2640 ]; 2641 { simrules , s i m i l a r i t y s o l u t i o n s , reducedeqs } 2642 ] 2643 2644 (* 03/07/2006 *) 2645 2646 SystemSolveOnce [ i n p u t _ L i s t , o p t s _ _ _ ] / ; MatchQ [ input , { _ I n t e g e r | { _ _ } , _ N o t e b o o k O b j e c t | 0 , { _ _ _ } . . } ] : = Module [ { Step , h , DEQs , AlgEQs , UnresolvedEQs , Reserve , s e t , Uknowns , UnresolvedUknowns , KnownFunctions , i v s , UknownsOfInterest , s o l u t i o n , index , deqInfo , temp , newdeq , algcond , dummyinfo , dummylen , GlobalAnalysis , s e l e c t i o n = { } , s p l i t t e d = { } , ReunionFlag = False , S o l u t i o n s W i t h I n t e g r a l s = { } , sugg , pos , p o t e n t i a l f o r m , FactoredEqs = { } , DEqOfKnownFunctionsOnly = { } } , 2647 (* Eisagwg’h twn dedom’enwn *) 2648 { Step , h , DEQs , AlgEQs , UnresolvedEQs , Reserve , s e t , Uknowns , UnresolvedUknowns , KnownFunctions , ivs } = input ; 2649 (* Se per’iptwsh pou m’esa sta dedom’ena up’arqei kai h tim’h False h sun’arthsh termat’izei *) 2650 I f [ Count [ input , F a l s e | I n f i n i t y | I n d e t e r m i n a t e | Co mpl ex In fin it y , I n f i n i t y ] >0 , Return [ { } ] ] ; 2651 I f [ Length [ temp= S e l e c t [ Union [ DEQs , AlgEQs , UnresolvedEQs , Reserve ] , Count [ # , Alternatives@@Union [ Uknowns , UnresolvedUknowns ] , I n f i n i t y , Heads−>True ]==0 && Length [ Complement [ Cases [ # , Const [ _ I n t e g e r ] | _Symbol | _Symbol [ _ _ I n t e g e r ] , I n f i n i t y ] , i v s ]]==0 && Count [ # , A l t e r n a t i v e s @ @ i v s , I n f i n i t y ] >0&] ] >0 , Return [{}]]; 2652 (* Epil’egw ap’o tic UnresolvedUknowns aut’ec stic opo’iec den antistoiqe’i k’apoia UnresolvedEQs ’h up’arqoun kai sto s’unolo DEQs *) 2653 temp = { } ; 2654 I f [ UnresolvedUknowns = ! = { } , 2655 temp = S e l e c t [ UnresolvedUknowns , Count [ UnresolvedEQs , D e r i v a t i v e [ _ _ I n t e g e r ] [ # ] [ _ _ ] , I n f i n i t y ] == 0 | | Count [ DEQs, # , I n f i n i t y , Heads−>True ] > 0&] 2656 ]; 2657 (* Se per’iptwsh pou ’eqw t’etoiou e’idouc metablht’ec tic xanaeis’agw m’esa sto s’unolo twn ’agnwstwn metablht’wn mou kai tic afair’w apo to s’unolo twn UnresolvedUknowns*) 2658 I f [ Length [ temp ] >0 , 2659 Uknowns = Union [ Uknowns , temp ] ; 2660 UnresolvedUknowns = DeleteCases [ UnresolvedUknowns , Alternatives@@temp ] 2661 ]; 2662 (* Epil’egw ap’o tic UnresolvedEQs aut’ec stic opo’iec den antistoiqe’i k’apoia UnresolvedUknowns *) 2663 temp = { } ; 2664 I f [ UnresolvedEQs = ! = { } , 2665 temp = S e l e c t [ UnresolvedEQs , Count [ # , D e r i v a t i v e [ _ _ I n t e g e r ] [ Alternatives@@UnresolvedUknowns ] [ _ _ ] , I n f i n i t y ] == 0&] 2666 ]; 2667 (* Se per’iptwsh pou ’eqw t’etoiou e’idouc ’agnwstec exis’wseic tic xanaeis’agw m’esa sto s’unolo twn ’agnwstwn exis’wsewn mou kai tic afair’w apo to s’unolo twn UnresolvedEQs *)

122

Κ S

2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744

I f [ Length [ temp ] >0 , DEQs = Union [ DEQs , temp ] ; UnresolvedEQs = DeleteCases [ UnresolvedEQs , Alternatives@@temp ] ]; (* Se per’iptwsh pou den ’eqoume ’allec ’agnwstec sunart’hseic h sun’arthsh termat’izei *) I f [ Uknowns === { } && DEQs === { } && AlgEQs === { } && UnresolvedUknowns === { } , Return [ { Step , h , DEQs , AlgEQs , UnresolvedEQs , Reserve , s e t , Uknowns , UnresolvedUknowns , KnownFunctions , i v s } ] ]; Ermis [ h , " S t e p " T o S t r i n g [ S t e p ] , 5 ] ; I f [ DEQs === AlgEQs === { } && UnresolvedEQs = ! = { } , ReunionFlag = True ; DEQs = J o i n [ UnresolvedEQs , Reserve ] ; Reserve = { } ; DEQs = RemoveIdentity [ Si m pl if yE q [ # , i v s , TimeConstrained [ $ S i m p l i f i c a t i o n F u n c t i o n [ # ] , $TimeConstrained , Message [ S im pl if y Eq : : OutOfTime , $TimeConstrained ] ; # ] & ]&/@DEQs ] ; Uknowns = Union [ Uknowns , UnresolvedUknowns ] ; UnresolvedUknowns = UnresolvedEQs = { } ]; (* S’arwma twn exis’wsewn gia aut’ec pou e’inai oloklhrwtik’ec kai antikatastash aut’wn me tic ant’istoiqec diaforik’ec me par’allhlo sp’asimo ’opou e’inai efikt’o*) I f [ ( temp = S e l e c t [ DEQs , I n t e g r a l Q ] ) = ! = { } , temp = { # , F i x e d P o i n t [ Union [ F l a t t e n [ DecoupleEq [ # , J o i n [ Uknowns , UnresolvedUknowns ] , i v s ]&/@ # ] ] & , { # } ] } & / @temp ; Do [ I f [ { temp [ [ i , 1 ] ] } = ! = temp [ [ i , 2 ] ] , Ermis [ h , " The i n t e g r a l equation : " ] ; Ermis [ h , temp [ [ i , 1 ] ] ] ; Ermis [ h , " s p l i t s i n t o : " ] ; Do [ Ermis [ h , temp [ [ i , 2 , j ] ] ] , { j , 1 , Length [ temp [ [ i , 2 ] ] ] } ] ; Reserve = J o i n [ Reserve , { temp [ [ i , 1 ] ] } ] ; DEQs = J o i n [ Complement [ DEQs , { temp [ [ i , 1 ] ] } ] , temp [ [ i , 2 ] ] ] ] , { i , 1 , Length [ temp ] } ] ; Do [ I f [ I n t e g r a l Q [ DEQs [ [ i ] ] ] && ! MatchQ [ DEQs [ [ i ] ] , Equal [ Alernatives@@Uknowns [ _ _ ] , _ ] ] , newdeq = I n t e g r a l T o D i f f e r e n t i a l E q [ DEQs [ [ i ] ] , i v s ] ; Ermis [ h , "By D i f f e r e n t i a t i n g t h e I n t e g r a l Equation : " , 1 ] ; Ermis [ h , DEQs [ [ i ] ] ] ; Ermis [ h , " I i n t r o d u c e t h e equation : " , 1 ] ; Ermis [ h , newdeq ] ; Reserve = J o i n [ Reserve , { DEQs [ [ i ] ] } ] ; DEQs = Append [ DEQs , newdeq ] ] , { i , 1 , Length [ DEQs ] } ] ; DEQs = Complement [ DEQs , Reserve ] ]; (* Aplopo’ihsh sust’hmatoc *) I f [ ReunionFlag , DEQs = DeleteCases [ J o i n [ DEQs , C o m p a t i b i l i t i e s [ DEQs ] ] , True ] ; DEQs = F i x e d P o i n t [ SimplifySystemOnce [ # , i v s ] & , { { } , DEQs , { } } ] / / F l a t t e n / / Union ; DEQs = RemoveIdentity [ Si mp l if yE q [ # , i v s ]& / @ DEQs] ]; (* Sugk’entrwsh sunolik’hc eik’onac gia to s’usthma, sum. h sun’arthsh GetGlobalAnalysis agnoe’i tic oloklhrwtik’ec kai algebrik’ec exis’wseic *) G l o b a l A n a l y s i s = GetGlobalAnalysis [ DEQs , KnownFunctions ] ; Catch [ Do [ deqInfo = GlobalToLocal [ DEQs [ [ i ] ] , G l o b a l A n a l y s i s ] ; (* "Sp’asimo" twn exis’wsewn pou peri’eqoun rht’a metablht’ec pou den up’arqoun stic up’o mel’eth ’agnwstec sunart’hseic ’opwc ep’ishc kai wc proc tic metax’u twn ’agnwstwn sunart’hsewn exart’hseic *) (*Print[":>",DEQs[[i]]];*) temp = F i x e d P o i n t [ Union [ F l a t t e n [ DecoupleEq [ # , J o i n [ Uknowns , UnresolvedUknowns ] , i v s ]&/@ # ] ] & , {DEQs [ [ i ] ] } ] ; (*Print["