Εμφάνιση 1-14 από 14
  1. #1
    Εγγραφή
    24-09-2010
    Περιοχή
    Χαλκιδική
    Ηλικία
    28
    Μηνύματα
    743
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL
    Ταχύτητα
    24mbps
    ISP
    ΟΤΕ Conn-x
    Router
    ZTE ZXHN H108NS
    Καλησπέρα.

    Χρησιμοποιώντας την γλώσσα python κατάφερα να φτιάξω ένα πρόγραμμα που λύνει εξισώσεις δευτέρου
    βαθμού (δίνεις τα α ,β ,γ βρίσκει την διακρίνουσα και με τον τύπο λύσεων βρίσκει τις λύσεις).
    Στην ουσία μπλέκουν μόνο αριθμοί σε αυτό το πρόγραμμα.

    Άμα τώρα θέλω για παράδειγμα να φτιάξω ένα πρόγραμμα που να λύνει εξισώσεις πρώτου βαθμού όπως :

    2x + 3 = x +8 <=> x = 5

    Πώς θα πω στον υπολογιστή να κάνει πράξεις όπως 2x + x = 3x ?
    Καταρχάς τη θα πρέπει να ζητήσω από τον χρήστη, πως είναι δυνατόν να μου δώσει
    ολόκληρη την παράσταση?
    Αυτό μου φαίνεται αδύνατον , έχω σπάσει το κεφάλι μου εδώ και πόσες μέρες αλλά δεν μπορώ να βρω
    λύση.Και στο ίντερνετ δεν έχω βρει κανένα παρόμοιο προγραμματάκι για να δω τον κώδικα.

    Μήπως έχει κανείς καμιά ιδέα?

    Ευχαριστώ.

  2. #2
    Εγγραφή
    12-08-2008
    Ηλικία
    40
    Μηνύματα
    44
    Downloads
    0
    Uploads
    0
    DSLAM
    Wind - ΑΜΠΕΛΟΚΗΠΟΙ
    Όπως στις εξισώσεις 2ου βαθού ο γενικός τύπος είναι αχ^2 + βχ + γ = 0, εδώ ο τύπος που ψαχνεις είναι αχ + β = 0.
    Άρα η είσοδος στο πρόγραμμά σου θα είναι τα α και β.

  3. #3
    Εγγραφή
    24-09-2010
    Περιοχή
    Χαλκιδική
    Ηλικία
    28
    Μηνύματα
    743
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL
    Ταχύτητα
    24mbps
    ISP
    ΟΤΕ Conn-x
    Router
    ZTE ZXHN H108NS
    Στην ουσία ο τύπος επίλυσης θα είναι x = -β/α .
    Δίκαιος έχεις απλός εγώ σκεπτόμουν αν γινόταν ο χρήστης να δίνει ολόκληρη την παράσταση πχ

    2x+5+x = 2x +10

    και το πρόγραμμα τα κάνει αυτό :

    2x+5+x = 2x +10 <=> 3x + 5 = 2x + 10 <=> x = 5

    Θα μπορούσα με κάποιον τρόπο να το κάνω αυτό?

  4. #4
    Εγγραφή
    07-07-2008
    Μηνύματα
    296
    Downloads
    12
    Uploads
    0
    Μια πρόχειρη (πιθανή) λύση που μου ήρθε είναι η εξής:
    1) η εισαγωγή θα μπορούσε να γίνει με τον χρήστη να γράψει όλη την εξίσωση,καλύτερα χωρίς κενά, κάπως έτσι "2χ+4χ+23=18-5χ" και αυτό θα το αποθήκευα ως ένα string.
    2)Θα δημιουργούσα δύο λίστες(array,στην python αν δεν κάνω λάθος λέγοντα lists). Στην μία λίστα θα βάλεις αυτά που υπάρχουν δεξιά από το = και στην άλλη αυτά που υπάρχουν αριστερά.
    3)Μετά το αρχικό string θα το έσπαγα σε κομμάτια έτσι ώστε το κάθε κομμάτι να περιέχει μόνο πράξη(+ ή -),αριθμό, και χ αν υπάρχει, και θα τοποθετούσα το κάθε κομμάτι σε όποια λίστα ανήκει, δηλαδή το παραπάνω παράδειγμα θα γινόταν κάπως έτσι
    Κώδικας:
    list1 = ['+2x', '+4x', '23']
    list2 = ['18', '-5x']
    4) Μετά βρίσκεις ποια κομμάτια έχουν χ και ποια όχι στην πρώτη λίστα και κάνεις τις αντίστοιχες πράξεις και το ίδιο κάνεις και στην δεύτερη λίστα οπότε σε αυτό το σημείο θα είναι σαν να έχεις (νχ + ψ = φχ + ω)
    5) κάνεις και τις τελευταίες πράξεις αλλάζοντας μεριά(οπότε και πρόσημα) όπου χρειάζεται και μετά βγάζεις το αποτέλεσμα.

    Ελπίζω να βοήθησα...Δεν έχω δοκιμάσει αυτό τον τρόπο οπότε δεν ξέρω αν θα λειτουργήσει ή τι προβλήματα μπορεί να προκύψουν!

  5. #5
    Εγγραφή
    07-02-2007
    Μηνύματα
    747
    Downloads
    6
    Uploads
    0
    Η γενική περίπτωση αυτού που περιγράφεις ονομάζεται symbolic computation. Υπάρχουν εξειδικευμένα προγράμματα (πχ Mathematica, Mapple κτλ) που κάνουν ακριβώς αυτήν την δουλειά και πολύ περισσότερα (πχ παραγωγίσεις, ολοκληρώσεις κτλ). Στην python υπάρχει μια βιβλιοθήκη που είναι αρκετά ώριμη (δεν είναι mathematica όμως) και ονομάζεται sympy.

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

    Αναφορικά με αυτό που ρωτάς, κάτι πιο γενικό από αυτό που προτείνει ο atilas είναι να δημιουργήσεις μία κλάση Symbol ή Expression ή κάτι τέτοιο, μέσω της οποίας θα κρατάς τις μεταβλητές σε συμβολική μορφή και θα κάνεις τις πράξεις. Δες εδώ και τις βιβλιοθήκες που προτείνονται για να πάρεις ιδέες
    http://stackoverflow.com/questions/5...ematics-python

    Το πιο απλό πάντως, ιδίως αν έχεις να λύσεις συγκεκριμένο πρόβλημα είναι να χρησιμοποιήσεις το sympy. Αν είναι απλώς για εξάσκηση, τότε έιναι μεν ενδιαφέρον πρόβλημα, αλλά αν θες να κάνεις κάτι λίγο πιο γενικό, ρίξε ένα μάτι πρώτα να δεις τι κάνουν οι άλλοι γιατί γενικά θέλει design πρώτα. Δεν είναι κάτι δηλαδή που μπορείς κατευθείαν να ξεκινήσεις να γράφεις κώδικα.
    Τελευταία επεξεργασία από το μέλος pmav99 : 29-08-13 στις 13:58.
    Οδηγός για LaTeX στα Ελληνικά
    Οδηγός για Linux στα Ελληνικά

  6. #6
    Εγγραφή
    06-10-2008
    Ηλικία
    35
    Μηνύματα
    515
    Downloads
    2
    Uploads
    0
    Ταχύτητα
    6144/1024
    ISP
    HOL
    DSLAM
    Forthnet - ΑΓΙΟΥ ΓΕΩΡΓΙΟΥ
    Router
    WAG54G2 Linksys
    Path Level
    Interleaved
    Η πιο σωστή λύση πιστεύω είναι να χρησιμοποιήσεις expression tree για να αναλύσεις τις πράξεις με τη βοήθεια του δέντρου.
    http://en.wikipedia.org/wiki/Binary_expression_tree

    Όπως θα δεις και στο link τα φύλα είναι οι αριθμοί ή οι άγνωστοι που θα έχεις και οι ενδιάμεσοι κόμβοι είναι τα μαθηματικά σύμβολα.
    Το "=" αν φτιαχτεί σωστά το δέντρο θα πρέπει να είναι λογικά η ρίζα του δέντρου. Οπότε θα μπορείς να κοιτάς αριστερά της ρίζας πόσα "x" έχεις και το ίδιο και δεξιά να τα μεταφέρεις κάνωντας
    αντιστροφή προσήμου σε αυτά που βρίσκονται είτε αριστερά είτε δεξιά και κάνεις πρόσθεση και το ίδιο κάνεις και για τους αριθμούς.
    Αφού έχεις φτάσει στην μορφή αx = b τότε κάνεις την διαίρεση και βρίσκεις το αποτέλεσμα.
    Τελευταία επεξεργασία από το μέλος xcyanx : 29-08-13 στις 19:41.

  7. #7
    Εγγραφή
    02-11-2003
    Περιοχή
    Επαναπατρισθείς στην Αθήνα
    Ηλικία
    49
    Μηνύματα
    56.427
    Downloads
    64
    Uploads
    73
    Τύπος
    VDSL2
    Ταχύτητα
    102400/10240
    ISP
    Vodafone
    Path Level
    Fastpath
    Παράθεση Αρχικό μήνυμα από xcyanx Εμφάνιση μηνυμάτων
    Η πιο σωστή λύση πιστεύω είναι να χρησιμοποιήσεις expression tree για να αναλύσεις τις πράξεις με τη βοήθεια του δέντρου.
    http://en.wikipedia.org/wiki/Binary_expression_tree

    Όπως θα δεις και στο link τα φύλα είναι οι αριθμοί ή οι άγνωστοι που θα έχεις και οι ενδιάμεσοι κόμβοι είναι τα μαθηματικά σύμβολα.
    Το "=" αν φτιαχτεί σωστά το δέντρο θα πρέπει να είναι λογικά η ρίζα του δέντρου. Οπότε θα μπορείς να κοιτάς αριστερά της ρίζας πόσα "x" έχεις και το ίδιο και δεξιά να τα μεταφέρεις κάνωντας
    αντιστροφή προσήμου σε αυτά που βρίσκονται είτε αριστερά είτε δεξιά και κάνεις πρόσθεση και το ίδιο κάνεις και για τους αριθμούς.
    Αφού έχεις φτάσει στην μορφή αx = b τότε κάνεις την διαίρεση και βρίσκεις το αποτέλεσμα.
    Με δυαδικό δέντρο, δεν είναι και η σωστότερη / πλέον βελτιστοποιημένη προσέγγιση, γιατί δεν έχεις πάντα μόνο 2 operands πράξεων ίδιας προτεραιότητας (κι ας γίνονται πάντα οι πράξεις πάντα ανά 2 operands).

    π.χ. να 2 παραδείγματα όπου έχεις πάνω από 2 operands:

    2x+3x+5x
    2x*3x*5x

    Καλύτερη προσέγγιση θα είναι να ΜΗΝ είναι δυαδικό το δέντρο.

  8. #8
    Εγγραφή
    06-10-2008
    Ηλικία
    35
    Μηνύματα
    515
    Downloads
    2
    Uploads
    0
    Ταχύτητα
    6144/1024
    ISP
    HOL
    DSLAM
    Forthnet - ΑΓΙΟΥ ΓΕΩΡΓΙΟΥ
    Router
    WAG54G2 Linksys
    Path Level
    Interleaved
    Εγώ είπα για expression tree απλά το μόνο link που βρήκα ήταν για binary expression tree και για αυτό το postara.
    Μπορεί μια χαρά αν δει το binary να φτιάξει το αντίστοιχο μη-δυαδικό δέντρο μιας και θα ξέρει στο περίπου πως λειτουργεί.

    - - - Updated - - -

    Αν και κάπου είχα διαβάσει ότι τα expression trees είναι αναγκαστικά δυαδικά δέντρα.
    Μια photo απο το link Που έδωσα( http://en.wikipedia.org/wiki/Binary_expression_tree#Algebraic_expressions ) δείχνει δυαδικό δέντρο να
    μπορεί να αναπαραστήσει πράξεις με operators που δεν έχουν ίδια προτεραιότητα.

  9. #9
    Εγγραφή
    08-07-2006
    Μηνύματα
    3.212
    Downloads
    17
    Uploads
    0
    Τύπος
    ADSL2+
    stack θελεις
    διαβασε εδω να δεις πως το κανουνε τα πραγματικα προγραμματα http://www.calculator.org/rpn.aspx
    εχω φτιαξει τετοιο προγραμμα πολυ παλια που τα εκανε ολα εξισωσεις πραξεις κτλπ σε java και χρησιμοποιησα stacks + reverse polish notation απλο ειναι ..

    προσοχη να σου πω οτι αν κανεις τετοιο προγραμμα ΔΕΝ χρησιμοποιεις τις κλασικες πραξεις που ειναι build in στην γλωσσα δινουνε ΛΑΘΟΣ αποτελεσμα
    σε καποιες περιπτωσεις γιατι ενας 10δικος δεν μπορει να αναπαρασταθει σωστα εσωτερικα σε δυαδικη μορφη.
    Πρεπει να φτιαξεις ειδικη βιβλιοθηκη για αριθμους και πραξεις μεταξυ αυτων η να βρεις ετοιμη.
    Στην java υπαρχει ετοιμο αυτο στην python δεν ξερω.

    Γενικα να ξερεις οτι ο τροπος που γινονται οι πραξεις στον υπολογιστη δεν εχει σχεση με τον τροπο που γινονται στα κλασικα μαθηματικα
    υπαρχουνε αλλες προσεγγισεις λογω περιορισμων που βαζει το hardware
    Τελευταία επεξεργασία από το μέλος mpetou : 31-08-13 στις 02:26.

  10. #10
    Εγγραφή
    06-10-2008
    Ηλικία
    35
    Μηνύματα
    515
    Downloads
    2
    Uploads
    0
    Ταχύτητα
    6144/1024
    ISP
    HOL
    DSLAM
    Forthnet - ΑΓΙΟΥ ΓΕΩΡΓΙΟΥ
    Router
    WAG54G2 Linksys
    Path Level
    Interleaved
    Αυτό που λες όμως απευθύνεται σε calculators ενώ το παλικάρι θέλει ένα υποτυπώδες σύστημα για symbolic computation. Άλλο το πρόγραμμα να σου λύνει μια εξίσωση και άλλο να σου κάνει πράξεις για να βγάλει αποτέλεσμα.

  11. #11
    Εγγραφή
    08-07-2006
    Μηνύματα
    3.212
    Downloads
    17
    Uploads
    0
    Τύπος
    ADSL2+
    γιατι οι εξισωσεις δεν εχουνε παρενθεσεις πραξεις προτεραιότητες κτλπ ?

  12. #12
    Εγγραφή
    06-10-2008
    Ηλικία
    35
    Μηνύματα
    515
    Downloads
    2
    Uploads
    0
    Ταχύτητα
    6144/1024
    ISP
    HOL
    DSLAM
    Forthnet - ΑΓΙΟΥ ΓΕΩΡΓΙΟΥ
    Router
    WAG54G2 Linksys
    Path Level
    Interleaved
    Αν είχες π.χ. την πράξη 2+x μέσα στην stack σύμφωνα με το άρθρο που έκανες post θα έπρεπε για το + να κάνεις push στην stack δύο αριθμούς, δηλαδή το 2 και το x σε αυτή την περίπτωση.
    Αν τώρα κάνεις την πράξη 2+x εσωτερικά στο πρόγραμμα τι περιμένεις να σου δώσει σαν αποτέλεσμα? Ή μήπως περιμένεις ότι χρησιμοποιώντας stack ότι μπορείς να μεταφέρεις τόσο έυκολα τους αγνώστους απο την μία πλευρά και τους αριθμούς απο την άλλη? Και αν αργότερα θέλει για παράδειγμα(λίγο ακραίο ξέρω) να υλοποιήσει και παραγώγους ή κάτι ανάλογο με την stack πως ακριβώς θα το κάνει? Και στους μοναδιαίους τελεστές όπως είναι το παραγωντικό? Θα πρέπει να έχουμε μια συνάρτηση ελέγχου των τελεστών? Συν ότι με τα binary expression trees μπορείς να ορίσεις μια οποιαδήποτε μαθηματική λογική με τελεστές(βλέπε μαθηματική λογική) χωρίς πολύ κόπο. Τέσπα, επειδή κάθε θέμα τείνει να γίνει debate του πιο ξερόλα αυτό είναι το τελευταίο μου post στο συγκεκριμένο θέμα και ελπίζω ο OP να βρήκε μια άκρη.

  13. #13
    Εγγραφή
    08-07-2006
    Μηνύματα
    3.212
    Downloads
    17
    Uploads
    0
    Τύπος
    ADSL2+
    δεν εχεις 1 stack και κανεις ελεγχο του τι βαζεις μεσα. δεν χρειαζετε να βαλεις το χ

  14. #14
    Εγγραφή
    06-10-2008
    Ηλικία
    35
    Μηνύματα
    515
    Downloads
    2
    Uploads
    0
    Ταχύτητα
    6144/1024
    ISP
    HOL
    DSLAM
    Forthnet - ΑΓΙΟΥ ΓΕΩΡΓΙΟΥ
    Router
    WAG54G2 Linksys
    Path Level
    Interleaved
    Τι να σου πω...Απλά πιστεύω ότι η stack καλή είναι για calculators και όχι για αυτό που ζητάει ο OP. Γιατί μιας και έχει κάνει για 2βαθμια και 1βαθμια εξίσωση αργότερα θα θέλει να κάνει ίσως και για 3βάθμια που και πάλι γίνεται και με
    stack αλλά η λογική του προγράμματος θα είναι πιο περίπλοκη.

Παρόμοια Θέματα

  1. Πρόβλημα σε πρόγραμμα αλληλογραφίας POP Peeper
    Από petros07 στο φόρουμ Software γενικά
    Μηνύματα: 3
    Τελευταίο Μήνυμα: 08-05-13, 22:36
  2. Μηνύματα: 3
    Τελευταίο Μήνυμα: 12-04-13, 00:10
  3. Μηνύματα: 8
    Τελευταίο Μήνυμα: 16-10-12, 10:53
  4. Πρόβλημα "Τοπικός Προσαρμογέας Οθόνης VGA"
    Από Tsikos18 στο φόρουμ Κάρτες ήχου, γραφικών, ηχεία και οθόνες
    Μηνύματα: 8
    Τελευταίο Μήνυμα: 15-09-12, 17:56
  5. Μηνύματα: 25
    Τελευταίο Μήνυμα: 10-09-12, 23:02

Bookmarks

Bookmarks

Δικαιώματα - Επιλογές

  • Δεν μπορείτε να δημοσιεύσετε νέα θέματα
  • Δεν μπορείτε να δημοσιεύσετε νέα μηνύματα
  • Δεν μπορείτε να αναρτήσετε συνημμένα
  • Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας
  •  
  • Τα BB code είναι σε λειτουργία
  • Τα Smilies είναι σε λειτουργία
  • Το [IMG] είναι σε λειτουργία
  • Το [VIDEO] είναι σε λειτουργία
  • Το HTML είναι εκτός λειτουργίας