The implementation, in c++, of NewtonRapson & Bisect Approximation can be as followed:
Files
1 Header file
1 cpp file
Header file 1: Solver03.h
#pragma once
template<typename Function>
double SolveByBisect(Function& Fct, double Tgt, double LEnd, double REnd, double Acc)
{
double left = LEnd, right = REnd, mid = (left + right) / 2;
double y_left = Fct.Value(left) - Tgt, y_mid = Fct.Value(mid) - Tgt;
while (mid - left > Acc)
{
if ((y_left > 0 && y_mid > 0) || (y_left < 0 && y_mid < 0))
{
left = mid; y_left = y_mid;
}
else right = mid;
mid = (left + right) / 2;
y_mid = Fct.Value(mid) - Tgt;
}
return mid;
}
template<typename Function>
double SolveByNR(Function& Fct, double Tgt, double Guess, double Acc)
{
double x_prev = Guess;
double x_next = x_prev - (Fct.Value(x_prev) - Tgt) / Fct.Deriv(x_prev);
while (x_next - x_prev > Acc || x_prev - x_next > Acc)
{
x_prev = x_next;
x_next = x_prev - (Fct.Value(x_prev) - Tgt) / Fct.Deriv(x_prev);
}
return x_next;
}
//#endif
cpp file 1 : main.cpp
#include "Solver03.h"
#include <iostream>
#include <iomanip>
using namespace std;
class F1 {
public:
double Value(double x) {
return x * x - 2;
}
double Deriv(double x) { return 2 * x; }
};
class F2 {
private:
double a; //parameter
public:
F2(double a_) { a = a_; }
double Value(double x) {
return x * x- a;
}
double Deriv(double x) { return 2 * x; }
};
int main()
{
F1 MyF1;
F2 MyF2(3.0);
cout << setiosflags(ios::fixed) << setprecision(4);
//cout << std::setiosflags(std::ios::fixed) << std::setprecision(4);
double Acc = 0.001;
double LEnd = 0.0, REnd = 2.0;
double Tgt = 0.0;
double Guess = 1.0;
cout << "Root of F1 by bisect: " << SolveByBisect<F1>(MyF1, Tgt, LEnd, REnd, Acc) << endl;
cout << "Root of F2 by bisect: " << SolveByBisect<F2>(MyF2, Tgt, LEnd, REnd, Acc) << endl;
cout << "Root of F1 by Newton-Raphson:" << SolveByNR<F1>(MyF1,Tgt,Guess,Acc)
<< endl;
cout << "Root of F2 by Newton-Raphson:" << SolveByNR<F2>(MyF2,Tgt,Guess,Acc)
<< endl;
return 0;
}
/*
Root of F1 by bisect: 1.4150
Root of F2 by bisect: 1.7314
Root of F1 by Newton-Raphson:1.4142
Root of F2 by Newton-Raphson:1.7321
*/




Leave a comment