mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//  Copyright John Maddock 2006.
 | 
						|
//  Copyright Paul A. Bristow 2007.
 | 
						|
 | 
						|
//  Use, modification and distribution are subject to the
 | 
						|
//  Boost Software License, Version 1.0. (See accompanying file
 | 
						|
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
						|
 | 
						|
#include <pch.hpp>
 | 
						|
 | 
						|
#include <boost/math/tools/minima.hpp>
 | 
						|
#define BOOST_TEST_MAIN
 | 
						|
#include <boost/test/unit_test.hpp>
 | 
						|
#include <boost/test/floating_point_comparison.hpp>
 | 
						|
#include <boost/math/special_functions/gamma.hpp>
 | 
						|
#include <iostream>
 | 
						|
#include <iomanip>
 | 
						|
 | 
						|
template <class T>
 | 
						|
struct poly_test
 | 
						|
{
 | 
						|
   // minima is at (3,4):
 | 
						|
   T operator()(const T& v)
 | 
						|
   {
 | 
						|
      T a = v - 3;
 | 
						|
      return 3 * a * a + 4;
 | 
						|
   }
 | 
						|
};
 | 
						|
 | 
						|
template <class T>
 | 
						|
void test_minima(T, const char* /* name */)
 | 
						|
{
 | 
						|
   std::pair<T, T> m = boost::math::tools::brent_find_minima(poly_test<T>(), T(-10), T(10), 50);
 | 
						|
   BOOST_CHECK_CLOSE(m.first, T(3), T(0.001));
 | 
						|
   BOOST_CHECK_CLOSE(m.second, T(4), T(0.001));
 | 
						|
 | 
						|
   T (*fp)(T);
 | 
						|
#if defined(BOOST_MATH_NO_DEDUCED_FUNCTION_POINTERS)
 | 
						|
   fp = boost::math::lgamma<T>;
 | 
						|
#else
 | 
						|
   fp = boost::math::lgamma;
 | 
						|
#endif
 | 
						|
 | 
						|
   m = boost::math::tools::brent_find_minima(fp, T(0.5), T(10), 50);
 | 
						|
   BOOST_CHECK_CLOSE(m.first, T(1.461632), T(0.1));
 | 
						|
#if defined(BOOST_MATH_NO_DEDUCED_FUNCTION_POINTERS)
 | 
						|
   fp = boost::math::tgamma<T>;
 | 
						|
#else
 | 
						|
   fp = boost::math::tgamma;
 | 
						|
#endif
 | 
						|
   m = boost::math::tools::brent_find_minima(fp, T(0.5), T(10), 50);
 | 
						|
   BOOST_CHECK_CLOSE(m.first, T(1.461632), T(0.1));
 | 
						|
}
 | 
						|
 | 
						|
BOOST_AUTO_TEST_CASE( test_main )
 | 
						|
{
 | 
						|
   test_minima(0.1f, "float");
 | 
						|
   test_minima(0.1, "double");
 | 
						|
#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
 | 
						|
   test_minima(0.1L, "long double");
 | 
						|
#endif
 | 
						|
   
 | 
						|
}
 | 
						|
 | 
						|
 |