Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2007, 16:25   #1
Absent
Пользователь
 
Регистрация: 18.11.2007
Сообщений: 67
По умолчанию Вычисление корня уравнения методом деления отрезка пополам

Пожалуйста помогите решить задачу
необходимо решить с функцией, а потом с процедурой
Вычисление корня уравнения методом деления отрезка пополам

Напишите программу, которая находит корень уравнения вида f(x) = 0 методом деления отрезка пополам с заданной точностью E.

Нас интересует интервал [a, b], на котором функция непрерывна и монотонна и на концах интервала принимает значения разных знаков. Тогда на этом интервале функция имеет ровно один корень и его можно приблизительно определить следующим образом. Разделить интервал [а, b] на две части точкой x = (а + b) / 2 и вычислить значение f(x). После этого из двух получавшихся интервалов [а, x] и [x, b] рассматривать тот, на концах которого функция принимает значения разных знаков, именно он содержит корень. Продолжить процесс поиска корня для вновь образованного интервала. Процесс будет закончен, когда длина очередного интервала станет меньше значения E. Следовательно, любая точка интервала будет представлять значение корня с точностью eps.
Absent вне форума Ответить с цитированием
Старый 24.11.2007, 16:36   #2
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

У тебя ведь все написано
Код:
repeat
  x:=(a+b)/2;
  if f(a)*f(x) < 0 then b:=x 
                   else a:=x;
until abs(b-a) <= E;
_Dmitry вне форума Ответить с цитированием
Старый 24.11.2007, 17:15   #3
Absent
Пользователь
 
Регистрация: 18.11.2007
Сообщений: 67
По умолчанию

Требуется написать с процедурой и функцией
я вот написал но что-то компу не нравится


program rabot;

{$APPTYPE CONSOLE}

uses
SysUtils;
Var a,b,e,x:real;
function Y(x:real): real;
begin
y:=-cos(exp(0.49*ln(x))+sqrt(30/7))+exp(1/5*ln(x))/x-x;;
end;
procedure KOR (A,b,e : real);
begin
if a<b then if y(a)*y(b)>0 then write ('HET KOPHEU')

else
begin
while abs(a-b)>=2*E do
begin
x:=(a+b)/2;
if y(a)*y(b)>0 then b:=x
else a:=x;
BEGIN
x:=(a+b)/2;
writeln('x=', x) ;
BEGIN
end
else writeln('vod nevepen');
readln;
END;
end;
END ;
end;
Begin
writeln('a=');
readln(a);
writeln('b=');
readln(b);
writeln('E=');
readln(E);
KOR(A,b,e);
readln;
end.
Absent вне форума Ответить с цитированием
Старый 24.11.2007, 17:28   #4
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Немного поправил
Код:
program rabot;

{$APPTYPE CONSOLE}

uses SysUtils;

Var a,b,e,x:real;

function Y(x:real): real;
begin
  y:=-cos(exp(0.49*ln(x))+sqrt(30/7))+exp(1/5*ln(x))/x-x;
end;

procedure KOR (A,b,e : real);
begin
  if (a>b) or (y(a)*y(b)>0) then write ('HET KOPHEU')
  else
    begin
      while abs(a-b)>=E do
        begin
          x:=(a+b)/2;
          if y(a)*y(x)<0 then b:=x
                         else a:=x;
        end;
      writeln('x=', x);
    end;
end;

Begin
  write('a='); readln(a);
  write('b='); readln(b);
  write('E='); readln(E);
  KOR(A,b,e);
  readln;
end.

Последний раз редактировалось _Dmitry; 24.11.2007 в 17:34.
_Dmitry вне форума Ответить с цитированием
Старый 24.11.2007, 18:06   #5
Absent
Пользователь
 
Регистрация: 18.11.2007
Сообщений: 67
По умолчанию

В задаче говорят подставьте значения a=0 b=2 e=0.0004
При вводе этих данных программа пролистывается и вылетает. Вроде readln'ы везде есть.
*********************************** *****
Программа вылетает только если а=0 , при подставлении других значений она работает. Странно.. Может в программе имеено этот случай не предусмотрен?
Absent вне форума Ответить с цитированием
Старый 24.11.2007, 19:01   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Возможно у Вас неправильно записана функция или интервал. При a=0 неопределен lnx. И вообще эта функция не имеет корня в интервале [0,2].
Вот расчеты в Excel :
Вложения
Тип файла: rar Книга1.rar (2.4 Кб, 34 просмотров)
puporev вне форума Ответить с цитированием
Старый 24.11.2007, 19:25   #7
Absent
Пользователь
 
Регистрация: 18.11.2007
Сообщений: 67
По умолчанию

Как я теперь понял при а=0, X в степени 0.49 , записанный в виде
exp(0.49*ln(x)) не высчитывается т.к lnx не определен. Как же тогда записать X в степени 0.49 без натурального логарифма?
Absent вне форума Ответить с цитированием
Старый 24.11.2007, 20:37   #8
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Здесь ведь еще и деление на х=0.
Обычно вводят условие if x=0 then f(x):=0 else ...
В данном случае можно ввести дополнительные переменные, например:
Код:
if x=0 then u:=0 else u:=exp(0.49*ln(x);
if x=0 then z:=0 else z:=exp(1/5*ln(x))/x;
y:=-cos(u)+sqrt(30/7))+z-x;;
Вроде бы есть другие обходы, но я не помню.

Последний раз редактировалось puporev; 24.11.2007 в 21:03.
puporev вне форума Ответить с цитированием
Старый 25.11.2007, 09:50   #9
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Цитирую условие вашей задачи:
Цитата:
Сообщение от Absent Посмотреть сообщение
Нас интересует интервал [a, b], на котором функция непрерывна и монотонна и на концах интервала принимает значения разных знаков
В точке x=0 функция имеет разрыв и не существует не только из-за логарифма, но и от того, что ноль есть в знаменателе. Поэтому ноль границей интервала быть не может и объясняйте это преподавателю. А для поиска корня вводите другую границу, например, [1, 2].
В Excel задача решена не правильно (см. столбец "D"), там вычисляется значение exp(0.49)*lnx, а в вашей функции exp(0.49*ln(x)).
_Dmitry вне форума Ответить с цитированием
Старый 25.11.2007, 10:17   #10
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Извиняюсь, ошибся. Однако корень этой функции лежит в интервале [2.5,3.0]. (проверял с шагом 0.5)
puporev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение нелинейного уравнения методом Ньютона Tina Общие вопросы C/C++ 2 04.06.2008 21:48
текст программы для решения нелинейного уравнения методом простых итераций Dyst Помощь студентам 2 14.05.2008 22:00
Движение окружности и отрезка. Ev@ngel Компоненты Delphi 0 18.04.2008 22:16
Определить длину отрезка во 2-м квадранте системы координат kolduev Помощь студентам 9 13.02.2008 17:45
Проверка деления на ноль (Как проверить?) Moonka Помощь студентам 10 23.04.2007 19:41