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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2012, 11:23   #1
D-Snaker
Пользователь
 
Регистрация: 07.08.2008
Сообщений: 34
Радость Метод итераций. Рекурсия

День добрый, товарищи.

Задачка есть.
Уточнить корень уравнения ln(x)- x +1.8 =0 на отрезке [2; 3]
методом простой итерации с погрешностью 0.0001.

Я сделал все что нужно, однако не методом итерации, а дихотомии, на метод итераций мозга не хватило. Помогите разобраться, как переделать этот код:
Код:
program v5z3;

const
  eps = 0.0001;

var
  a, b, rez: real;

function u(x: real): real;
begin u := ln(x) + 1.8; end;

function recurs(a, b, eps: real): real;
var
  x: real;
begin
  x := u(a);
  while abs(u(x)) < eps do x := u(x);
  recurs := x;
end;

begin
  a := 2;
  b := 3;
  
  writeln(recurs(2, 3, 0.0001));
end.
D-Snaker вне форума Ответить с цитированием
Старый 21.06.2012, 03:41   #2
Npwas
Форумчанин
 
Аватар для Npwas
 
Регистрация: 26.09.2011
Сообщений: 158
По умолчанию

Цитата:
Сообщение от D-Snaker Посмотреть сообщение
Я сделал все что нужно, однако не методом итерации, а дихотомии, на метод итераций мозга не хватило. Помогите разобраться.
Вообщем плане, то что принцип итерации это неизвестное кол-во повторений операции в цикле, для чего обычно и используется Repeat <операции> Until условие;

Вот итерационные вариант:
Код:
function iterazija(a, b, eps: real): real;
 var
  x,g,z:real;
 begin
   x:=u(a);//Начальное значение x
  Repeat
    g:=x;  //Предыдущее значение
    x:=u(x); //Текущие Значение
    z:=x-g;  //Разница между значениями оперделяет точность рассчета
  Until z>eps;
  x:=x-z; //Отнимаем последний эл-т как лишний
  iterazija:=x; //И результат идеально совпадает с твоим
 end;
_____________
<---- Весы благодарности там.
<----Весы Там.
Npwas вне форума Ответить с цитированием
Старый 21.06.2012, 06:08   #3
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Товарищ автор, нет у этого уравнения на заданном отрезке корня (корней).
Т.к. функция возрастающая, то по значениям функции на концах отрезка видно, что решения нет
ln(2) + 1.8 = 2.49 <> 2
ln(3) + 1.8 = 2.90 <> 3

Так что все ваши алгоритмические потуги - пустые хлопоты. "Уточнять" то чего нет - задача неблагодарная.

Дихотомия, а также рекурсия никакого отношения не имеет к вашему коду.
Это цикл с обычной итерацией (не гнушайтесь Википедией, она всегда под рукой).
Karabash вне форума Ответить с цитированием
Старый 21.06.2012, 07:01   #4
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Корень есть.
У него же функция: ln(x)- x +1.8
Изображения
Тип файла: gif ris.gif (3.9 Кб, 93 просмотров)
_Dmitry вне форума Ответить с цитированием
Старый 21.06.2012, 07:50   #5
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Функция, да, но надо найти корень (решение) уравнения ln(x)- x +1.8 = 0.
_Dmitry, взгляните на свой график и найдите на отрезке от 2 до 3 значение функции, лежащее также в этом диапазоне. Там не может быть таких значений, а следовательно, нет и корня.
Опять же, график какой-то не той функции.
У меня график получился другой. И это естественно, т.к. функция по мере роста аргумента увеличивает свое значение (логарифмическая, возрастающая).
Изображения
Тип файла: png 001.png (8.4 Кб, 84 просмотров)

Последний раз редактировалось Karabash; 21.06.2012 в 07:55.
Karabash вне форума Ответить с цитированием
Старый 21.06.2012, 07:51   #6
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Npwas Посмотреть сообщение
для чего обычно и используется Repeat <операции> Until условие;
Вот итерационные вариант:
Все это хорошо, но вопрос все же был не про repeat-until, а именно про рекурсию..
Цитата:
//И результат идеально совпадает с твоим
Гм.. Правда чтоль? у меня не совпал, но я своему доверяю больше:
x = 2.84586818
А код автора темы решением никак не назовешь.. ))
Цитата:
Сообщение от Karabash Посмотреть сообщение
Товарищ автор, нет у этого уравнения на заданном отрезке корня (корней).
Т.к. функция возрастающая, то по значениям функции на концах отрезка видно, что решения нет
ln(2) + 1.8 = 2.49 <> 2
ln(3) + 1.8 = 2.90 <> 3

Так что все ваши алгоритмические потуги - пустые хлопоты. "Уточнять" то чего нет - задача неблагодарная.

Дихотомия, а также рекурсия никакого отношения не имеет к вашему коду.
Это цикл с обычной итерацией (не гнушайтесь Википедией, она всегда под рукой).
Что-то ны путаешь, товарищ Карабаш..
Корень на указанном участке прекрасно есть, а что до рекурсии - так ТС явно сказал, что смог ее сделать (хотя, согласен, дихотомией там тоже не пахнет). А твои доводы (ага, f(x)<>x на концах отрезка) выглядят в высшей степени странно..

Короче, D-Snaker, лови решение с рекурсией
Код:
const
  eps = 0.00000000001;

function u(x: real): real;
begin
  u := ln(x) + 1.8
end;

function recurs(x: real): real;
begin
  if Abs(x-u(x))<eps then
    recurs:= x
  else
    recurs:= recurs(u(x))
end;

begin
  writeln(recurs(2.5));
end.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 21.06.2012, 07:55   #7
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Karabash Посмотреть сообщение
У меня график получился другой. И это естественно, т.к. функция по мере роста аргумента увеличивает свое значение (логарифмическая, возрастающая).
о_О ))
А ты не добавил бы еще на этот рисуночек и функцию y=x, а? Так, для красоты..
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 21.06.2012, 08:13   #8
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Код:
Что-то ны путаешь, товарищ Карабаш..
Признаю свою неправоту, товарищ, TinMan. Не уделил достаточно внимания вопросу.
Подсчитанный тобой корень абсолютно справедлив.
А на рисуночке, действительно, для красоты добавлено.

_Dmitry, и с графиком я не прав. Функция, которая для красоты добавлена одна, а график от другой функции (ln(x) +1.8). Ваш график правильный.

D-Snaker, прислушайтесь к более компетентным товарищам - они во всем правы (проверено).

Да, совсем хреновенький из меня математик. Постараюсь не высовываться по таким темам.

Последний раз редактировалось Karabash; 21.06.2012 в 08:49.
Karabash вне форума Ответить с цитированием
Старый 21.06.2012, 11:06   #9
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Karabash Посмотреть сообщение
Да, совсем хреновенький из меня математик. Постараюсь не высовываться по таким темам.
да лан те.. пока человек вникает в то, что ему говорят, и правильно реагирует на критику - все в порядке. Все ошибаются. Что ж теперь - и не говорить совсем? ))
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 21.06.2012, 18:04   #10
D-Snaker
Пользователь
 
Регистрация: 07.08.2008
Сообщений: 34
По умолчанию

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
МЕТОД ИТЕРАЦИЙ антонййй Помощь студентам 0 12.04.2011 21:47
Метод итераций sgvampir Помощь студентам 2 15.01.2011 16:12
Безумно сложные задачки!!!! Метод Гаусса, итераций, метод половинного деления, задача Коши и т.д. Хомяк!!!!! Помощь студентам 4 08.07.2009 10:08
Метод итераций и метод Зейделя prikolist Общие вопросы C/C++ 40 18.06.2009 17:40
Метод итераций и комбинированный метод prikolist Общие вопросы C/C++ 2 16.06.2009 20:51