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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2013, 20:44   #1
Орлов Никита
Пользователь
 
Регистрация: 07.11.2012
Сообщений: 18
По умолчанию Решение уравнения методом итераций

Здравствуйте. Хотел попросить у Вас помощи. Я написал программу в паскале, которая решает уравнение методом итераций.
Вот код:
Код:
var xm,xk,x:real;
i:integer;
const e=0.001;
   begin
i:=0; xk:=1;
While abs(xk-xm)>e do begin
                      xm:=xk;
                      xk:=xm-(3*xm-exp(xm))/2;
                      i:=i+1;
                      end;
writeln(xk);
writeln(i);
   end.
Интервал от 0 до 1. Максимальное значение производной на этом интервале равно 2, именно поэтому я делю на два мое уравнение. Само уравнение имеет вид 3х-е^х=0
Когда я беру первоначальное значение xk=1, то программа находит корень, но если я возьму xk=2, то вылетает ошибка "nan". Я уже и логарифмировал уравнение, выражал "х" различными способами, ничего не помогает. Пожалуйста, если можете, подскажите..
Орлов Никита вне форума Ответить с цитированием
Старый 20.04.2013, 21:56   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

А вставить внутри цикла диагностическую печать и посмотреть, что происходит?
s-andriano вне форума Ответить с цитированием
Старый 20.04.2013, 22:04   #3
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Может, это как-то связано с тем, что Вы используете неинициализированную переменную в функции abs? Потому что у меня, например, код Ваш работает.
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 20.04.2013, 22:19   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Да нет, там при выборе в качестве начального значения 2 итерация банально расходится.
s-andriano вне форума Ответить с цитированием
Старый 20.04.2013, 22:26   #5
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Да, точно. Я когда у себя запускал забыл поменять начальное значение. Действительно расходится.
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 20.04.2013, 22:41   #6
Орлов Никита
Пользователь
 
Регистрация: 07.11.2012
Сообщений: 18
Смущение

Цитата:
Сообщение от s-andriano Посмотреть сообщение
А вставить внутри цикла диагностическую печать и посмотреть, что происходит?
Простите..Я не очень понимаю что это такое..Не могли бы Вы мне подсказать как это можно осуществить?

Цитата:
Да нет, там при выборе в качестве начального значения 2 итерация банально расходится.
Так..можно ли как-то разрешить эту неувязочку......?
Орлов Никита вне форума Ответить с цитированием
Старый 20.04.2013, 22:47   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Например, так:
Код:
var
  xm,xk,x:real;
  i:integer;
const e=0.001;
begin
  i:=0;
  xk:=2;
  While abs(xk-xm)>e do begin
    writeln('xm: ',xm:1:6,' xk: ',xk:1:6,' i: ',i,' abs: ',abs(xk-xm):1:6);
    xm:=xk;
    xk:=xm-(3*xm-exp(xm))/2;
    i:=i+1;
  end;
writeln(xk);
writeln(i);
end.
s-andriano вне форума Ответить с цитированием
Старый 21.04.2013, 10:09   #8
Орлов Никита
Пользователь
 
Регистрация: 07.11.2012
Сообщений: 18
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Например, так:
Код:
var
  xm,xk,x:real;
  i:integer;
const e=0.001;
begin
  i:=0;
  xk:=2;
  While abs(xk-xm)>e do begin
    writeln('xm: ',xm:1:6,' xk: ',xk:1:6,' i: ',i,' abs: ',abs(xk-xm):1:6);
    xm:=xk;
    xk:=xm-(3*xm-exp(xm))/2;
    i:=i+1;
  end;
writeln(xk);
writeln(i);
end.
Там получаются числа большие..И я теперь не знаю что делать...
Орлов Никита вне форума Ответить с цитированием
Старый 21.04.2013, 13:56   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

В первом сообщении Вы писали, что предварительно оценили величину производной на интервале от 0 до 1.
Почему бы Вам не сделать то же самое на интервале от 0 до 2, если Вы собираетесь искать корень именно на этом интервале?

Опять же, вычислять производную можно не только заранее и ручками, но и в процессе расчета, чтобы соотнести с ней величину шага.
s-andriano вне форума Ответить с цитированием
Старый 22.04.2013, 20:51   #10
Орлов Никита
Пользователь
 
Регистрация: 07.11.2012
Сообщений: 18
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
В первом сообщении Вы писали, что предварительно оценили величину производной на интервале от 0 до 1.
Почему бы Вам не сделать то же самое на интервале от 0 до 2, если Вы собираетесь искать корень именно на этом интервале?

Опять же, вычислять производную можно не только заранее и ручками, но и в процессе расчета, чтобы соотнести с ней величину шага.
К сожалению, не выходит..но все равно спасибо за помощь
Орлов Никита вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Корень уравнения методом итераций Тошкин Паскаль, Turbo Pascal, PascalABC.NET 0 06.12.2012 00:10
решение неленейного уравнения методом простых итераций в паскале mila111189 Помощь студентам 24 04.05.2011 19:34
Написать Модуль для решения уравнения методом итераций Константинн Помощь студентам 0 01.03.2011 20:50
Найти корень уравнения методом итераций. MASOFF Помощь студентам 0 28.01.2011 16:42
Решение уравнения методом простых итераций, Floating poin:Squere root of Negative number Wrack Общие вопросы C/C++ 1 27.10.2010 17:04