IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> метод итераций по образцу с форума, выдает ошибку
Ven
сообщение 9.10.2011 22:17
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Женский

Репутация: -  1  +


нужно решить уравнение методом простых итераций. Задачу нашла на форуме в FAQ


сделала по образцу, в итоге ошибка 205: Floating Point Overlow


program ITERAT;
uses crt;

const max_iter=100; {maksimal'noe chislo iteraciy}

var

i: integer;
x,x0,eps,M: real;

function F(x:real):real; {funkciya}

begin

F:= x*x + x + 0.09;
end;

begin {osnovnaya programma}
clrscr;
write('Vvedite priblijennoe znachenie x='); readln(x);
write('Vvedite tochnost vichisleniy eps='); readln(eps);

i:=0;
repeat
x0:=x;
x:=x0+F(x0);
inc(i);
writeln('---Iteraciya ' , i:3,' x=',x);
writeln('F(x)=' , F(x),' tochnost=' , abs(x-x0));
until (abs(x-x0)<=eps) or (i>max_iter);

if (abs(x-x0)<=eps) then writeln ('Otvet: X=' , x)
else writeln('OTVET NE NAYDEN!!! za ',max_iter:0,' shagov iteraciya ne soshlas');

end.





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

Добавлено через 15 мин.
кстати,когда выдает ошибку - возращает меня на строку
Цитата
F:= x*x + x + 0.09;


Сообщение отредактировано: Ven - 9.10.2011 22:21
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 9.10.2011 23:30
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
сделала по образцу, в итоге ошибка 205: Floating Point Overlow
Значит, задаешь начальное приближение неверно. Потом X постоянно увеличивается, и на каком-то этапе становится настолько большим, что попытка возвести его в квадрат приводит к FPO...

Попробовал. В качестве начального приближения ввел -1, программа не вылетела...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Ven
сообщение 10.10.2011 8:47
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Женский

Репутация: -  1  +


но и решения оно не выдает тоже(... Может подскажете, как эту программу правильно написать? или ссылку на рабочую, похожую..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 10.10.2011 9:49
Сообщение #4


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Ven @ 10.10.2011 9:47) *
но и решения оно не выдает тоже(...

Ven, дело в том, что область сходимости тут действительно очень узкая. Задай x=-0.5 - и получишь ответ, левую точку (-0.9). Метод итераций очень капризный - с одной стороны. А с другой - имеет много свобод. Вот смотри..

Ты имеешь уравнение

F(x) = 0

По нему ты конструируешь

F(x) + x = x

- и пользушься им. Но можно же исходное уравнение домножить на любой множитель:

a*F(x) = 0

И тогда ты получишь:

a*F(x) + x = x

Коэффициент a можно подобрать так, чтобы расхирить зону сходимости. Для этого можно его специально подобрать (по формулам), но можно для начала и просто попробовать разные значения. Например, если положить a=-1, то получим

-F(x) + x = x

Если ты внесешь это изменение в программу и снова задашь начальное значение x=-0.5, то ты теперь получишь уже правый корень (-0.1). Потом попробуй задать a=0.1, и зона сходимости расширится довольно неплохо. Можно будет начинать, скажем, с -10 или с +5. Попробуй )). А потом попробуй a=-0.1. Попробуй и одну сотую.. Ты увидишь, что чем меньше (по модулю) этот коэффициент - тем лучше )). Но при его уменьшении сходимость хоть и стабилизируется, но и замедляется. Рекомендую увеличить максимальное число итераций по крайней мере до 1000.
Давай, дерзай. И показывай результаты )).

P.S.
Помню, когда-то я этим занимался, так я там встроил в код автоматический подбор коэффициента по характеру функции.. ))


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 10.10.2011 10:01
Сообщение #5


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата(Ven @ 10.10.2011 7:47) *
но и решения оно не выдает тоже(...
Правда?

Vvedite priblijennoe znachenie x=-1
Vvedite tochnost vichisleniy eps=0.01
---Iteraciya 1 x=-9.10000000000000E-001
F(x)= 8.10000000000003E-003 tochnost= 8.9999999999999969E-0002
---Iteraciya 2 x=-9.01900000000000E-001
F(x)= 1.52361000000003E-003 tochnost= 8.0999999999999961E-0003
Otvet: X=-9.01900000000000E-001

То есть, -0.9 это уже не решение?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 10.10.2011 10:23
Сообщение #6


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(IUnknown @ 10.10.2011 11:01) *
Правда?
...
То есть, -0.9 это уже не решение?

Упс! Володь, извини..
всегда надо самому проверять.. Я подумал - по количеству итераций вылетает.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Ven
сообщение 10.10.2011 13:25
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Женский

Репутация: -  1  +


Цитата(IUnknown @ 10.10.2011 10:01) *

Правда?

Vvedite priblijennoe znachenie x=-1
Vvedite tochnost vichisleniy eps=0.01
---Iteraciya 1 x=-9.10000000000000E-001
F(x)= 8.10000000000003E-003 tochnost= 8.9999999999999969E-0002
---Iteraciya 2 x=-9.01900000000000E-001
F(x)= 1.52361000000003E-003 tochnost= 8.0999999999999961E-0003
Otvet: X=-9.01900000000000E-001

То есть, -0.9 это уже не решение?

когда я набираю -1 и 0,01 меня просто выкидывает в саму программу..сейчас еще раз проверю всё

Сообщение отредактировано: Ven - 10.10.2011 13:31
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость
сообщение 10.10.2011 13:28
Сообщение #8


Гость






Нажми Alt-F5
И еще совет: убери ужасный clrscr, тогда ты будешь видеть результаты предыдущего прогона тоже - а это полезно.
 К началу страницы 
+ Ответить 
Ven
сообщение 10.10.2011 13:34
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Женский

Репутация: -  1  +


Цитата(Гость @ 10.10.2011 13:28) *

Нажми Alt-F5
И еще совет: убери ужасный clrscr, тогда ты будешь видеть результаты предыдущего прогона тоже - а это полезно.

Спасибо.А без Alt-F5 можно как нибудь вывести сразу?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость
сообщение 10.10.2011 13:40
Сообщение #10


Гость






Цитата(Ven @ 10.10.2011 13:34) *
Спасибо.А без Alt-F5 можно как нибудь вывести сразу?

Оно и выводится СРАЗУ. Просто ты не успеваешь заметить, потому что программа заканчивает работу очень быстро, и ты снова оказываешься в редакторе. Если хочешь задержать программу, чтоб сразу не заканчивалась, поставь
readln;
перед последним end. Тогда тебе надо будет нажать enter, чтоб снова попасть в редактор.
 К началу страницы 
+ Ответить 
Ven
сообщение 10.10.2011 13:42
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Женский

Репутация: -  1  +


и еще. мне дали вот такую программу, но я в ней особо не смогла разобраться. задание то же.
Она в ответ выводит нормальное число.. В моей программе как нибудь можно это сделать?
Пы.Сы. Извиняюсь конечно за такие вопросы,просто я не особо опытная в написании программ) пытаюсь разобраться)


var xj , xi : Real;

var precision : Integer;

var solution : String;

{ f(x) = exp(x) + x = 0 }
Function f(x: Real): Real;

begin

f:= exp(x) + x;

end; {f}


{ Df(x) - derivative of f(x) }
Function Df(x: Real): Real;

begin

Df:= exp(x) + 1;

end; {Df}


begin

xj := 0;

writeln('Enter precision of solution... ');

readln(precision);

repeat

xi := xj ;

xj := xi - f(xi)/Df(xi) ;

until abs( xi - xj ) < exp( ln( 10 ) * ( -precision ) ); {|xi-xj|<10^(-precision)}

Str(xj: 20: precision ,solution);

writeln('the solution is ' + solution);

readln;


end.



нормальное- в смысле "-0,6" и т.п.

Сообщение отредактировано: Ven - 10.10.2011 13:44
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 10.10.2011 13:54
Сообщение #12


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


ты что-то такое имеешь в виду?
  l:= Round(-ln(eps)/ln(10));
if (abs(x-x0)<=eps) then writeln ('Otvet: X=' , x:l+3:l)
else writeln('OTVET NE NAYDEN!!! za ',max_iter:0,' shagov iteraciya ne soshlas');

Только не забудь описать l, как целую переменную.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Ven
сообщение 10.10.2011 13:57
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Женский

Репутация: -  1  +


именно это) Спасибо большое!
а можешь разъяснить x:l+3:l -вот это? или может как мне в поисковике набрать,почитать,по какому принципу это делается? Хочется не просто написать, а понять)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 10.10.2011 14:06
Сообщение #14


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Ven @ 10.10.2011 14:57) *
а можешь разъяснить x:l+3:l -вот это?

Нет пробем ).
Это форматированный вывод вещественного числа.

write(x:a:b);

Первое число, a - длина поля вывода, второе, b - количество знаков после точки. Обычно в таких случаях пишут константы (как у тебя i:3 написано), но можно и выражения с переменными.

Я посчитал через точность, сколько знаков после точки, а на все поле вывода еще три набросил - вот и все )).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Ven
сообщение 10.10.2011 14:10
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Женский

Репутация: -  1  +


Огромное спасибо! wub.gif
Вы мне очень помогли))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость
сообщение 15.01.2012 20:04
Сообщение #16


Гость






Это снова я))) В общем программу я так и не сдала... Собственно, в чем вопрос: При различных значениях eps значения должны совпадать, разница только в кол-ве цифр после запятой... а у меня с разной точностью разные цифры... Кто-нибудь может подсказать в чем ошибка? (программа в первом посте)
 К началу страницы 
+ Ответить 
Krjuger
сообщение 15.01.2012 21:05
Сообщение #17


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Выложи полный код со всеми исправлениями,чтобы мы могли взглянуть.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость
сообщение 15.01.2012 21:20
Сообщение #18


Гость






 program ITERAT;
uses crt;

const max_iter=100; {maksimal'noe chislo iteraciy}

var

i,l: integer;
x,x0,eps: real;

function F(x:real):real; {funkciya}

begin

F:= x*x + x + 0.09;
end;

begin {osnovnaya programma}
write('Vvedite priblijennoe znachenie x='); readln(x); {x0 kak mojno blije k iskom}
write('Vvedite tochnost vichisleniy eps='); readln(eps);

i:=0;
repeat
x0:=x;
x:=x0+F(x0);
inc(i); {uvel/znach/per-y}
writeln('---Iteraciya ',i:3,' x=',x);
writeln('F(x)=', F(x),' tochnost=', abs(x-x0));
until (abs(x-x0)<=eps)or(i>max_iter);


if (abs(x-x0)<=eps) then writeln ('Otvet: X=', x)
else writeln('OTVET NE NAYDEN!!! za ',max_iter:0,' shagov iteraciya ne soshlas');
readln;
end.

 К началу страницы 
+ Ответить 
Krjuger
сообщение 15.01.2012 21:45
Сообщение #19


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Покажите примеры для которых у вас получаются разные значения....А то я проблемы не вижу.Если не считать проблемой попытки взять положительное число и получить переполнение.

Сообщение отредактировано: Krjuger - 15.01.2012 21:46
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость
сообщение 16.01.2012 20:54
Сообщение #20


Гость






смысл в том что первые числа должны совпадать, вот например при 0,01 ответ 0,56487..... при 0,001 ответ 0,5669089..... и т.д. (это значения из программы которую сдавали ранее ему,для другой ф-ции, но самой проги у меня нет,чтоб посмотреть)
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 2:26
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"