XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Общение> Трактир
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Омега

offline
Опыт: 12,033
Активность:
Метод бисекции (программа)
Нужно найти серию корней методом биссекции я решил сделать прогу на pascal по статье из wiki. Но что-то здесь не то, работает не как нужно. Знающие люди поправьте.
F=x^4+x^2-10 ; Погрешность=0.1 ; Интервал [0;2]
Код:
label 1;
var xn, xk,xi,eps,fxn,fxk,fxi:real;
begin
     xn:=0; //левый интервал
     xk:=2; //правый интервал
     eps:=0.1; //погрешность
     repeat
          if abs(xk-xn)<eps then goto 1; //корень в пределах заданной погрешности найден
          fxn:=xn*xn*xn*xn+xn*xn-10; //F(левого интервала) 
          fxk:=xk*xk*xk*xk+xk*xk-10; //F(правого)
          xi:=(xk+xn)/2; //нахождение средней точки
          fxi:=xi*xi*xi*xi+xi*xi-10; //F(средней точки)
          if fxn*fxi<0 then xk:=xi; //определение интервала где находится корень
          if fxi*fxk<0 then xn:=xi; //так же
          writeln('xn=',xn);
          writeln('fxn=',fxn);
          writeln('xk=',xk);
          writeln('fxk=',fxk);
          writeln('|xk-xn|=',abs(xk-xn));
          writeln('xi=',xi);
          writeln('fxi=',fxi);
     until fxi=0;
     1:
     writeln('__________________________________');
end.


Теперь я не пойму, все нормально, или что-то лажает. Вроде ввел отображение выражения
abs(xn-xk) - да, программа завершается, когда это выражение < погрешности.
Теперь уже не по программе, а по применению метода вопрос: все правильно?

Отредактировано Omega_Z, 26.10.2009 в 16:25.
Старый 26.10.2009, 16:09
Медведь
ФффыррфррфффФФфф!
offline
Опыт: 21,702
Активность:
а ты учел то, что оба корня могут оказаться в данном интервале?
Старый 26.10.2009, 16:25
Омега

offline
Опыт: 12,033
Активность:
Мне вроде один нужен, я так понял, что любой.
А если честно, то я из темы нихрена не понял, сейчас лабораторную сдавать, в течении недели, лучше завтра или в среду. Вот и взялся. У меня в конспекте указано то, что нужно найти просто интервал, в котором находится корень, при то, что расстояние между левым и правым меньше погрешности.

Отредактировано Omega_Z, 26.10.2009 в 16:35.
Старый 26.10.2009, 16:30
Медведь
ФффыррфррфффФФфф!
offline
Опыт: 21,702
Активность:
Omega_Z, обрати внимание, у тя там лежит проверка на то, чтобы на разных концах интервала функция имела разные значения. А если оба корня лежат в этом интервале, то у функции буит одинаковый знак концах. Так что это витально.
Старый 26.10.2009, 16:33
Омега

offline
Опыт: 12,033
Активность:
Зачет или незачет?
Что исправить?
Старый 26.10.2009, 16:37
Медведь
ФффыррфррфффФФфф!
offline
Опыт: 21,702
Активность:
добавь это:
if (fxn*fxi >0) and (fxi*fxk>0) then writeln('Корней нет!')
if fxn*fxi<0 then xk:=xi; определение интервала где находится корень
if fxi*fxk<0 then xn:=xi; так же
здесь измени "<" на "<="
Хотя это тоже кривое решение.
Старый 26.10.2009, 17:25
Омега

offline
Опыт: 12,033
Активность:
Он же должен быть отрицательным, а 0 число не отрицательное. Нафиг <=.
Про корней нет добавил.
В принципе, так и оставлю.
Спасибо.
Старый 26.10.2009, 17:54
NCrashed

offline
Опыт: 13,553
Активность:
Убери goto, за это повесили много программистов. Делай по правилам структурного программирования.
Старый 26.10.2009, 19:15
Омега

offline
Опыт: 12,033
Активность:
NCrashed, да я там уже все переделал, что совпадает с верхним постом только в общих чертах.
Goto не уберу, ибо мне так удобней, а на правила пофиг абсолютно, т.к. делаю только для себя.
Старый 26.10.2009, 22:07
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 22:05.