123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- #include<stdio.h>
- #include<stdlib.h>
- #include<math.h>
- typedef struct {
- double value, tolerance, epsilon;
- } solution;
- double poly(double x) {
- return 0.25 * pow(x,3) + x - 1.2502;
- }
- double alg(double x) {
- return pow(x,4) + 3 * pow(x,3) - 9 * x - 9;
- }
- double algbrake(double x) {
- return -(pow(x,4) + 3 * pow(x,3) - 9 * x - 9)/(x-1.5);
- }
- double secant(double(*f)(double), double xk, double xk1, double eps, int N) {
- double xk2;
- double fxk = f(xk);
- double fxk1 = f(xk1);
- for (int i = 1; i < N; i++)
- {
- if (fabs(xk1 - xk) < eps) {
- break;
- }
- xk2 = xk1 - fxk1 * ((xk1 - xk) / (fxk1 - fxk));
- xk = xk1;
- fxk = fxk1;
- xk1 = xk2;
- fxk1 = f(xk2);
- }
- return xk2;
- }
- solution secant_solution(double(*f)(double), double xk, double xk1, double eps, int N) {
- double xk2;
- double fxk = f(xk);
- double fxk1 = f(xk1);
- solution sol;
- double secant_sol = secant(f, xk, xk1, pow(10, -15), 1000);
- for (int i = 1; i < N+1; i++)
- {
- sol.epsilon = eps;
- if (fabs(xk1 - xk) < eps) {
- sol.tolerance = fabs(xk1 - xk);
- break;
- }
- xk2 = xk1 - fxk1 * ((xk1 - xk) / (fxk1 - fxk));
- sol.value = xk2;
- xk = xk1;
- fxk = fxk1;
- xk1 = xk2;
- fxk1 = f(xk2);
- }
- return sol;
- }
- void SolutionSecantComparison(double(*f)(double), double a, double b, double eps, int N, char const *filename) {
- solution solu;
- FILE* file;
- file = fopen(filename, "w+");
- for (int i = 1; i < 16; i++) {
- solu = secant_solution(f, a, b, pow(10,-i), 1000);
- fprintf(file, "%e, %e, %lf\n", solu.epsilon, solu.tolerance, solu.value);
- }
- fclose(file);
- }
- double bisection(double(*f)(double), double a, double b, double eps, int N) {
- double fa = f(a);
- double fb = f(b);
- double c;
- if (fa * fb >= 0) {
- return 0;
- }
- for (int i = 0; i < N; i ++)
- {
- c = 0.5 * (a + b);
- if ((b - a) < 2*eps) {
- return c;
- }
- double fc = f(c);
- if (fa * fc > 0) {
- a = c;
- fa = fc;
- }
- else {
- b = c;
- fb = fc;
- }
- }
- return c;
- }
- solution bisection_solution(double(*f)(double), double a, double b, double eps, int N) {
- double fa = f(a);
- double fb = f(b);
- double c;
- solution sol;
- double bisection_sol = bisection(f, a, b, pow(10, -15), 1000);
- for (int i = 1; i < N+1; i ++)
- {
- sol.epsilon = eps;
- c = 0.5 * (a + b);
- sol.value = c;
- if ((b - a) < 2*eps) {
- sol.tolerance = fabs((b - a));
- return sol;
- }
- double fc = f(c);
- if (fa * fc > 0) {
- a = c;
- fa = fc;
- }
- else {
- b = c;
- fb = fc;
- }
-
- }
- return sol;
- }
- void SolutionBisectionComparison(double(*f)(double), double a, double b, double eps, int N, char const *filename) {
- solution solu;
- FILE* file;
- file = fopen(filename, "w+");
- for (int i = 1; i < 16; i++) {
- solu = bisection_solution(f, a, b, pow(10,-i), 1000);
- fprintf(file, "%e, %e, %lf\n", solu.epsilon, solu.tolerance, solu.value);
-
- }
- fclose(file);
- }
- void PrintResultSolution(solution result) {
- printf("Value: %.10lf\n", result.value);
- printf("Tolerance: %.10lf\n", result.tolerance);
- printf("Epsilon: %d\n", result.epsilon);
- }
- void PrintResult (double eps) {
- solution x1 = secant_solution(algbrake, 1.51, 2, eps, 1000);
- solution x2 = bisection_solution(algbrake, 1.51, 2, eps, 1000);
- printf("Function with a brake: \n");
- printf("Secant method: \n");
- PrintResultSolution(x1);
- printf("Bisection method: \n");
- PrintResultSolution(x2);
-
- solution x3 = secant_solution(alg, 1, 2, eps, 1000);
- solution x4 = bisection_solution(alg, 1, 2, eps, 1000);
- printf("Algebraic function: \n");
- printf("Secant method: \n");
- PrintResultSolution(x3);
- printf("Bisection method: \n");
- PrintResultSolution(x4);
- solution x5 = secant_solution(poly, 0, 2, eps, 1000);
- solution x6 = bisection_solution(poly, 0, 2, eps, 1000);
- printf("Polynomial: \n");
- printf("Secant method: \n");
- PrintResultSolution(x5);
- printf("Bisection method: \n");
- PrintResultSolution(x6);
- }
- int main() {
- PrintResult(pow(10, -15));
- SolutionSecantComparison(algbrake, 1.51, 2, pow(10, -5), 1000,"secant_algbrake_C.csv");
- SolutionSecantComparison(poly, 0, 2, pow(10, -5), 1000, "secant_poly_c.csv");
- SolutionSecantComparison(alg, 1, 2, pow(10, -5), 1000, "secant_alg_c.csv");
- SolutionBisectionComparison(algbrake, 1.51, 2, pow(10, -5), 1000,"bisection_algbrake_c.csv");
- SolutionBisectionComparison(poly, 0, 2, pow(10, -5), 1000, "bisection_poly_c.csv");
- SolutionBisectionComparison(alg, 1, 2, pow(10, -5), 1000, "bisection_alg_c.csv");
- }
|