18.05.2014, 21:56 | #11 (permalink) |
Member
Регистрация: 14.05.2014
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Begin I[0]:=1; t:=0; writeln('y(0) I= ',I[0]:6:3); for j:=1 to N do begin z:=I[j-1]+h/2*f2(0+t,I[j-1]; I[j]:=I[j-1]+h*f2((0+t)+(h/2),z); writeln('y(',t+h,') I= ',I[j]:6:3); t:=t+h end; end. такой вот кусок кода у меня получился =) то же самое можно сказать |
18.05.2014, 21:56 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Похожие посты уже встречались на нашем форуме, обратите внимание Погрешности для вычисления объема шара. Численные методы Turbo Pascal Turbo Pascal |
18.05.2014, 22:06 | #12 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Нельзя. Потому как куча ошибок. На будущее: работу над программой можно считать законченной только после запуска, проверки, тестирования и т.д. Тогда и вылезут перлы вроде незакрытой скобки в
z:=I[j-1]+h/2*f2(0+t,I[j-1]; И потом - ну что еще за "шедевры": 0+t ?! Ноль он, знаете, и в Африке ноль, и прибавляй его, не прибавляй - всё едино! |
18.05.2014, 22:12 | #13 (permalink) |
Member
Регистрация: 14.05.2014
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
да вы конечно правы, если бы вы не написали всю программу, я бы писал программу кусками, (делал бы из них работоспособную программу) и там да уже все ошибки бы вылезли, а 0+t это просто переделывал прошлую формулу, ну и при замене не подумал что можно было просто t оставить, а я 0 зачем то приписал.
|
18.05.2014, 22:22 | #14 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Между прочим, я любопытства ради поинтересовался, велико ли отличие метода, предлагаемого Вашими преподами, от того, что в Википедии, для чего сосчитал и так, и так. Ну вот, судите сами (I - это как с Вас требуют, I1 - по Википедии): |
|
19.05.2014, 18:26 | #15 (permalink) |
Member
Регистрация: 14.05.2014
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
вы уж извините, побеспокою вас еще раз, что то вот смотрю на алгоритм нахождения коэффициента k, и любо я чего то недопонимаю, или он как то неправильно работает.
[-1.5;1.5] вот из этого интервала он начинает искать (я подшаманил код, и теперь программа сама находит нужный интервал. в отличии от заданного заранее). вот кусок кода Repeat writeln('[',a:1:5,';',b:1:5,']'); writeln(txt,'[',a:1:5,';',b:1:5,']'); c:=(a+b)/2; if G(a)*G(c)<0 then b:=c else a:=c; Until b-a<Eps; EQRoot:=c; последний интервал, после которого цикл заканчивается: [1.42621;1.42639] k=1.42630 НО b-a=0.00018 и оно никак не меньше Eps=0.0001 и еще одно по моей методичке написано что должна быть (b-a)/2<Eps а вы написали b-a, тоже вопрос где опечатка у меня или у вас =), ну так вот. даже если подставить в код (b-a)/2<Eps то последний интервал будет [1.42603;1.42639] k=1.42621 и (b-a)/2=0.00018 то же самое и опять Еps меньше. И вот собственно вопрос, почему цикл заканчивается преждевременно, или я конкретно что то не так понял. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
19.05.2014, 19:38 | #16 (permalink) | ||
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Цитата:
И зачем, интересно, лезть в отрицательную область, когда в условии записано "первый положительный корень"? Ну можно, конечно, ежели очень хочется. А вот с этого места, пожалуйста, поподробнее. Это как же Вам такое удалось? |
||
19.05.2014, 19:50 | #17 (permalink) |
Member
Регистрация: 14.05.2014
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Function EQRoot:real;
var a,b,c,d:real; begin d:=0.1; repeat b:=d; a:=-b; if G(a)*G(b)>=0 then writeln('[',a:1:1,';',b:1:1,'] f(a)*f(b)>0') Else writeln('[',a:1:1,';',b:1:1,'] f(a)*f(b)<0'); if G(a)*G(b)>=0 then writeln(txt,'[',a:1:1,';',b:1:1,'] f(a)*f(b)>0') Else writeln(txt,'[',a:1:1,';',b:1:1,'] f(a)*f(b)<0'); d:=d+h until G(a)*G(b)<=0; writeln('mojno primenit metod polovinnogo deleniya'); writeln(txt,'mojno primenit metod polovinnogo deleniya'); Writeln('tochnost rascheta e=0.0001'); Writeln(txt,'tochnost rascheta e=0.0001'); Repeat writeln('[',a:1:5,';',b:1:5,']'); writeln(txt,'[',a:1:5,';',b:1:5,']'); c:=(a+b)/2; if G(a)*G(c)<0 then b:=c else a:=c; Until b-a<Eps; EQRoot:=c; end; ну вот как то так. Хотя после ваших слов действительно подумал, а на кой мне в отрицательную область лезть, а:=0 а b уже изменять с определенным шагом пока не получу нужный интервал. |
19.05.2014, 20:13 | #18 (permalink) |
Member
Регистрация: 14.05.2014
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
О и я кажется разобрался в чем у меня проблема была, последний интервал не выводился на экран т.к. в цикле я сначала вывожу на экран, а потом уже интервал меняется и следовательно цикл заканчивается не показав последний найденный интервал, я вывел его на экран уже после цикла, и кстати, мне кажется корень правильнее найти вот так:
Изменения пометил синим. т.к. "с" мы присвоили значение вычисленное из предпоследнего интервала, а после уже нашли итоговый интервал. Я и добавил после цикла то что мне показалось нужным. Верно ли так? Repeat writeln('[',a:1:5,';',b:1:5,']'); writeln(txt,'[',a:1:5,';',b:1:5,']'); c:=(a+b)/2; if G(a)*G(c)<0 then b:=c else a:=c; Until b-a<Eps; c:=(a+b)/2; writeln('[',a:1:5,';',b:1:5,']'); EQRoot:=c; end; |
20.05.2014, 09:24 | #19 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Да, соглашусь - так лучше.
P.S. А еще загляните сюда и обратите внимание, насколько традиционная процедура Рунге-Кутты второго порядка с коррекцией (вариант 1) точнее той, что вам впендюривают ваши преподы (вариант 2). Вот лишь бы выпендриться - математики, блин... |
20.05.2014, 12:30 | #20 (permalink) |
Member
Регистрация: 14.05.2014
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Владимир. Спасибо вам большое за все советы и помощь. Благодаря вам я хорошо разобрался в материале.
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|