2017-03-02 6 views
0

Ich bin eine Funktion schreiben, die versucht, die Null einer Funktion mit Newton-Methode zu finden.Newton-Methode Calling Functions C++

Ich habe meine Funktion und Ableitung von x^7-1000

double function(double x) { 
    return pow(x, 7) - 1000;  
} 
double derivative(double x) { 
    return 7 * pow(x, 6); 
} 

Ich habe auch Newtons Funktion

using fx = double(*)(double); 

double newtons(fx f, fx df, double x0, double e) 
{ 
    double x1{}; 
    while(true) { 
     x1 = x0 - f(x0)/df(x0); 

     if(std::abs(x1 - x0) <= e) break; 

     x0 = x1; 
    } 

    return x1; 
} 

Wie rufe ich die Funktionen mein int main?

+0

Welche Rolle Sie Probleme geben? Ich nehme an, Sie verstehen, wie man eine Funktion aufruft. Weißt du, wie man ein Haupt schreibt? – Carcigenicate

+0

Was passiert, wenn 'df (x0)' 0 oder nahe Null zurückgibt? Denk darüber nach. –

Antwort

1

das einfach:

#include <iostream> 
#include "my_functions.h" 

int main(){ 
    std::cout << newtons(function, derivative, 10.5, 1.0e-5) << std::endl; 
} 

Note (tx @martinbonner): Vorlagen und die stl verwenden, können Sie es sogar noch mehr Generika machen: Lambda-Ausdrücke verwenden, bestehende Funktionen, ... alles 'invokeable'.

template<typename F> 
double newtons(F f, F df, double x0, double e) { 
    ... // same as your code 
} 

// usage: 
auto x = newtons(std::sin, std::cos, 0.5, 1e-5); 
auto x2 = newtons(
    [](double d){ return d*d + 2*d - 1; }, 
    [](double d){ return 2*d + 2; }, 
    0, 
    1.0e-5); 
+0

Sie müssen auch '#include" newtons.h "'. –

+0

Es ist offensichtlich, dass er angenommen hat, dass die Funktionen in der Header-Datei "my_functions.h" liegen. – IGarFieldI

+0

Vielleicht ist es nett zu erwähnen, dass man es auch als "Newton ([] (double x) {return std :: pow (x , 7.) - 1000;}, [] (double x) {return 7. * std :: pow (x, 6.);}, 10.5, 1E-5) '- das ist viel besser lesbar mit ein paar Zeilenumbrüchen! –

0

Trivial wie folgt (vorausgesetzt, alles in ihrem Umfang ist)

int main() { 
    std::cout << newtons(function, derivative, 
         10.5 /* Start point */, 0.00001 /* Error delta */); 
} 

Live example