Boost anwenden



  • Hallo ihr Lieben,

    ich würde gerne Boost verwenden, aber es scheitert ein wenig an der Dokumentation. 😕

    Ich versuche ganz naiv eine Nullstellensuche zu implementieren was mich bei der aktuellen Version 1.55 hierher geführt hat. Jetzt muss man wohl ein wenig raten. 😕

    Um schließlich Beispiele zu finden hat mich google hierher gebracht, was dem ersten recht ähnlich ist - nur, dass es für Boost 1.46 gilt? 😕

    Also ... gibt es nicht die eine Dokumentation mit (Minimal- ) Beispielen und Erklärungen, sondern verschieden ausführliche Dokumentationen, die man sich zusammensuchen muss?

    Gruß,
    -- Klaus.


  • Mod

    Da muss man doch nicht raten -

    template <class F, class T, class Tol>
    std::pair<T, T>
       bisect(
          F f,
          T min,
          T max,
          Tol tol);
    

    Fragt sich nur, was tol ist. Hört sich für mich nach einer Abkürzung für "tolerance" an. Also, wie nah das Ergebnis an Null dran sein muss.

    Edit: Ist nicht richtig, aber hier kannst du es nachlesen, die Signatur ist dieselbe:



  • Doch war quasi richtig. Und das steht auch auf der ersten Seite, die der OP gepostet hat. Unter dem Beispielcode für Bisection.

    Ist halt keine Toleranz, sondern ein binärer Funktor, der die Abbruchbedingung angibt.



  • Ja,

    ich habe mittlerweile auch ein Minimalbeispiel hinbekommen

    #include <algorithm>
    #include <fstream>
    #include <iostream>
    #include <memory>
    #include <numeric>
    #include <string>
    #include <vector>
    
    #include <boost/math/tools/roots.hpp>
    
    double f(double x){ return sin( x ); }
    
    int main()
    {
    	double const a(1.57), b(4.7);
    
    	boost::uintmax_t max = 10;
    
    	double const tol = 1.0e-5;
    
    	std::pair<double,double> root = boost::math::tools::toms748_solve(f,a,b,
    		[tol](double x, double y) -> bool { return fabs(x-y) <= tol; },max);
    
    	std::cout << root.first << "\t" << root.second << std::endl;
    
    	return 0;
    }
    

    Doch das ganze erscheint mir noch ein wenig umständlich, z.B. dass ich die Toleranz als Funktor manuell implementieren muss oder mir ein Beispiel mittels Stackoverflow zusammensuchen muss. 😕

    Gruß,
    -- Klaus.


  • Mod

    Ich bin fast sicher, dass Boost einige selber bereitstellt.

    Na bitte, wusste ich es doch: http://www.boost.org/doc/libs/1_55_0/libs/math/doc/html/math_toolkit/internals1/roots2.html

    Runterscrollen bis eps_tolerance , equal_floor , usw.



  • Arcoth schrieb:

    Ich bin fast sicher, dass Boost einige selber bereitstellt.

    Na bitte, wusste ich es doch: http://www.boost.org/doc/libs/1_55_0/libs/math/doc/html/math_toolkit/internals1/roots2.html

    Runterscrollen bis eps_tolerance , equal_floor , usw.

    Ah, cool - danke! 🙂

    Der Spruch "Texte bis zum Ende lesen ..." ist nach wie vor en vogue. 😃

    Gruß,
    -- Klaus.



  • Mal wieder eine kleine Frage zu Boost ublas vector:

    In beiden Fällen steht in der Doku.

    Returns a reference of the i-th element.
    

    Hat das einen tieferen Sinn oder ist das 'historisch so gewachsen'?

    Gruß,
    -- Klaus.



  • IMHO:
    Das ist eine Konzession an die Notations-Konsistenz. Man kann den operator[] nur für einen Parameter überladen. Für Vektoren reicht das vollkommen aus, aber für mehrdimensionale Arrays geht´s halt nicht mehr. Für die wurde der operator() überladen, der mit beliebig vielen Argumenten umgehen kann. Und damit der ublas-Vektor nicht aus der Reihe fällt wurde für den auch der operator() überladen.



  • Okay,

    danke! 🙂

    Gruß,
    -- Klaus.


Anmelden zum Antworten