newton-raphson method , δε μου κάνει το loop

Συζητήσεις για την γλώσσα C και C++

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

Απάντηση
ggeo1
Δημοσιεύσεις: 16
Εγγραφή: 08 Νοέμ 2006 18:24

newton-raphson method , δε μου κάνει το loop

Δημοσίευση από ggeo1 » 29 Νοέμ 2010 17:20

Καλησπέρα σας,

Έχω μια συνάρτηση και θέλω να βρω τις ρίζες της με τη μέθοδο newton-raphson

newton _wiki

newton

To πρόβλημα είναι πως κατα την εκτέλεση του προγράμματος δεν κάνει το loop,ούτε και βγάζει το σωστό αποτέλεσμα.
The function f(x1)= -0.738487
The function f'(x1)= 0.671959

The root is : 2.07353e-317 and the number of iterations was :0
Ο κώδικας είναι :

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

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>



using namespace std;

double function&#40;double&#41;; // declare of function
double fderivative&#40;double&#41;;//declare of function
double error=10.0;//initial value to error in order to compare with tolerance
double eps=1e-6; //my error tolerance

int main&#40;&#41;
&#123;

    double x1,x2,f1,f2,fd1,error;

    cout << "Give x1 , x&#40;-4,-3&#41; &#58; "<<endl;
    cin >>x1;

    int i=0;

   f1=function&#40;x1&#41;;
   f2=function&#40;x2&#41;;
   fd1=fderivative&#40;x1&#41;;


   cout << "The function f&#40;x1&#41;= " << f1 << endl;
   cout << "The function f'&#40;x1&#41;= " << fd1 <<endl;


    while &#40;&#40;error>eps&#41; && &#40;fabs&#40;fd1&#41;>eps&#41; && &#40;fabs&#40;f1&#41;>eps&#41;&#41; //fd1 and f1 must be !=0

     &#123;

         x2=x1 - &#40;f1/fd1&#41;;
         x1=x2;

         error = fabs&#40;&#40;x1-x2&#41;/x1&#41;; //relative error
         i++;

        cout << "\n f&#40;x2&#41; is &#58; " << f2 << "\t and the root is &#58; " << x2<<endl;

     &#125;

     cout << "\nThe root is &#58; " <<x2 <<"\tand the number of iterations was &#58;" << i <<endl;


   return 0;
&#125;

    double function&#40;double x&#41;
    &#123;
        double y;
        y =exp&#40;x&#41;-sin&#40;x&#41;;
        return y;
    &#125;


double fderivative&#40;double x&#41;
&#123;
    double y;
    y=exp&#40;x&#41;-cos&#40;x&#41;;
    return y;
&#125;



Καμιά ιδέα γιατί θα τρελαθώ!Το παλεύω μέρες με αυτές τις μεθόδους!

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

newton-raphson method , δε μου κάνει το loop

Δημοσίευση από virxen75 » 29 Νοέμ 2010 22:49

εμένα πάντως έτσι ο κώδικας μου φαίνεται καλύτερος
όσο για τα αποτελέσματα ψάξε το εσύ και πες μου

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

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>



using namespace std;

double function&#40;double&#41;; // declare of function
double fderivative&#40;double&#41;;//declare of function
double error=10.0;//initial value to error in order to compare with tolerance
double eps=1e-6; //my error tolerance

int main&#40;&#41;&#123;
    double x1,x2,f1,f2,fd1,error=1;
    cout << "Give x1 , x&#40;-4,-3&#41; &#58; ";
    cin >>x1;getchar&#40;&#41;;
    int i=0,finish=1;

    while &#40;error>eps&#41;&#123; 
        f1=function&#40;x1&#41;;
        fd1=fderivative&#40;x1&#41;;
        if &#40;fd1==0 || f1==0&#41;&#123;//fd1 and f1 must be !=0
            finish=0;
            break;
        &#125;
        x2=x1 - &#40;f1/fd1&#41;;
        f2=function&#40;x2&#41;;  
        error = fabs&#40;x1-x2&#41;; //error
        i++;
        cout<<"iteration no "<<i<<endl;
        cout <<"f&#40;x1&#41; is &#58;"<<f1<<"\t and the fd1 is &#58;"<<fd1<<endl;
        cout << "f&#40;x2&#41; is &#58; " << f2 << "\t and the root is &#58; " << x2<<endl;
        cout <<"error is &#58;"<<error<<endl<<endl;
        x1=x2;
     &#125;

     if &#40;finish==1&#41; 
        cout << "\nThe root is &#58; " <<x2 <<"\tand the number of iterations was &#58;" << i <<endl;

getchar&#40;&#41;;
   return 0;
&#125;

    double function&#40;double x&#41;
    &#123;
        double y;
        y =exp&#40;x&#41;-sin&#40;x&#41;;
        return y;
    &#125;


double fderivative&#40;double x&#41;
&#123;
    double y;
    y=exp&#40;x&#41;-cos&#40;x&#41;;
    return y;
&#125;


ggeo1
Δημοσιεύσεις: 16
Εγγραφή: 08 Νοέμ 2006 18:24

newton-raphson method , δε μου κάνει το loop

Δημοσίευση από ggeo1 » 30 Νοέμ 2010 00:15

Σε ευχαριστώ πολύ για το χρόνο που αφιέρωσες.
Πραγματικά το προσπαθώ μέρες και δε μου βγαίνει!

Δεν μπορώ όμως να καταλάβω γιατί δε μου δούλευε καθόλου.
Ακόμη και αν έβαζα μέσα στο loop τα f1,fd1.f2 και στο τέλος του loop το χ1=χ2 ,πάλι δε μου δούλευε.

Να ρωτήσω και κάτι ακομη?
Η εντολή στο τέλος " if (finish==1) " δε χρειάζεται,έτσι?Και χωρίς αυτή πάλι το εκτυπώνει το τελευταίο cout.

Και πάλι σε ευχαριστώ!

billiaswhs
Δημοσιεύσεις: 346
Εγγραφή: 11 Νοέμ 2004 00:29
Επικοινωνία:

newton-raphson method , δε μου κάνει το loop

Δημοσίευση από billiaswhs » 30 Νοέμ 2010 01:03

Βασικά δες το newton raphson σε matlab υλοποιημένο
που είναι πιο εύκολο και κατανοητό να υλοποιηθεί εκεί
και μετά αφου το κανοήσεις μετέφερω στη C το παρακάτω είναι matlab

function root = newton(a,tol)

function [root,x] = newton(a,tol)

test = abs(f(a));
i = 0;
x(i+1) = a;
%while test > tol
for i=1:30
a = a - f(a)/fp(a);
test = abs(f(a));
i = i+1;
x(i+2) = a;
end
i

root = a;

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

newton-raphson method , δε μου κάνει το loop

Δημοσίευση από virxen75 » 30 Νοέμ 2010 01:17

ggeo1 έγραψε:Σε ευχαριστώ πολύ για το χρόνο που αφιέρωσες.
Πραγματικά το προσπαθώ μέρες και δε μου βγαίνει!

Δεν μπορώ όμως να καταλάβω γιατί δε μου δούλευε καθόλου.
Ακόμη και αν έβαζα μέσα στο loop τα f1,fd1.f2 και στο τέλος του loop το χ1=χ2 ,πάλι δε μου δούλευε.

Να ρωτήσω και κάτι ακομη?
Η εντολή στο τέλος " if (finish==1) " δε χρειάζεται,έτσι?Και χωρίς αυτή πάλι το εκτυπώνει το τελευταίο cout.

Και πάλι σε ευχαριστώ!
λές ότι --->fd1 and f1 must be !=0
αν λοιπόν συμβεί κάτι τέτοιο βγαίνει από το loop και δεν τυπώνει το αποτέλεσμα
γιατι -->finish=0

ggeo1
Δημοσιεύσεις: 16
Εγγραφή: 08 Νοέμ 2006 18:24

newton-raphson method , δε μου κάνει το loop

Δημοσίευση από ggeo1 » 30 Νοέμ 2010 19:06

Ok , ευχαριστώ για τις συμβουλές.

Απάντηση

Επιστροφή στο “C, C++”

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

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