Added newton's method
This commit is contained in:
parent
e5b0be92af
commit
bf1e581ce9
27
sample/testNewton.cpp
Normal file
27
sample/testNewton.cpp
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#include "newton.hpp"
|
||||||
|
|
||||||
|
using namespace CosmoTool;
|
||||||
|
|
||||||
|
struct SimplePolynom
|
||||||
|
{
|
||||||
|
double eval(double x) { return x*x*x+2*x-1; }
|
||||||
|
double derivative(double x) { return 3*x*x+2; }
|
||||||
|
};
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
SimplePolynom poly;
|
||||||
|
double r;
|
||||||
|
|
||||||
|
double solution = -2*pow(2./(3*(9+sqrt(177.))), 1./3) + (pow(0.5*(9+sqrt(177.))/9, 1./3));
|
||||||
|
|
||||||
|
r = newtonSolver(3.0, poly);
|
||||||
|
|
||||||
|
cout << "Result = " << r << " delta = " << r-solution << endl;
|
||||||
|
return 0;
|
||||||
|
}
|
28
src/newton.hpp
Normal file
28
src/newton.hpp
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#ifndef _COSMOTOOL_NEWTON_HPP
|
||||||
|
#define _COSMOTOOL_NEWTON_HPP
|
||||||
|
|
||||||
|
namespace CosmoTool
|
||||||
|
{
|
||||||
|
template<typename T, typename FunT>
|
||||||
|
T newtonSolver(T x0, FunT function, double residual = 1e-3)
|
||||||
|
{
|
||||||
|
T x, xold = x0;
|
||||||
|
T f_x = function.eval(x0);
|
||||||
|
T df_x = function.derivative(x0);
|
||||||
|
|
||||||
|
x = xold - f_x/df_x;
|
||||||
|
|
||||||
|
while (abs(xold-x) > residual)
|
||||||
|
{
|
||||||
|
xold = x;
|
||||||
|
f_x = function.eval(x);
|
||||||
|
df_x = function.derivative(x);
|
||||||
|
x = xold - f_x/df_x;
|
||||||
|
}
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user