bigxarakas Δημοσ. 7 Ιουνίου 2013 Δημοσ. 7 Ιουνίου 2013 Πρέπει να φτιάξω έναν πίνακα πραγματικών αριθμών Τ[j] το i ειναί ο χρόνος και το j ο χώρος καί να λύσω την ακόλουθη αναδρομική συνάρτηση T[i +1][j]= T[j] + 2 * (t/( 2 * s ^ 2)) * T[j] * p(T[j +1] + T[j -1] - 2T[j]) το p είναι πραγματικός αριθμός οταν θα το j θα φτάσει στο μηδέν πως θα γίνει να μην πετάξει σφάλμα? αν μπορεί κάποιος να με βοηθήσει θα του ήμουν ευγνώμων!
albNik Δημοσ. 7 Ιουνίου 2013 Δημοσ. 7 Ιουνίου 2013 T[i +1][j]= T[j] + 2 * (t/( 2 * s ^ 2)) * T[j] * p(T[j +1] + T[j -1] - 2T[j]) Φταιει ο όρος T[j-1] για j=0 παίρνει αρνητικό δεικτη Παντως αυτός ο τύπος δεν αρκει για το γέμισμα, χρειάζονται αρχικες συνθήκες για Τ[0][0] και ισως ένας τύπος για Τ[0][j]
bigxarakas Δημοσ. 7 Ιουνίου 2013 Μέλος Δημοσ. 7 Ιουνίου 2013 Για i=0, j=0 Τ[0][0]=0 αλλά για το Τ[j-1] δεν έχω βρεί την λυσή! αυτο είναι που με δυσκολεύει!
albNik Δημοσ. 7 Ιουνίου 2013 Δημοσ. 7 Ιουνίου 2013 Ο όρος Τ[j+1] το δυσκολευει, για να βρεις πχ το Τ[0][1] πρέπει να ξέρεις το Τ[0][2].
nucleus Δημοσ. 7 Ιουνίου 2013 Δημοσ. 7 Ιουνίου 2013 Σε κάθε αναδρομή χρησιμοποιείς την τιμή του i και του i+1.Για το j τις τιμές j-1,j,j+1 Ας υποθέσουμε ότι ο πίνακας σου ειναι 4x4 έχουμε τα παρακάτω i=0 j=0, i=0 j=1, i=0 j=2, i=0 j=3, i=1 j=0, i=1 j=1, i=1 j=2, i=1 j=3 i=2 j=0, i=2 j=1, i=2 j=2, i=2 j=3, i=3 j=0, i=3 j=1, i=3 j=2, i=3 j=3. Για γράψε δίπλα από κάθε περίπτωση τον αναδρομικό σου τύπο αντικαθιστώντας απλώς τα i και j. Δες ποιές περιπτώσεις είναι προβληματικές.Ο υπολογισμός θα γίνεται σε ξεχωριστή συνάρτηση οπότε δες ποια πρέπει να είναι τα ορίσματα της.
albNik Δημοσ. 7 Ιουνίου 2013 Δημοσ. 7 Ιουνίου 2013 Ξεκινας απο το Τ[0,0]=0 Ούτε Τ[0,1] ούτε Τ[1,0] μπορείς να βρεις μετά (τουλαχιστον αν δεν μετασχηματίσεις κάπως τον τυπο).
nucleus Δημοσ. 7 Ιουνίου 2013 Δημοσ. 7 Ιουνίου 2013 Αρχικά έχουμε αυτό T[i +1][j]= T[j] + 2 * (t/( 2 * s ^ 2)) * T[j] * p(T[j +1] + T[j -1] - 2T[j]) αν το κάνεις έτσι? T[j]= T[i-1][j] + 2 * (t/( 2 * s ^ 2)) * T[i-1][j] * p(T[i-1][j +1] + T[i-1][j -1] - 2T[i-1][j]) είναι το ίδιο? <--- Σκράπας στα μαθηματικά. Αν ξεκινήσεις από το το i=3 j=3. με τον αρχικό τύπο της αναδρομής ? Ενδιαφέρον θέματακι πάντως.
bird Δημοσ. 7 Ιουνίου 2013 Δημοσ. 7 Ιουνίου 2013 Αν υπάρχει κάποια εκφώνηση θα βοηθούσε, γιατί έτσι όπως το δίνεις δε φτάνει... επίσης όταν λές ότι το j είναι χώρος, τί εννοείς.
bigxarakas Δημοσ. 9 Ιουνίου 2013 Μέλος Δημοσ. 9 Ιουνίου 2013 Η εκφώνηση είναι η ακόλουθη: ο τύπος εκφράζει την μη-γραμμική διάχυση p ανήκει στους πραγματικούς αριθμούς δημιουργήστε έναν πίνακα από πραγματικούς με δύο δείκτες T[j]: όπου i- χρόνος και j- χώρος, και λύστε την αναδρομική εξίσωση: T[i +1][j]= T[j] + 2 * (t/( 2 * s ^ 2)) * T[j] * p(T[j +1] + T[j -1] - 2T[j]). ο χρήστης θα πρέπει να δίνει για πόσο χρόνο θέλει να τρέξει πχ 5 δευτερολέπτα και για πόσο χώρο πχ 6 εκατοστά, επίσης θα πρέπει να δίνει το t, s, p που θα είναι σταθερές. απο ότι κατάλαβα ο πίνακας θα πρέπει να αρχικοποιηθεί στο μηδέν και αρχικά να έχει την μορφή αυτή Τ j i 0 1.2 2.7 3.5 4.8 0 0 0 0 0 0 0 0 0 δλδ τα άκρα του πίνακα θα πρέπει να έχουν την τιμή μηδέν και στην πρώτη σειρά για i=0 ο χρήστης θα πρέπει να δώσει της τιμές, το j θα ξεκινάει από το 1. Έτσι πιστεύω να τρέξει! Ελπίζω να βοήθησα λίγο
bird Δημοσ. 9 Ιουνίου 2013 Δημοσ. 9 Ιουνίου 2013 Ναι τώρα δεν έχεις πρόβλημα με τον τύπο σου... Το j θα ξεκινάει από 1 και θα πηγαίνει μέχρι 4 (για το συγκεκριμένο παράδειγμα) ενώ το i θα ξεκινάει από 1 και θα πηγαίνει μέχρι 3 (για το συγκεκριμένο πάλι παράδειγμα). Γενικά αν θέλεις να τρέξεις για Imax,Jmax τιμές τότε οι μετρητές του πίνακα θα παίρνουν τιμές από [0,Imax-1] και [0,Jmax-1] ενώ τα loop αντίστοιχα θα τρέχουν για i από 1 έως Imax-2 και για j από 1 έως Jmax-2. Δεν έχω καταλάβει τι σε δυσκολεύει ακριβως; Θέλεις να γεμίζεις τον πίνακα με αναδρομική συνάρτηση κι όχι με απλά loops; 1
albNik Δημοσ. 9 Ιουνίου 2013 Δημοσ. 9 Ιουνίου 2013 Ειναι σε C# επειδή έχει τη δυνατότητα ο πίνακας να έχει κάποια double τιμη η null δλδ να μην έχει τιμή. Στην C αυτο θα το κάνεις με ένα δευτερο πίνακα Μ[5,5] με flags (0 η 1) για το αν έχει οριστει η τιμή στη θέση (i,j) του Τ. H f επιστρέφει την τιμη του Τ[i,j] αν "υπάρχει", αν δεν υπάρχει την υπολογίζει και τη θέτει στο T(i,j) αναδρομικά static double t = 5; static double s = 2; static double p = 3; static double?[,] T = new double?[6, 6]; static double f(int i, int j) { if(i < 0 || i > 5 || j < 0 || j > 5) return 0; if(T[i, j].HasValue) //To T[i,j] exei timi return T[i, j].Value; T[i, j] = f(i - 1, j) + t / s / s * f(i - 1, j) * p * (f(i - 1, j + 1) + f(i - 1, j - 1) - 2 * f(i - 1, j)); return T[i, j].Value; }
bigxarakas Δημοσ. 9 Ιουνίου 2013 Μέλος Δημοσ. 9 Ιουνίου 2013 Ναι τώρα δεν έχεις πρόβλημα με τον τύπο σου... Το j θα ξεκινάει από 1 και θα πηγαίνει μέχρι 4 (για το συγκεκριμένο παράδειγμα) ενώ το i θα ξεκινάει από 1 και θα πηγαίνει μέχρι 3 (για το συγκεκριμένο πάλι παράδειγμα). Γενικά αν θέλεις να τρέξεις για Imax,Jmax τιμές τότε οι μετρητές του πίνακα θα παίρνουν τιμές από [0,Imax-1] και [0,Jmax-1] ενώ τα loop αντίστοιχα θα τρέχουν για i από 1 έως Imax-2 και για j από 1 έως Jmax-2. Δεν έχω καταλάβει τι σε δυσκολεύει ακριβως; Θέλεις να γεμίζεις τον πίνακα με αναδρομική συνάρτηση κι όχι με απλά loops; Nαι, θέλω να γίνεται με μια αναδρομική συνάρτηση ο υπολογισμός της εξίσωσης και το αποτέλεσμα να αποθηκεύεται σε έναν πίνακα με την συγκεκριμένη μορφή που περιέγραψα προηγουμένος. Ειναι σε C# επειδή έχει τη δυνατότητα ο πίνακας να έχει κάποια double τιμη η null δλδ να μην έχει τιμή. Στην C αυτο θα το κάνεις με ένα δευτερο πίνακα Μ[5,5] με flags (0 η 1) για το αν έχει οριστει η τιμή στη θέση (i,j) του Τ. H f επιστρέφει την τιμη του Τ[i,j] αν "υπάρχει", αν δεν υπάρχει την υπολογίζει και τη θέτει στο T(i,j) αναδρομικά static double t = 5; static double s = 2; static double p = 3; static double?[,] T = new double?[6, 6]; static double f(int i, int j) { if(i < 0 || i > 5 || j < 0 || j > 5) return 0; if(T[i, j].HasValue) //To T[i,j] exei timi return T[i, j].Value; T[i, j] = f(i - 1, j) + t / s / s * f(i - 1, j) * p * (f(i - 1, j + 1) + f(i - 1, j - 1) - 2 * f(i - 1, j)); return T[i, j].Value; } albnik δεν έχω καταλάβει τι έκανες! δεν ξέρω πολύ καλά την C γι'αυτό ζήτησα και βοήθεια! όσο για τον τύπο δυστηχώς δεν γίνεται να αλλάξει...
albNik Δημοσ. 9 Ιουνίου 2013 Δημοσ. 9 Ιουνίου 2013 Νομίζω ένα "2" απλοποιείται μόνο του στον τυπο. Η αναδρομική συναρτηση σου πρέπει να υπολογίζει και να αποθηκεύει την τιμή του Τ[i,j]. Η τιμή κάθε Τ[i,j] εξαρτάται από τον γειτόνων του. Απλα θες ένα δευτερο πίνακα που να σου λέει αν ο γειτονας στη θεση π.χ. (i, j+1) εχει τιμή η όχι ακομα if(K[i,j+1]==1) Υπολογιζοντας τις τιμες τις αποθηκέυεις στο Τ[i,j]=1234.567 και τσεκάρεις τον δευτερο πινακα K[i,j]=1 Ετσι μπορεις να τρεχεις το διπλο loop απο 0 εως 6 και αυτό θα υπολογισει μονο όσα δεν εχουν τιμή ακομα void main() { T[0, 0] = 0; K[0, 0] = 1; T[0, 1] = 1.2; K[0, 1] = 1; T[0, 2] = 1.2; K[0, 1] = 1; ..... ..... for(int i = 0; i < 6; i++) for(int j = 0; j < 6; j++) f(i, j); }
bird Δημοσ. 9 Ιουνίου 2013 Δημοσ. 9 Ιουνίου 2013 Νομίζω ένα "2" απλοποιείται μόνο του στον τυπο. Η αναδρομική συναρτηση σου πρέπει να υπολογίζει και να αποθηκεύει την τιμή του Τ[i,j]. Η τιμή κάθε Τ[i,j] εξαρτάται από τον γειτόνων του. Απλα θες ένα δευτερο πίνακα που να σου λέει αν ο γειτονας στη θεση π.χ. (i, j+1) εχει τιμή η όχι ακομα if(K[i,j+1]==1) Υπολογιζοντας τις τιμες τις αποθηκέυεις στο Τ[i,j]=1234.567 και τσεκάρεις τον δευτερο πινακα K[i,j]=1 Ετσι μπορεις να τρεχεις το διπλο loop απο 0 εως 6 και αυτό θα υπολογισει μονο όσα δεν εχουν τιμή ακομα void main() { T[0, 0] = 0; K[0, 0] = 1; T[0, 1] = 1.2; K[0, 1] = 1; T[0, 2] = 1.2; K[0, 1] = 1; ..... ..... for(int i = 0; i < 6; i++) for(int j = 0; j < 6; j++) f(i, j); } Έτσι όπως έχεις ορίσει την f νομίζω αρκεί να καλέσεις από την main την f μόνο για την τελευταία γραμμή... for(int i = 5; i > 0; i--) f(i, 4); Απο τη στιγμή που μέσα στην f καλείς την f(i-1,j) f(i-1,j-1) Και f(i-1,j+1) θα γεμίσει ο πίνακας προς τα πίσω...
albNik Δημοσ. 9 Ιουνίου 2013 Δημοσ. 9 Ιουνίου 2013 Ειναι λιγο περίεργη η "διαδρομη" της αναδρομης επειδή περιεχει i-1, j-1, και j+1 Δεν ξέρω κατα ποσο θα γινει "δι-διαστατα αλυσιδωτά" γιατι κάποιες θέσεις (απ οτι λεέι) εχουν ηδη τιμες και η f() μπορει να (μην χρειαστει να) υπολογισεί τα Τ(i-1 j) Τ(i, j-1) ... Εδιτ Μαλλον εχεις δίκιο
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα