2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Метод прямого перебора
Сообщение09.03.2007, 11:51 
Аватара пользователя
Совсем недавно на занятиях по информатике мы начали проходить численные методы, и по такому случаю нам дали контрольную, чтобы проверить знания подпрограмм и подпрограмм-функций. Первая проблема у меня была с тем, чтобы понять, что из себя представляет решение уравнения вообще. Когда я наконец понял, мне понадобилось написать отсортировку чисел, но как поймать нужное число в бесконтрольном потоке вычислений - я не знаю. Пробывал уже разные методы сортировки, но везде получался какой-то бред. Помогите пожалуйста, хоть чем-нибудь. Плохо то, что моим однокурсникам дали контрольные, где указывается сегмент существования корня. У меня же его нет и мне нужно найти иголку в стоге сена. Итак

Методом прямого перебора найти с заданной с монитора точностью $$\phi корень уравнения $$ch{x}+cos{x}-3=0$$...

Мне нужно понять алгоритм построения решения.

 
 
 
 
Сообщение09.03.2007, 16:12 
Следствие Вашего уравнения: значение ch(x) для возможного корня лежит в интервале [2, 4].

P.S. IMHO это скорее вычислительная математика, чем CS. Хоть предмет и называется "Информатика".

 
 
 
 
Сообщение09.03.2007, 17:22 
Аватара пользователя
Yuri Gendelman, о-о-о, спасибо большое!!!! Вы мне вообще очень помогли. А то я тут сижу и 2 дня создаю вечный двигатель. Заи... э-э-э... устал =)

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

 
 
 
 
Сообщение09.03.2007, 19:21 
Аватара пользователя
Запускаете Excel и строите таблицы для $$ch{x}$$ и $$3-cos{x}$$ и для их разницы. И наблюдаете как работает алгоритм. Там где эта разница меняет знак и лежит корень.
Можете нарисовать графики - еще понятнее будет, что такое кошинус и с чем его используют.

 
 
 
 
Сообщение13.04.2007, 23:24 
Аватара пользователя
Код:
     subroutine gc(chz,z)
     chz=0.5*(exp(z)+exp(-z))
     return
     end

     function f(x)
     call gc(chx,x)
     f=chx+cos(x)-3
     return
     end

     program liex9
     read(*,*)h,phi
     n=0
     y=f(h)
     if (y.gt.0) then
  10 continue
      n=n+1
      y=f(n*h)
      if (y.gt.0) then       
       write(*,*)y
       go to 10
      else if (y.lt.0) then
       a=f(h*(n-1))
       b=f(h*n)
       c=h*(n-1)
       d=(h*n)
       write(*,*)y
       go to 100
      endif
     else if (y.lt.0) then
  20  continue
      n=n+1
      y=f(n*h)
      if (y.lt.0) then
       write(*,*)y
       go to 20
      else if (y.gt.0) then
       a=f(h*(n-1))
       b=f(h*n)
       c=h*(n-1)
       d=(h*n)
       write(*,*)y
       go to 100
      end if
     end if
100 continue
     write(*,*)c,d
     i=(d+c)/phi
     g=f(c)
     DO 1 M=0,i
        X=c+M*phi
        P=F(X)
      IF((P.LE.0.AND.G.GE.0).OR.(P.GE.0.AND.G.LE.0))then
        WRITE(*,4)X,p
   4    FORMAT(2X,' kopen =',F10.7,F10.7)
      END IF
      G=P
   1 CONTINUE
     read(*,*)
     end

 
 
 
 
Сообщение13.04.2007, 23:37 
Аватара пользователя
Это кто ж так вас учит?
оператор go to :(

Лет 15 его уже нигде не видел

 
 
 
 
Сообщение13.04.2007, 23:45 
Аватара пользователя
sexstant, вот так =((( У нас практика по программированию 1 пара в неделю... Что поделаешь, инженерная специальность.

Добавлено спустя 1 минуту 21 секунду:

Я конечно понимаю, что алгоритм очень плохой, но делать нечего, пока не придумал другие варианты, а этот как-никак, а работает.

 
 
 
 
Сообщение14.04.2007, 03:06 
Аватара пользователя
:evil:
sexstant писал(а):
Это кто ж так вас учит?
оператор go to

Вопрос неправильный. Правильный вопрос: это где ж еще учат фортрану?! Вопрос, впрочем, риторический.

 
 
 
 
Сообщение14.04.2007, 03:50 
Аватара пользователя
Ничего плохого про Фортран не скажу. Вот только оператор GOTO в любом языке давно считается извращением.
Теперь о "методе прямого перебора". Такого не знаю. Наверное речь идет о делении отрезка пополам или о методе бисекции.

Вот например такой алгоритм из книги:
С.А.Абрамов, Е.В.Зима Начала информатики
Код:
program delp(input,output);
   var a,b,c,eps,fa,fc :real;
begin
   a:= ;
   b:= ;
   eps:= ;
   fa:=fun(a);
   while b-a >= eps do begin
      c:=(a+b)/2;
      fc:=fun(c);
      if fa*fc<=0 then
         b:=c;
      else begin
         a:=c;
         fa:=fc
      end;
   end;
   write(a);
end.


Добавлено спустя 30 минут 47 секунд:

Посмотрел вашу программу :(
Несколько лишних циклов. Ошибки и в самом алгоритме и в переписывании команд алгоритма на язык Фортран.
Обращений к подпрограмме порядка 6000 (для а=2, в=4 и для точности 0.001) вместо 9 в приведенном алгоритме.
Лишняя печать: 2000 строк проти 1 строки.
Так нельзя

 
 
 
 
Сообщение14.04.2007, 06:20 
Аватара пользователя
:evil:
sexstant писал(а):
Теперь о "методе прямого перебора". Такого не знаю. Наверное речь идет о делении отрезка пополам или о методе бисекции.

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

sexstant писал(а):
Вот только оператор GOTO в любом языке давно считается извращением.

Так же, как и Фортран. Впрочем, что естественно, то не грешно. ( А в Фортране-2 как-то без goto было туго.)

Большой недостаток старых языков (вроде Фортрана), что они не позволяют учить программировать по-современному. Отягощающим вину обстоятельством является то, что учащиеся читают старые программы, и усваивают из них устаревшие подходы и стереотипы.

 
 
 
 
Сообщение14.04.2007, 09:11 
Аватара пользователя
незваный гость писал(а):
:evil:
Большой недостаток старых языков (вроде Фортрана), что они не позволяют учить программировать по-современному.


И не только старых языков, но и так называемых "новых" - Микрософт Бейсик и Си
Как считает Виртовская школа - чума и холера современного преподавания программирования

 
 
 
 
Сообщение14.04.2007, 09:32 
Аватара пользователя
sexstant, что это у вас там за версия языка такая?

Да, спасибо, что на ошибки указали, попробую исправить.

 
 
 
 
Сообщение14.04.2007, 09:54 
Аватара пользователя
Это Паскаль.
Некоторые считают, что на нем хорошо алгоритмы описывать.
Я думаю вы легко переведете это все на Фортран
fun(x) - это ваша function f(x)

Посоветую 9 главу Press W.H., Teukolsky S.A., Vetterling W.T. Numerical recipes in FORTRAN77

см. http://lib.mexmat.ru/books/825
или http://www.numerical-recipes.com/nronline_switcher.php

 
 
 [ Сообщений: 13 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group