Важная информация
Показано с 1 по 2 из 2

Тема: C. Задача на метод дихотомии.

  1. #1 C. Задача на метод дихотомии. 
    Новичок
    Регистрация
    29.11.2017
    Сообщений
    7
    Сказал(а) спасибо
    8
    Поблагодарили 1 раз в 1 сообщении
    Помогите, пожалуйста, доделать задачу:

    C++ Code:
    1. #include <conio.h>
    2. #include <math.h>
    3. #include <stdio.h>
    4. #include <time.h>
    5. #define CLOCKS_PER_SEC 1000
    6. double f(double x) // задание функции
    7. {
    8.         return    5*sin(2*x)-sqrt(1-x);
    9. }
    10. int main()
    11. {
    12.         double start = clock(); //время начала программы
    13.         int n=0; // значение числа итераций
    14.         double a,b,c,eps; // переменные
    15.         printf ("Method of dihotomia\r\n");
    16.         printf("Please, write a <= 1: "); scanf("%lf", &a); // начало отрезка. Относительно ОДЗ (подкоренное выражение не может быть отрицательным.)
    17.         printf("Please, write b <= 1: "); scanf("%lf", &b); // конец отрезка.  
    18.         printf("Please, write epsilon for sets the precision: "); scanf("%lf", &eps); // задание точности
    19.         do {
    20.                 c=(a+b)/2;
    21.                 if (f(c)*f(a)<=0) b=c;
    22.                 else a=c; // вычисления по методу
    23.  
    24.                 n++; // рост количества итераций
    25. }
    26.         while (fabs(a-b)>=eps); // проверка условия
    27.                 printf("\r\n\r\nResults:");
    28.                 printf("\r\nx=%lf\r\n", c); // вывод найденного значения
    29.                 printf("n=%d\r\n", n); // вывод количества итераций
    30.                 printf("Character of function:%lf\r\n", f(c)); // вывод значения функции по найденному значению
    31. // аргумента
    32. printf("Time:%.lf ms\r\n", (clock() - start) / CLOCKS_PER_SEC);
    33.                 getch();
    34.         return 0;
    35. }


    Замечания преподавателя:
    Не реализовано отделение корней. В цикле точность по аргументу контролируется неверно, а по функции – вообще не контролируется.
    Последний раз редактировалось rrrFer; 30.11.2017 в 09:08.
    Ответить с цитированием  
     

  2. #2  
    Профи Аватар для rrrFer
    Регистрация
    01.08.2013
    Сообщений
    561
    Сказал(а) спасибо
    34
    Поблагодарили 248 раз(а) в 164 сообщениях
    Отделение корней, насколько я понимаю, - это проверка что если f(a)*f(b) > 0 - то корней вообще нет. Перед циклом добавьте
    C++ Code:
    1. if (f(b)*f(a) > 0) {
    2.   printf("no roots");
    3.   return 0;
    4. }


    В цикле точность по аргументу контролируется неверно
    Пусть пояснит. Вроде бы все верно.
    Вот оно:
    C++ Code:
    1. while (fabs(a-b)>=eps)


    Ну а по функции - допишите так, например:
    C++ Code:
    1. while (fabs(a-b)>=eps && fabs(f(c)) > eps)


    Вообще, могу посоветовать почитать теорию по этой теме: [Ссылки могут видеть только зарегистрированные пользователи. ] (смотрите второй раздел - "Вычисление корня методом половинного деления").
    [Ссылки могут видеть только зарегистрированные пользователи. ] // программирование на Prolog, Erlang, C++
    Ответить с цитированием  
     

  3. 3 пользователя(ей) сказали cпасибо:

    >Quiet Snow< (30.11.2017), Free Admin (30.11.2017), Serpent (04.12.2017)

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Как использовать данный метод?
    от Гена Дёмин в разделе .NET
    Ответов: 0
    Последнее сообщение: 22.11.2017, 16:42
  2. Ответов: 0
    Последнее сообщение: 28.06.2017, 19:04
  3. Ответов: 0
    Последнее сообщение: 28.06.2017, 19:02
  4. Ответов: 6
    Последнее сообщение: 09.01.2015, 15:20
  5. Ответов: 1
    Последнее сообщение: 06.04.2013, 15:48
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •