00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <math.h>
00012 #include <stdlib.h>
00013 #include <stdio.h>
00014 #include "CouenneTypes.hpp"
00015
00016 namespace Couenne {
00017
00018 #define MAX_ITER 1000
00019 #define COU_TRIG_TOLERANCE 1e-12
00020
00021 CouNumber trigNewton (CouNumber a, CouNumber l, CouNumber u) {
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 if (l>u) {
00032 register CouNumber swap = l;
00033 l = u;
00034 u = swap;
00035 }
00036
00037 register CouNumber xk = 0.5 * (u+l);
00038
00039 CouNumber sina = sin (a),
00040 sinxk = sin (xk),
00041 cosxk = cos (xk),
00042 dy = sinxk - sina,
00043 dx = xk - a,
00044 dydx = dy/dx,
00045 F = cosxk - dydx;
00046
00047
00048 for (register int k = MAX_ITER; (fabs (F) > COU_TRIG_TOLERANCE) && k--;) {
00049
00050 CouNumber Fp = sinxk + (cosxk - dydx) / dx;
00051
00052 xk += F/Fp;
00053
00054 if (xk < l) xk = l;
00055 else if (xk > u) xk = u;
00056
00057 sinxk = sin (xk);
00058 cosxk = cos (xk);
00059 dy = sinxk - sina;
00060 dx = xk - a;
00061 dydx = dy/dx;
00062 F = cosxk - dydx;
00063 }
00064
00065 return xk;
00066 }
00067
00068 }
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085