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

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

Δημοσ. (επεξεργασμένο)

Σύμφωνα με την θεωρία του 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

Επεξ/σία από wSanAndreas
Δημοσ.

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 είναι σε ακτίνια.

 

-

Δημοσ. (επεξεργασμένο)

θα το προτιμούσα σε 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 ξεχνάμε να σκεφτόμαστε :P

 

πολύ απλές μαθηματικές τεχνικές και κάνεις το πρόγραμμα τα πετάει :)

 

Ενας απλός τρόπος ο οποίος άμα δώσεις μεγάλες τιμές θα σου κολλήσει το 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

Επεξ/σία από wSanAndreas
Δημοσ.

Μήπως το matlab κολλάει λόγω του factorial ;

To Mathematica 7 δεν καταλαβαίνει τίποτε, του έδωσα 50000! και το βρήκε σε λιγότερο από 1 sec.

 

Aν θέλεις τέτοιες μεγάλες τιμές για το παραγοντικό, μπορείς να χρησιμοποιήσεις τον προσεγγιστικό τύπο του Stirling.

 

-

Δημοσ.

Μήπως το matlab κολλάει λόγω του factorial ;

To Mathematica 7 δεν καταλαβαίνει τίποτε, του έδωσα 50000! και το βρήκε σε λιγότερο από 1 sec.

 

Aν θέλεις τέτοιες μεγάλες τιμές για το παραγοντικό, μπορείς να χρησιμοποιήσεις τον προσεγγιστικό τύπο του Stirling.

 

-

το Mathematica ειναι απο την ιδια εταιρεια ε? αλλα ειναι ποιο ελαφρυ? αν και το εχουμε και αυτο... δεν το εχω ανοιξει να το δω ...

 

παντως στην παραπανω περιπτωση ειναι η απαντηση σε αυτους που λενε

"Ειμαστε τμημα πληροφορικης γιατι να εχουμε 6-7 μαθηματα που εχουν να κανουν με μαθηματικα.. ελεος δλδ"

 

ειδες :P μαθαινεις να προγραμματιζεις εξυπνα ;pp

Δημοσ.

To Mathematica δεν είναι από την ίδια εταιρία που έγραψε το Matlab, καμία σχέση.

 

Είναι γενικά ανώτερο (ενίοτε και πολύ ανώτερο) από το Μatlab σε πολλά πράγματα αλλά

και αρκετά πιο δύσχρηστο και δύσκολο στην εκμάθηση - τουλάχιστον για τον αρχάριο.

Αν έχεις συνηθίσει στο Μatlab, το Mathematica δεν θα σου αρέσει ή θα ξενίσει.

 

Π.χ. το προγραμματιστικό στυλ του Matlab είναι κυρίως διαδικαστικό, κάτι σαν higher level fortran.

Αντίθετα, το προγραμματιστικό ύφος του Mathematica έχει ιδιομορφίες αλλά προχωρά πολύ περισσότερο :

επιτρέπει διαδικαστικό, αντικειμενοστρεφή, συναρτησιακό, rule based προγραμματισμό και συνδυασμό αυτών.

 

Ωστόσο, οι εντυπωσιακές συμβολικές δυνατότητες του Mathematica απαιτούν εξοικοίωση που δεν έχουν οι συνήθεις χρήστες.

 

-

Δημοσ.

@wSanAndreas

 

 

α) Με χρήση του sum ως όρισμα μπερδεύεις ΠΟΛΥ τα πράγματα. Είναι κάκιστη τακτική σε MATLAB.

 

β) Το αυτό με την χρήση του exp ως όρισμα.

 

γ) Δεν κάνεις, εν γένει, σωστή χρήση των μεθόδων του MATLAB. Με άλλα λόγια, το ότι αργεί, εάν αργεί, το MATLAB είναι θέμα κακού χειρισμού σου και όχι του MATLAB.

Δημοσ.

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 σου!

Δημοσ.

θα το προτιμούσα σε MATLAB και με for, ευχαριστώ πάντως./quote]

 

Στο MATLAB τα for-loops πρέπει να αποφεύγονται, καθυστερούν πάρα πολύ!

Γράψε τον κώδικα σε vectorised μορφή χωρίς for-loops και τρέχτο να δεις πόσο σημαντικά πιο γρήγορο θα είναι.

Δημοσ.

λοιπον επειδη αυτο που ζητας ειναι εργασια και ευκολη ! θα σου δοσω το εξης μερος κωδικα.

 

for i=2:2:n

timi=-timi;

paranomastis=(((i-1)*i*paranomastis));

sum=((x^i)/paranomastis)*timi+sum;

end

 

θα πρεπει να δεις πως αρχικοποιουντε τα sum kai timi kai paranomastis δεν σου δινω ολων τον κωδικα γιατι

 

δεν θα κατσεις να ασχοληθεις και δεν θα καταλαβεις τιποτα.

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

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

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

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

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

Σύνδεση

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

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