wSanAndreas Δημοσ. 25 Οκτωβρίου 2011 Δημοσ. 25 Οκτωβρίου 2011 (επεξεργασμένο) Σύμφωνα με την θεωρία του MacLaurin ο τύπος για να βρούμε το συνημίτονο είναι: 1 - 1^2/2! + 1^4/4! - 1^6/6! ... 1^ν/ν! http://en.wikipedia.org/wiki/Taylor_series το προσπάθησα αρκετά αλλά δεν βρήκα άκρη > for i=1:2:n % με βήμα 2 oros = -oros *1*i /(2*i*(2*i)); sum = sum + oros; end αν μπορεί κάποιος που ξέρει και μαθηματικά να με βοηθήσει θα το εκτιμούσα. εδώ πάντως έχω το Script για το ημίτονο > function sum = my_sin(a, sum = a; a2 = a*a; t = a; for i= 1:b t = -t *a2 /(2*i*(2*i+1)); sum = sum + t; end Επεξ/σία 25 Οκτωβρίου 2011 από wSanAndreas
V.I.Smirnov Δημοσ. 25 Οκτωβρίου 2011 Δημοσ. 25 Οκτωβρίου 2011 Nα σε βοηθήσω εγώ. Δεν υπάρχει καμιά δυσκολία, απλώς εφαρμόζεις τον τύπο. H ακτίνα σύγκλισης της σειράς είναι όλο το R, ωστόσο για μεγάλα x μπορεί ο υπολογισμός να παρουσιάσει υπολογιστικά σφάλματα. Το παρακάτω προγραμματάκι σε fotran είναι πολύ εύκολο να το καταλάβεις και να το μετατρέψεις σε matlab. >program Cos implicit none integer::i, j, numTerms, sgn, nParagontiko real:, term, valueCos x=0.7 ! value in radians to compute its cos numTerms=5 ! number of terms in series valueCos=1. ; sgn=1 do i=1,numTerms-1 nParagontiko=1 do j=1,2*i nParagontiko = nParagontiko*j end do sgn = sgn*(-1) term = x**(2*i)/nParagontiko valueCos = valueCos + sgn*term end do write (*,*) valueCos end program Παρεμπιπτόντως, η χρήση σειρών taylor είναι αργός τρόπος και πρέπει όσο το δυνατόν να αποφεύγεται. Η σχέση cos(x) = 1 − 0.49670*x^2 + 0.03705*x^4 είναι περίπου 4.5 φορές γοργότερη από τον κοινό υπολογισμό του cosx και έχει μέγιστο απόλυτο σφάλμα μικρότερο του 1.2Ε-3 Αν ζητείται μεγαλύτερη ακρίβεια, μπορεί να εφαρμοστεί η cos(x) = 1 − 0.4999999963*x^2 + 0.0416666418*x^4 − 0.0013888397*x^6 + 0.0000247609*x^8 − 0.0000002605*x^10 Αυτή έχει μέγιστο απόλυτο σφάλμα μικρότερο του 6.5Ε-9 και είναι περίπου 2.8 φορές ταχύτερη από το απλό cosx. Στις σχέσεις αυτές το x πρέπει να ανήκει στο [0,pi/2]. Σε όλες τις παραπάνω σχέσεις και σειρές οι τιμές του x είναι σε ακτίνια. -
wSanAndreas Δημοσ. 25 Οκτωβρίου 2011 Μέλος Δημοσ. 25 Οκτωβρίου 2011 (επεξεργασμένο) θα το προτιμούσα σε MATLAB και με for, ευχαριστώ πάντως. damn, μερικές φορές ψάχνοντας κάτι σύνθετο ξεχνάς και τα βασικά ;p πάει ως εξής, ι=1 (2*i-1)*(2*i) = (2*1-1) *(2*1) = 1 * 2 ι=2 (2*i-1)*(2*i) = (2*2-1) *(2*2) = 3 * 4 ι=3 (2*i-1)*(2*i) = (2*3-1) *(2*3) = 5 * 6 ή με βήμα 2 ι=2 (ι-1)* ι = (2-1) * 2 = 1 * 2 ι=4 (ι-1)* ι = (4-1) * 4 = 3 * 4 για βήμα 1 > oros = -oros *x*x / ((2*i-1)*(2*i)); για βήμα 2 > oros = -oros *x*x / ((ι-1)*ι); ΥΓ: σχετικά με την ταχύτητα είχαμε κάνει μερικά παραδείγματα, και στα αλήθεια "έμεινα" κάγκελο, εμμ αμα έχουμε το μυαλό στο wow και στο facebook ξεχνάμε να σκεφτόμαστε πολύ απλές μαθηματικές τεχνικές και κάνεις το πρόγραμμα τα πετάει Ενας απλός τρόπος ο οποίος άμα δώσεις μεγάλες τιμές θα σου κολλήσει το MATLAB > function sum = exp(n) sum = 1; for i = 1:n sum = sum + i /factorial(i); end ένας ταχύτερος τρόπος > function sum = exp(n) sum = 1; fact = 1; for i = 1:n fact = fact*i; sum = sum + i/fact; end Επεξ/σία 26 Οκτωβρίου 2011 από wSanAndreas
V.I.Smirnov Δημοσ. 26 Οκτωβρίου 2011 Δημοσ. 26 Οκτωβρίου 2011 Μήπως το matlab κολλάει λόγω του factorial ; To Mathematica 7 δεν καταλαβαίνει τίποτε, του έδωσα 50000! και το βρήκε σε λιγότερο από 1 sec. Aν θέλεις τέτοιες μεγάλες τιμές για το παραγοντικό, μπορείς να χρησιμοποιήσεις τον προσεγγιστικό τύπο του Stirling. -
wSanAndreas Δημοσ. 26 Οκτωβρίου 2011 Μέλος Δημοσ. 26 Οκτωβρίου 2011 Μήπως το matlab κολλάει λόγω του factorial ; To Mathematica 7 δεν καταλαβαίνει τίποτε, του έδωσα 50000! και το βρήκε σε λιγότερο από 1 sec. Aν θέλεις τέτοιες μεγάλες τιμές για το παραγοντικό, μπορείς να χρησιμοποιήσεις τον προσεγγιστικό τύπο του Stirling. - το Mathematica ειναι απο την ιδια εταιρεια ε? αλλα ειναι ποιο ελαφρυ? αν και το εχουμε και αυτο... δεν το εχω ανοιξει να το δω ... παντως στην παραπανω περιπτωση ειναι η απαντηση σε αυτους που λενε "Ειμαστε τμημα πληροφορικης γιατι να εχουμε 6-7 μαθηματα που εχουν να κανουν με μαθηματικα.. ελεος δλδ" ειδες μαθαινεις να προγραμματιζεις εξυπνα ;pp
V.I.Smirnov Δημοσ. 26 Οκτωβρίου 2011 Δημοσ. 26 Οκτωβρίου 2011 To Mathematica δεν είναι από την ίδια εταιρία που έγραψε το Matlab, καμία σχέση. Είναι γενικά ανώτερο (ενίοτε και πολύ ανώτερο) από το Μatlab σε πολλά πράγματα αλλά και αρκετά πιο δύσχρηστο και δύσκολο στην εκμάθηση - τουλάχιστον για τον αρχάριο. Αν έχεις συνηθίσει στο Μatlab, το Mathematica δεν θα σου αρέσει ή θα ξενίσει. Π.χ. το προγραμματιστικό στυλ του Matlab είναι κυρίως διαδικαστικό, κάτι σαν higher level fortran. Αντίθετα, το προγραμματιστικό ύφος του Mathematica έχει ιδιομορφίες αλλά προχωρά πολύ περισσότερο : επιτρέπει διαδικαστικό, αντικειμενοστρεφή, συναρτησιακό, rule based προγραμματισμό και συνδυασμό αυτών. Ωστόσο, οι εντυπωσιακές συμβολικές δυνατότητες του Mathematica απαιτούν εξοικοίωση που δεν έχουν οι συνήθεις χρήστες. -
Timonkaipumpa Δημοσ. 26 Οκτωβρίου 2011 Δημοσ. 26 Οκτωβρίου 2011 @wSanAndreas α) Με χρήση του sum ως όρισμα μπερδεύεις ΠΟΛΥ τα πράγματα. Είναι κάκιστη τακτική σε MATLAB. β) Το αυτό με την χρήση του exp ως όρισμα. γ) Δεν κάνεις, εν γένει, σωστή χρήση των μεθόδων του MATLAB. Με άλλα λόγια, το ότι αργεί, εάν αργεί, το MATLAB είναι θέμα κακού χειρισμού σου και όχι του MATLAB.
tmjuju Δημοσ. 26 Οκτωβρίου 2011 Δημοσ. 26 Οκτωβρίου 2011 Nα σε βοηθήσω εγώ. Δεν υπάρχει καμιά δυσκολία, απλώς εφαρμόζεις τον τύπο. H ακτίνα σύγκλισης της σειράς είναι όλο το R, ωστόσο για μεγάλα x μπορεί ο υπολογισμός να παρουσιάσει υπολογιστικά σφάλματα. Το παρακάτω προγραμματάκι σε fotran είναι πολύ εύκολο να το καταλάβεις και να το μετατρέψεις σε matlab. >program Cos implicit none integer::i, j, numTerms, sgn, nParagontiko real:, term, valueCos x=0.7 ! value in radians to compute its cos numTerms=5 ! number of terms in series valueCos=1. ; sgn=1 do i=1,numTerms-1 nParagontiko=1 do j=1,2*i nParagontiko = nParagontiko*j end do sgn = sgn*(-1) term = x**(2*i)/nParagontiko valueCos = valueCos + sgn*term end do write (*,*) valueCos end program Παρεμπιπτόντως, η χρήση σειρών taylor είναι αργός τρόπος και πρέπει όσο το δυνατόν να αποφεύγεται. Η σχέση cos(x) = 1 − 0.49670*x^2 + 0.03705*x^4 είναι περίπου 4.5 φορές γοργότερη από τον κοινό υπολογισμό του cosx και έχει μέγιστο απόλυτο σφάλμα μικρότερο του 1.2Ε-3 Αν ζητείται μεγαλύτερη ακρίβεια, μπορεί να εφαρμοστεί η cos(x) = 1 − 0.4999999963*x^2 + 0.0416666418*x^4 − 0.0013888397*x^6 + 0.0000247609*x^8 − 0.0000002605*x^10 Αυτή έχει μέγιστο απόλυτο σφάλμα μικρότερο του 6.5Ε-9 και είναι περίπου 2.8 φορές ταχύτερη από το απλό cosx. Στις σχέσεις αυτές το x πρέπει να ανήκει στο [0,pi/2]. Σε όλες τις παραπάνω σχέσεις και σειρές οι τιμές του x είναι σε ακτίνια. - nice post! και τα λοιπά Post σου!
Dr.Fuzzy Δημοσ. 26 Οκτωβρίου 2011 Δημοσ. 26 Οκτωβρίου 2011 θα το προτιμούσα σε MATLAB και με for, ευχαριστώ πάντως./quote] Στο MATLAB τα for-loops πρέπει να αποφεύγονται, καθυστερούν πάρα πολύ! Γράψε τον κώδικα σε vectorised μορφή χωρίς for-loops και τρέχτο να δεις πόσο σημαντικά πιο γρήγορο θα είναι.
DuckJump Δημοσ. 26 Οκτωβρίου 2011 Δημοσ. 26 Οκτωβρίου 2011 λοιπον επειδη αυτο που ζητας ειναι εργασια και ευκολη ! θα σου δοσω το εξης μερος κωδικα. for i=2:2:n timi=-timi; paranomastis=(((i-1)*i*paranomastis)); sum=((x^i)/paranomastis)*timi+sum; end θα πρεπει να δεις πως αρχικοποιουντε τα sum kai timi kai paranomastis δεν σου δινω ολων τον κωδικα γιατι δεν θα κατσεις να ασχοληθεις και δεν θα καταλαβεις τιποτα.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα