Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Метод деления отрезка пополам


Автор: Alexey91 31.3.2009, 18:07
Всем привет!
Дали такую задачу: методом деления отрезка пополам найти с точностью EPS=0,0001 корень уравнения cos(2/x)-2*sin(1/x)+1/x=0.

Не понимаю в чем заключается метод деления отрезка пополам, и как с помощью него найти корень уравнения с вышеуказанной точностью..(

Автор: zim22 31.3.2009, 18:37
Цитата(Alexey91 @  31.3.2009,  18:07 Найти цитируемый пост)
метод деления отрезка пополам,

дихотомия. один из методов поиска информации в упорядоченнной последовательности элементов.

Автор: Anikmar 31.3.2009, 19:23
Цитата(Alexey91 @  31.3.2009,  18:07 Найти цитируемый пост)
метод деления отрезка пополам

На сколько я помню, мы проходили этот метод под названием "Метод половинного деления". Достаточно просто - проверять знаки и приближаться к пересечению графика функции с осью х (собственно там и будет корень). Думаю в гугле навалом описаний.

Автор: mes 31.3.2009, 20:17
Цитата(Alexey91 @  31.3.2009,  17:07 Найти цитируемый пост)
Не понимаю в чем заключается метод деления отрезка пополам

Не понимаю, какое отношение вопрос по алгоритмам имеет к разделу "общие вопросы по C++"?  smile 

Автор: Anikmar 31.3.2009, 20:21
Цитата(mes @  31.3.2009,  20:17 Найти цитируемый пост)
Не понимаю, какое отношение вопрос по алгоритмам имеет к разделу "общие вопросы по C++"?    

Вы торопитесь.  smile  Дальше нужно будет реализовать данный алгоритм на С++, я полагаю. У автора реальные проблемы: с чего начать и он начал с понимания задачи, что правильно.  smile 


Alexey91, если сами писать не хотите - идите в центр помощи.

Автор: mes 31.3.2009, 20:35
Цитата(Anikmar @  31.3.2009,  19:21 Найти цитируемый пост)
Вы торопитесь.  smile  Дальше нужно будет реализовать данный алгоритм на С++, я полагаю. У автора реальные проблемы: с чего начать и он начал с понимания задачи, что правильно.  smile 

Ну так попросить исправить код, попросить написать код, следуя этому алгоритму и узнать что из себя представляет данный алгоритм это три разных вопроса, и согласно правилам форумам должны быть оформлены отдельно smile

а по теме вот:
http://www.toehelp.ru/theory/informat/lecture12.html

Автор: Alexey91 1.4.2009, 06:57
Нет, хочу написать я сам, пока думаю, спасибо, за ответы ;)

Автор: Alexey91 3.4.2009, 06:22
Код

#include <stdio.h>
#include <math.h>
#include <conio.h>

float f(float x)
{
 return cos(2/x)-2*sin(1/x)+1/x;
}

main()
{
 int i; float a,b,c,e,x;
 
 printf("Enter a= "); scanf("%f",&a);
 printf("Enter b= "); scanf("%f",&b);
 
 i=1;
 
 printf("Enter e= "); scanf("%f",&e);
 
 c=(a+b)/2;
 
 while(fabs(b-a > e) && f(c)!= 0)
 {
  if(f(a)*f(c)<0) b=c;
  else a=c;
  c=(a+b)/2; i++;
 }
 
 printf("%f",c);
 
 getch();
 return 0;
}


Вот, только мне сказали, что надо еще рекурсию сделать, как это можно оформить?

Автор: Ln78 3.4.2009, 10:27
Цитата(Alexey91 @  3.4.2009,  07:22 Найти цитируемый пост)
while(fabs(b-a > e) && f©!= 0)


Alexey91, скобка не там стоит у fabs.
А рекурсия - то, что в цикле оформить как отдельную функцию, которая вызывает сама себя до тех пор, пока не найдёт с нужной степенью приближения решение. Смысла большого нет, но раз требуется - сделай, сложностей тоже больших не должно быть.

Автор: Alexey91 7.4.2009, 06:54
Код

#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <string.h>

float e=0.0001;

float form(float d)
{
 return cos(2/d)-2*sin(1/d)+1/d;
}

float rek(float x, float y)
{
  float z=(x+y)/2;    
  if(form(x)*form(z) < 0) y=z;
  else x=z;
   
  if(fabs(y-x) > e && form(z) != 0)
  {
   return rek(x,y);
  }
  else return z;
}

main()
{
 float a,b;
 printf("Enter a,b: "); scanf("%f %f",&a,&b);
 printf("%f",rek(a,b));
 
 getch();
 return 0;
}


Похоже получилось  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)