Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Πρέπει να φτιάξω έναν πίνακα πραγματικών αριθμών Τ[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 θα φτάσει στο μηδέν πως θα γίνει να μην πετάξει σφάλμα?

αν μπορεί κάποιος να με βοηθήσει θα του ήμουν ευγνώμων! 

 

Δημοσ.

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]

Δημοσ.

Σε κάθε αναδρομή χρησιμοποιείς την τιμή του 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.

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

 

Δημοσ.

Ξεκινας απο το Τ[0,0]=0

 

Ούτε Τ[0,1] ούτε Τ[1,0] μπορείς να βρεις μετά (τουλαχιστον αν δεν μετασχηματίσεις κάπως τον τυπο). 

Δημοσ.

Αρχικά έχουμε αυτό 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. με τον αρχικό τύπο της αναδρομής ?

 

Ενδιαφέρον θέματακι πάντως.

Δημοσ.

Αν υπάρχει κάποια εκφώνηση θα βοηθούσε, γιατί έτσι όπως το δίνεις δε φτάνει... επίσης όταν λές ότι το j είναι χώρος, τί εννοείς.

Δημοσ.

Η εκφώνηση είναι η ακόλουθη: ο τύπος εκφράζει την μη-γραμμική διάχυση

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.  

Έτσι πιστεύω να τρέξει!  Ελπίζω να  βοήθησα λίγο

Δημοσ.

Ναι τώρα δεν έχεις πρόβλημα με τον τύπο σου... Το j θα ξεκινάει από 1 και θα πηγαίνει μέχρι 4 (για το συγκεκριμένο παράδειγμα) ενώ το i θα ξεκινάει από 1 και θα πηγαίνει μέχρι 3 (για το συγκεκριμένο πάλι παράδειγμα).

 

Γενικά αν θέλεις να τρέξεις για Imax,Jmax τιμές τότε οι μετρητές του πίνακα θα παίρνουν τιμές από [0,Imax-1] και [0,Jmax-1] ενώ τα loop αντίστοιχα θα τρέχουν για i από 1 έως Imax-2 και για j από 1 έως Jmax-2.

 

Δεν έχω καταλάβει τι σε δυσκολεύει ακριβως; Θέλεις να γεμίζεις τον πίνακα με αναδρομική συνάρτηση κι όχι με απλά loops;

  • Like 1
Δημοσ.

Ειναι σε 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;
        }
Δημοσ.

Ναι τώρα δεν έχεις πρόβλημα με τον τύπο σου... Το 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  γι'αυτό  ζήτησα και βοήθεια! όσο για τον τύπο δυστηχώς δεν γίνεται να αλλάξει...

Δημοσ.

Νομίζω ένα "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);
        } 
Δημοσ.

 

Νομίζω ένα "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) θα γεμίσει ο πίνακας προς τα πίσω...

Δημοσ.

Ειναι λιγο περίεργη η "διαδρομη" της αναδρομης επειδή περιεχει  i-1,  j-1, και j+1

Δεν ξέρω κατα ποσο θα γινει "δι-διαστατα αλυσιδωτά" γιατι κάποιες θέσεις (απ οτι λεέι) εχουν ηδη τιμες και η f() μπορει να (μην χρειαστει να) υπολογισεί τα  Τ(i-1 j) Τ(i, j-1) ...  :-) 

 

Εδιτ

Μαλλον εχεις δίκιο 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...