/* * SECANT ALGORITHM 2.4 * * To find a solution to the equation f(x) = 0 * given initial approximations p0 and p1: * * INPUT: initial approximation p0, p1; tolerance TOL; * maximum number of iterations N0. * * OUTPUT: approximate solution p or * a message that the algorithm fails. * */ #include #include #include #define true 1 #define false 0 #define PI 3.1415926535897932384626433832795 static double absval(double); static double F(double); static void INPUT(int *, double *, double *, double *, int *); static void OUTPUT(FILE **, int *); int main() { double P0,F0,P1,F1,P,FP,TOL; int I,NO,OK,FLAG; FILE *OUP[1]; OK = true; P0 = 0.5; P1 = PI/4.0; TOL = 1.0e-6; NO = 200; OUTPUT(OUP, &FLAG); /* STEP 1 */ I = 2; F0 = F(P0); F1 = F(P1); OK = true; /* STEP 2 */ while ((I<=NO) && true == OK) { /* STEP 3 */ /* compute P(I) */ P = P1 - F1 * (P1 - P0) / (F1 - F0); /* STEP 4 */ FP = F(P); if (FLAG == 2) fprintf(*OUP,"%3d %15.8e %15.8e \n",I,P,FP); if (absval((P - P1)/P) < TOL) { /* procedure completed successfully */ fprintf(*OUP,"\nSecant method succeeded\n"); fprintf(*OUP,"Approximate solution P = %12.8f\n",P); fprintf(*OUP,"with F(P) = %12.8f\n",FP); fprintf(*OUP,"Number of iterations = %3d",I); fprintf(*OUP," Tolerance = %14.8e\n",TOL); OK = false; } else { /* STEP 5 */ I++; /* STEP 6 */ /* update P0, F0, P1, F1 */ P0 = P1; F0 = F1; P1 = P; F1 = FP; } } if (OK) { /* STEP 7 */ /* procedure completed unsuccessfully */ fprintf(*OUP,"Secant method failed\n"); fprintf(*OUP,"\nIteration number %3d",NO); fprintf(*OUP," gave approximation %12.8f\n",P); fprintf(*OUP,"F(P) = %12.8f not within tolerance : %15.8e\n",FP,TOL); } fclose(*OUP); return 0; } /* Change function F for a new problem */ static double F(double X) { double f; f = cos(X) - X; return f; } static void OUTPUT(FILE **OUP, int *FLAG) { char NAME[30]; printf("Select output destination\n"); printf("1. Screen\n"); printf("2. Text file\n"); printf("Enter 1 or 2: "); scanf("%d", FLAG); if (*FLAG == 2) { printf("Input the file name in the form - drive:name.ext\n"); printf("For example: A:OUTPUT.DTA\n"); scanf("%s", NAME); *OUP = fopen(NAME, "w"); } else *OUP = stdout; printf("Select amount of output\n"); printf("1. Answer only\n"); printf("2. All intermeditate approximations\n"); printf("Enter 1 or 2: "); scanf("%d", FLAG); fprintf(*OUP,"Secant Method\n"); if (*FLAG == 2) fprintf(*OUP, " I P F(P)\n"); } /* Absolute Value Function */ static double absval(double val) { if (val >= 0) return val; else return -val; }