fortran

Γενικά θέματα για τις γλώσσες προγραμματισμού που δεν καλύπτονται από τις άλλες περιοχές της κατηγορίας.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
NTINAaa
Δημοσιεύσεις: 21
Εγγραφή: 16 Μαρ 2009 00:25

fortran

Δημοσίευση από NTINAaa » 04 Απρ 2009 02:18

paidia kserei kaneis apo fortran
an mporei as me boithisei giati exw kollisei


[Να υπολογιστεί η συνάρτηση f(x)=ex με τους εξής τρόπους:
Α) Μέσω της συνάρτησης exp
Β) Προσεγγιστικά μέσω της σειράς Maclaurin όπου: 0!vxxevν∞==Σ
Κατά τον υπολογισμό με συνάρτηση exp θα ζητείται μόνο το x.
Για τον υπολογισμό μέσω σειράς Maclaurin πρέπει να προσδιοριστούν πόσοι όροι της σειράς είναι απαραίτητο να ληφθούν σύμφωνα με μια δεδομένη ακρίβεια, αφού δεν μπορούμε να υπολογίσουμε το άθροισμα απείρων όρων. Γι’ αυτό υπολογίζουμε άθροισμα με έναν πρώτο όρο με δύο κ.ο.κ. όπως φαίνεται στο παρακάτω παράδειγμα:

s1=x^0/0!
s2=x^0/0!+x^1/1!
...
sn-1=x^0/0!+x^1/1!+...+x^(n-2)/(n-2)!
sn-1=x^0/0!+x^1/1!+...+x^(n-2)/(n-2)+x^(n-2)/(n-2)

Κάθε φορά ελέγχουμε αν ισχύει το κριτήριο διακοπής: |sn-sn-1|≤,e όπου sn και sn-1 είναι το άθροισμα με n και n-1 πρώτους όρους αντίστοιχα και e η ακρίβεια προσέγγισης. Η τιμή ex θα είναι η τιμή του αθροίσματος Sn για την οποία έχει ικανοποιηθεί το κριτήριο διακοπής
Σε κάθε περίπτωση υπολογισμού μέσω σειράς Maclaurin θα ζητείται η ακρίβεια προσέγγισης ε και το x, ενώ εκτός από την τιμή του ex θα υπολογίζεται και το πλήθος των επαναλήψεων.
Δοκιμή: α) e10 και ε=10-4, β) e5 και ε=10-4
[/code]


program expx
implicit none
integer::epilogi
real::xexp,seira,res,e ,x
write(*,*)'give 1 or to 2'
write (*,*) '1:me synartisi exp'
write (*,* ) '2:me seira maclaurin'
read(*,*) epilogi
select case (epilogi)
case (1)
write (*,*) 'give one number'
read(*,*), x
res=exp(x)
write (*,*)'the result is ',res
case(2)
write (*,*) 'give two numbers'
read(*,*) x,e
res=seira(x,e)
write (*,*)'the result is ' ,res
case default
write (*,*)'you give wrong number'
end select
end program expx

real function seira(x,e)
integer:: p,d,i,j
real::sum1,sum2,e,x,noros,poros
sum1=1
i=1
poros=1
noros=1
p=1
d=1
do while (abs(noros -poros )<=0.0001)
i=i+1
do j=1,(i-1)
p=p*j
d=x**(i-1)
end do
sum2=sum1+d/p
poros=sum1
noros=sum2
write(*,*)'to plithos ton epanalipseon einai',i
enddo
seira=sum2
end

Άβαταρ μέλους
DGeorge
Honorary Member
Δημοσιεύσεις: 3753
Εγγραφή: 13 Σεπ 2007 12:59
Τοποθεσία: Καλλιθέα Γενικώς

fortran

Δημοσίευση από DGeorge » 29 Μάιος 2009 16:07

Αν το θέμα σου ισχύει ακόμα, θα ήθελα να καταλάβω: Πού είναι το πρόβλημά σου;
Μετά: Μάθε να σπας -όσο γίνεται- τον κώδικά σου σε περισσότερες υπορουτίνες/functions. Π.χ. κάνε μετά από κάθε Case(1), (2) κλπ, function1(), 2(), κλπ. Έτσι θα σου μειωθούν δραστικά οι γραμμές του 'program expx'. Ακόμα-ακόμα και αυτήν την ανάγνωση δεδομένων, μπορείς να την κάνεις υπορουτίνα/function. Και στο τέλος, αφού βεβαιωθείς ότι καθεμία λειτουργεί μοναχή της, τις δένεις με ένα ψιλο-βλαμμένο Program το οποίο έχει μόνη δουλειά να καλέσει όλες τις functions (από αυτήν της ανάγνωσης/εισαγωγής δεδομένων, μέχρι την τελευταία που θα τα εμφανίσει σε οθόνη/εκτυπωτή κι ό,τι άλλο θέλεις!)
Θα μπορείς ακόμα, κάνοντας μία -προς μία- την κάθε Function αυτόνομο Program, να την ελέγχεις Αν και Κατά Πόσον λειτουργεί :wink: :wink:

Επίσης, -έτσι όπως το έχεις γράψει- στο Loop:

Κώδικας: Επιλογή όλων

..............................................
do while &#40;abs&#40;noros -poros &#41;<=0.0001&#41;
i=i+1
do j=1,&#40;i-1&#41;
p=p*j
d=x**&#40;i-1&#41;
end do
sum2=sum1+d/p
poros=sum1
noros=sum2
write&#40;*,*&#41;'to plithos ton epanalipseon einai',i
enddo
seira=sum2
end
Έχεις κρατήσει δυό θέσεις μνήμης (sum1) & (sum2), όπως έχεις γράψει και δυό γραμμές κώδικα άχρηστες:
Θα μπορούσε να ήταν π.χ.:

Κώδικας: Επιλογή όλων

..............................................
do while &#40;abs&#40;noros -poros &#41;<=0.0001&#41;
i=i+1
do j=1,&#40;i-1&#41;
p=p*j
d=x**&#40;i-1&#41;
end do
noros=poros+d/p ---------Μία στη θέση των τριών πιο κάτω!!!
----------------------Άχρηστα-----------------
sum2=sum1+d/p
poros=sum1
noros=sum2
----------------------Άχρηστα-----------------
write&#40;*,*&#41;'to plithos ton epanalipseon einai',i
enddo
seira=noros---Προσοχή σ'αυτή τη διαμόρφωση!!!
end
Αν κάτσεις λίγο και το δεις, θα δεις άσκοπη-τελείως κλήση/δέσμευση μνημών 'sum1' και 'sum2'.
Η άσκοπη κλήση/δέσμευση μνημών, όσο κι οι άχρηστες-περιττές γραμμές στον κώδικα, μπορεί να φαίνονται -κατ'αρχήν- γελοίες και ανάξιες λόγου, για πολύ μικρά Loops και PC με τεράστιες μνήμες. Όμως Αν τα Loops γίνονται μεγαλούτσικα, οι χρόνοι 'τρεξίματος' αρχίζουν να παρουσιάζουν "μετρήσιμες" διαφορές.

Μετά λέμε/αναρωτιώματε π.χ. γιατί Σέρνεται το PC, ή γιατί "κράσσαρε" στα καλά καθούμενα :question: :think: :think: :question:

Επίσης στο κριτήριο: "while (abs(noros -poros )<=0.0001)" μήπως θά'πρεπε να γράψεις: while (abs(noros -poros )<=e);;;......
......Αφού μάλλον το "<=e" είναι το κριτήριο διακοπής, κι όχι το αυθαίρετο "<=0.0001" που μπήκε στο Loop :wink:
PC-Ponemenos
Εικόνα

Απάντηση

Επιστροφή στο “γλώσσες προγραμματισμού - γενικά”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες