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

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

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

> метод итераций по образцу с форума, выдает ошибку
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
Ответов(1 - 19)
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


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

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


Новичок
*

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

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


но и решения оно не выдает тоже(... Может подскажете, как эту программу правильно написать? или ссылку на рабочую, похожую..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


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

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

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


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

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






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


Новичок
*

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

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


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

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

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


Гость






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

Оно и выводится СРАЗУ. Просто ты не успеваешь заметить, потому что программа заканчивает работу очень быстро, и ты снова оказываешься в редакторе. Если хочешь задержать программу, чтоб сразу не заканчивалась, поставь
readln;
перед последним end. Тогда тебе надо будет нажать enter, чтоб снова попасть в редактор.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Новичок
*

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

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


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


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

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

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


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

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

write(x:a:b);

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

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


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


Новичок
*

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

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


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


Гость






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


Профи
****

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

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


Выложи полный код со всеми исправлениями,чтобы мы могли взглянуть.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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.

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


Профи
****

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

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


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

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


Гость






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

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

 





- Текстовая версия 29.05.2024 4:25
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name