Υπολογισμός ρίζας σε C με την μέθοδο Newton-Raphson (Λύθηκε)  Το θέμα επιλύθηκε

...ασύγχρονα μαθήματα γλώσσας C

Υπολογισμός ρίζας σε C με την μέθοδο Newton-Raphson (Λύθηκε)

Δημοσίευσηαπό giannis_mathiou » 10 Δεκ 2011, 16:11

Καλησπέρα παιδιά, χρειάζομαι την βοήθειά σας. Πρέπει να κάνουμε ένα πρόγραμμα σε C που να υπολογίζει την τετραγωνική ρίζα ενός αριθμού με την μέθοδο Newton-Raphson.
Μας είπε ότι γίνεται Χj+1=1/2(Xj+a/Xj) μέχρι να είναι δύο διαδοχικά Χ ίσα. Δηλαδή για παράδειγμα η ρίζα του 4 είναι Xo=1, X1=1/2(1+1/4)=2,5 , X2=1/2(2,5+4/2,5)=2,05 ,X3=2, X4=4
Αυτό που έχω κάνει εγώ είναι το εξής:
Κώδικας: Επιλογή όλων
#include <stdio.h>

float sqNR(float);

int main(){
float num;


printf ("\nΠληκτρολογήστε τον αριθμό για να βρώ την τετραγωνική ρίζα.\n");
scanf ("%f",&num);

if (num>0)
printf ("\nΗ τετραγωνική ρίζα με την μέθοδο Newton-Raphson είναι ίση με: %.1f",sqNR(num));

else
printf ("\nΔεν υπολογίζεται η τετραγωνική ρίζα αρνητικού αριθμού.\n");

return 0;
}

float sqNR(float N){
float x=1,xn=1/2*(x+(N/x));
while (x!=xn){
x=xn;
xn=1/2*(x+(N/x));
}

return xn;
};

Περνάει από το compile κανονικά και μόλις δώσω τον αριθμό φαίνεται σαν να έχω σταματήσει να τρέχει και δεν κάνει τίποτα. Μπορείτε να μου πείτε τι κάνω λάθος; Και πως πρέπει να το κάνω;

Σας ευχαριστώ πολύ!
Τελευταία επεξεργασία από giannis_mathiou και 10 Δεκ 2011, 18:49, έχει επεξεργασθεί 1 φορά/ες συνολικά
προσωπική ιστοσελίδα
Γνώσεις ⇛ Linux: Αρχάριος ┃ Προγραμματισμός: Λίγο ┃ Αγγλικά: Καλά
Laptop
Spoiler: show
Λειτουργικό ⇛ Ubuntu 11.10 64bit σε Dell Inspiron N5110
Προδιαγραφές ⇛ 2410M │ 4GB │ NVIDIA GeForce GT 525M

Desktop
Spoiler: show
Λειτουργικό ⇛ Ubuntu 11.10 64bit
Προδιαγραφές ⇛Intel Core2Duo E6400 | 3,5GB RAM DDR2 533MHz | nVidia GT 220
giannis_mathiou
babeTUX
babeTUX
 
Δημοσιεύσεις: 23
Εγγραφή: 31 Μάιος 2011, 23:34
Τοποθεσία: Λάρισα
Εκτύπωση

Re: Υπολογισμός ρίζας σε C με την μέθοδο Newton-Raphson

Δημοσίευσηαπό Dimitris » 10 Δεκ 2011, 16:20

Βάλε μερικά printf σε διάφορα σημεία του προγράμματος να δεις που διακλαδίζεται, τι τιμές έχουν οι μεταβλητές.
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Υπολογισμός ρίζας σε C με την μέθοδο Newton-Raphson

Δημοσίευσηαπό giannis_mathiou » 10 Δεκ 2011, 16:44

Δηλαδή τι ακριβώς εννοείς; Που να βάλω; Μέσα στην συνάρτηση δεν μου τα εμφανίζει.
προσωπική ιστοσελίδα
Γνώσεις ⇛ Linux: Αρχάριος ┃ Προγραμματισμός: Λίγο ┃ Αγγλικά: Καλά
Laptop
Spoiler: show
Λειτουργικό ⇛ Ubuntu 11.10 64bit σε Dell Inspiron N5110
Προδιαγραφές ⇛ 2410M │ 4GB │ NVIDIA GeForce GT 525M

Desktop
Spoiler: show
Λειτουργικό ⇛ Ubuntu 11.10 64bit
Προδιαγραφές ⇛Intel Core2Duo E6400 | 3,5GB RAM DDR2 533MHz | nVidia GT 220
giannis_mathiou
babeTUX
babeTUX
 
Δημοσιεύσεις: 23
Εγγραφή: 31 Μάιος 2011, 23:34
Τοποθεσία: Λάρισα
Εκτύπωση

Re: Υπολογισμός ρίζας σε C με την μέθοδο Newton-Raphson

Δημοσίευσηαπό Dimitris » 10 Δεκ 2011, 16:48

Αφου δεν εμφανίζει ένα printf στην αρχή της sqNR τι μπορεί να σημαίνει αυτό; Αν βάλεις ένα printf μέσα στο while τι θα δείχνει;

edit: Βασικά διάβασε ξανά τη βασική θεωρία αριθμητικών μεθόδων. Δηλαδή πότε συγκλίνει μια αριθμητική μέθοδος; Πότε σταματάει; Ποιά κριτήρια τα κριτηρία τερματισμού; Μπορεί να ικανοποιηθεί ένα κριτήριο τερματισμού; Μήπως να προσθέσουμε κι ένα δεύτερο για να είμαστε σίγουροι ότι θα τερματίσει ο αλγόριθμος;
Τελευταία επεξεργασία από Dimitris και 10 Δεκ 2011, 16:54, έχει επεξεργασθεί 1 φορά/ες συνολικά
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Υπολογισμός ρίζας σε C με την μέθοδο Newton-Raphson

Δημοσίευσηαπό giannis_mathiou » 10 Δεκ 2011, 16:52

Το ότι δεν καλείται σωστά η συνάρτηση ή ότι δεν παίρνει τιμές από την main;

Edit: Θα πρέπει να βάλω αν είναι έναν μετρητή για τα loops την συνάρτησης να τερματίζεται στα 100 ας πούμε;
Τελευταία επεξεργασία από giannis_mathiou και 10 Δεκ 2011, 16:57, έχει επεξεργασθεί 1 φορά/ες συνολικά
προσωπική ιστοσελίδα
Γνώσεις ⇛ Linux: Αρχάριος ┃ Προγραμματισμός: Λίγο ┃ Αγγλικά: Καλά
Laptop
Spoiler: show
Λειτουργικό ⇛ Ubuntu 11.10 64bit σε Dell Inspiron N5110
Προδιαγραφές ⇛ 2410M │ 4GB │ NVIDIA GeForce GT 525M

Desktop
Spoiler: show
Λειτουργικό ⇛ Ubuntu 11.10 64bit
Προδιαγραφές ⇛Intel Core2Duo E6400 | 3,5GB RAM DDR2 533MHz | nVidia GT 220
giannis_mathiou
babeTUX
babeTUX
 
Δημοσιεύσεις: 23
Εγγραφή: 31 Μάιος 2011, 23:34
Τοποθεσία: Λάρισα
Εκτύπωση

Re: Υπολογισμός ρίζας σε C με την μέθοδο Newton-Raphson

Δημοσίευσηαπό Dimitris » 10 Δεκ 2011, 16:56

Για να το κάνω πιο απλό τι σημαίνει ισότητα στους floating point numbers;
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Υπολογισμός ρίζας σε C με την μέθοδο Newton-Raphson

Δημοσίευσηαπό giannis_mathiou » 10 Δεκ 2011, 17:01

Δύσκολο, σχεδόν αδύνατο να είναι ίσοι γιατί υπάρχουν πολλά δεκαδικά; Άρα πρέπει να περιορίσω τα δεκαδικά ή να του θεωρήσω ακεραίους;
προσωπική ιστοσελίδα
Γνώσεις ⇛ Linux: Αρχάριος ┃ Προγραμματισμός: Λίγο ┃ Αγγλικά: Καλά
Laptop
Spoiler: show
Λειτουργικό ⇛ Ubuntu 11.10 64bit σε Dell Inspiron N5110
Προδιαγραφές ⇛ 2410M │ 4GB │ NVIDIA GeForce GT 525M

Desktop
Spoiler: show
Λειτουργικό ⇛ Ubuntu 11.10 64bit
Προδιαγραφές ⇛Intel Core2Duo E6400 | 3,5GB RAM DDR2 533MHz | nVidia GT 220
giannis_mathiou
babeTUX
babeTUX
 
Δημοσιεύσεις: 23
Εγγραφή: 31 Μάιος 2011, 23:34
Τοποθεσία: Λάρισα
Εκτύπωση

Re: Υπολογισμός ρίζας σε C με την μέθοδο Newton-Raphson

Δημοσίευσηαπό simosx » 10 Δεκ 2011, 17:04

giannis_mathiou έγραψε:Το ότι δεν καλείται σωστά η συνάρτηση ή ότι δεν παίρνει τιμές από την main;

Edit: Θα πρέπει να βάλω αν είναι έναν μετρητή για τα loops την συνάρτησης να τερματίζεται στα 100 ας πούμε;


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

Είναι σημαντικό να μπεις σε αυτήν τη διαδικασία όπου είσαι σε θέση να καταλάβεις πλήρως το πρόγραμμα, αντί να περιμένεις να «παίξει» από μόνο του. Πρέπει να είσαι σε θέση να κάνεις αλλαγές/προσθήκες, να δοκιμάζεις τι αποτέλεσμα έχουν, και πάλι από την αρχή. Αν δε μπεις στη διαδικασία αυτή (όπου για τώρα μπορεί να σου πάρει αρκετό χρόνο), τότε θα δυσκολευτείς πάρα πολύ στο μέλλον.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Υπολογισμός ρίζας σε C με την μέθοδο Newton-Raphson

Δημοσίευσηαπό simosx » 10 Δεκ 2011, 17:05

giannis_mathiou έγραψε:Δύσκολο, σχεδόν αδύνατο να είναι ίσοι γιατί υπάρχουν πολλά δεκαδικά; Άρα πρέπει να περιορίσω τα δεκαδικά ή να του θεωρήσω ακεραίους;


Δοκίμασε και το ένα, και το άλλο.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Υπολογισμός ρίζας σε C με την μέθοδο Newton-Raphson

Δημοσίευσηαπό giannis_mathiou » 10 Δεκ 2011, 17:15

Λοιπόν δοκίμασα με ακεραίους και τρέχει αλλά δεν βγάζει σωστό αποτέλεσμα. Δηλαδή συνέχεια 0 ή -nan. Όπότε λείπει κάτι άλλο πρίν.

Edit: Με αυτή την αλλαγή
Κώδικας: Επιλογή όλων
float sqNR(float N){
float x=1,xn=0;
int i=0;

while (x!=xn){
xn=x+(N/x)/2;
x=xn;
i++;
printf ("\t%.1f\t%.1f %10d\n\n",xn,x,i);
}

return xn;
};

μου βγάζει το εξής:
Πληκτρολογήστε τον αριθμό για να βρώ την τετραγωνική ρίζα.
4
3.0 3.0 1


Η τετραγωνική ρίζα με την μέθοδο Newton-Raphson είναι: 3.0
προσωπική ιστοσελίδα
Γνώσεις ⇛ Linux: Αρχάριος ┃ Προγραμματισμός: Λίγο ┃ Αγγλικά: Καλά
Laptop
Spoiler: show
Λειτουργικό ⇛ Ubuntu 11.10 64bit σε Dell Inspiron N5110
Προδιαγραφές ⇛ 2410M │ 4GB │ NVIDIA GeForce GT 525M

Desktop
Spoiler: show
Λειτουργικό ⇛ Ubuntu 11.10 64bit
Προδιαγραφές ⇛Intel Core2Duo E6400 | 3,5GB RAM DDR2 533MHz | nVidia GT 220
giannis_mathiou
babeTUX
babeTUX
 
Δημοσιεύσεις: 23
Εγγραφή: 31 Μάιος 2011, 23:34
Τοποθεσία: Λάρισα
Εκτύπωση

Επόμενο

Επιστροφή στο Μαθήματα C

cron