fork(12) download
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <locale.h>
  5. #include <math.h>
  6. #define PI 3.14159
  7.  
  8.  
  9. double formula (double x) {
  10. return (pow(x, 3)* cos(3*PI*x)*exp(x)-pow(x,2)*cos(2*PI*x)*exp(0.5*x)+5);
  11. }
  12.  
  13. double der2 (double x) {
  14. return -9*pow(PI,2)*exp(x)*pow(x,3)*cos(3*PI*x)-0.25 * exp(0.5*x)*pow(x, 2)*cos(2*PI*x)-exp(0.5*x)*(-4*pow(PI,2)*pow(x,2)*cos(2*PI*x)-8*PI*x*sin(2*PI*x)+2*cos(2*PI*x))-exp(0.5*x)*(2*x*cos(2*PI*x)-2*PI*x*x*sin(2*PI*x))-6*PI*(exp(x)*pow(x,3)+3*exp(x)*pow(x,2))*sin(3*PI*x)+(exp(x)*pow(x,3)+6*exp(x)*pow(x,2)+6*exp(x)*x)*cos(3*PI*x);
  15. }
  16.  
  17. double halfDiv (double a, double b) {
  18. double x = (a + b) / 2;
  19. while (abs(b - a) > 0.00001) {
  20. if (formula(b)*formula(x)<0) a = x;
  21. else b = x;
  22. x = (a + b)/2;
  23. }
  24. return x;
  25. }
  26.  
  27. double horda(double a, double b){
  28. double c;
  29. while (abs(formula(b) - formula(a)) > 0.00001)
  30. {
  31. c = (formula(b)*a - formula(a)*b)/(formula(b)-formula(a));
  32. if ((formula(a)*formula(c))>0) a=c;
  33. else b = c;
  34. }
  35. return b;
  36. }
  37.  
  38. double touch (double a, double b) {
  39. double c = (formula(a)*der2(a)>0) ? a : b;
  40. double fc;
  41. double fder2;
  42. double d = 0;
  43. do {
  44. d += c;
  45. fc = formula(c);
  46. fder2 = der2(c);
  47. c -= fc/fder2;
  48. d -= c;
  49. d = abs(d);
  50. } while (d > 0.00001);
  51. return c;
  52. }
  53.  
  54. int main()
  55. {
  56. double x1, x2;
  57. setlocale(LC_ALL, "rus");
  58. printf("Введите через пробел концы отрезка (a и b соответственно): ");
  59. scanf("%lf %lf", &x1, &x2);
  60. if (formula(x1)*formula(x2)>0) printf("Невалидный интервал!");
  61. else printf("Решение методом деления пополам:\nx = %lf\nf(x) = %lf\n\nРешение методом хорд:\nx = %lf\nf(x) = %lf\n\nРешение методом касательных:\nx = %lf\nf(x) = %lf",halfDiv(x1, x2), formula(halfDiv(x1,x2)), horda(x1,x2), formula(horda(x1,x2)), touch(x1,x2), formula(touch(x1,x2)));
  62. return 0;
  63. }
Success #stdin #stdout 0s 16880KB
stdin
Standard input is empty
stdout
Введите через пробел концы отрезка (a и b соответственно): Невалидный интервал!