/*
Programmazione II - Esempio di codice
Example code: "safe" Newton-Raphson method demonstration
(20000814 prelz@mi.infn.it)
*/
#include
#include
#include
typedef struct bracket_s
{
double x1;
double x2;
} bracket;
int get_bracket_partition(double (*f)(double x), bracket in_bra,
unsigned int n_partitions, bracket **out_bra);
double get_zero_with_newtraph(double (*f)(double x),
double (*df)(double x),
bracket bra, double tolerance);
int
main(int argc, char *argv[])
{
double argument;
double result1, result2;
double zero;
bracket test,*ret_bra;
int result;
int i;
test.x1 = -M_PI/2;
test.x2 = 4*M_PI;
result = get_bracket_partition(sin, test, 20, &ret_bra);
printf ("get_bracket_partition sin with initial interval (0,4*PI) returns %d:\n",
result);
for (i=0;i= 0)
{
fprintf(stderr,"Error: input interval is not a valid zero bracket.\n");
return(0);
}
xmiddle = (bra.x1 + bra.x2) / 2;
fmiddle = (*f)(xmiddle);
old_increment = fabs(bra.x1 - bra.x2);
increment = old_increment;
for (i=0; i 0 ||
(fabs(2*fmiddle) > fabs(old_increment*dfmiddle)) )
{
old_increment = increment;
if (fleft * fmiddle < 0)
{
bra.x2 = xmiddle;
fright = fmiddle;
}
else
{
bra.x1 = xmiddle;
fleft = fmiddle;
}
xmiddle = (bra.x1 + bra.x2) / 2;
increment = fabs(bra.x1 - bra.x2) / 2;
fmiddle = (*f)(xmiddle);
}
else
{
old_increment = increment;
increment = fabs(newx - xmiddle);
xmiddle = newx;
fmiddle = (*f)(xmiddle);
if (fleft * fmiddle < 0)
{
bra.x2 = xmiddle;
fright = fmiddle;
}
else
{
bra.x1 = xmiddle;
fleft = fmiddle;
}
}
if (fabs(bra.x2 - bra.x1) < fabs(tolerance)) return(xmiddle);
}
/* We get here only if we received a bad tolerance value */
fprintf(stderr,"Error: Too many bisections.\n");
return(0);
}