Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 18.05.2014, 21:56   #11 (permalink)
Cbvrf86
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.

такой вот кусок кода у меня получился =) то же самое можно сказать
Cbvrf86 вне форума   Ответить с цитированием

Старый 18.05.2014, 21:56
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Похожие посты уже встречались на нашем форуме, обратите внимание

Погрешности для вычисления объема шара. Численные методы
Turbo Pascal
Turbo Pascal

Старый 18.05.2014, 22:06   #12 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Cbvrf86 Посмотреть сообщение
такой вот кусок кода у меня получился =) то же самое можно сказать
Нельзя. Потому как куча ошибок. На будущее: работу над программой можно считать законченной только после запуска, проверки, тестирования и т.д. Тогда и вылезут перлы вроде незакрытой скобки в
z:=I[j-1]+h/2*f2(0+t,I[j-1];
И потом - ну что еще за "шедевры": 0+t ?! Ноль он, знаете, и в Африке ноль, и прибавляй его, не прибавляй - всё едино!
Vladimir_S вне форума   Ответить с цитированием
Старый 18.05.2014, 22:12   #13 (permalink)
Cbvrf86
Member
 
Регистрация: 14.05.2014
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

да вы конечно правы, если бы вы не написали всю программу, я бы писал программу кусками, (делал бы из них работоспособную программу) и там да уже все ошибки бы вылезли, а 0+t это просто переделывал прошлую формулу, ну и при замене не подумал что можно было просто t оставить, а я 0 зачем то приписал.
Cbvrf86 вне форума   Ответить с цитированием
Старый 18.05.2014, 22:22   #14 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Cbvrf86 Посмотреть сообщение
да вы конечно правы, если бы вы не написали всю программу, я бы писал программу кусками, (делал бы из них работоспособную программу) и там да уже все ошибки бы вылезли, а 0+t это просто переделывал прошлую формулу, ну и при замене не подумал что можно было просто t оставить, а я 0 зачем то приписал.
Удачи!

Между прочим, я любопытства ради поинтересовался, велико ли отличие метода, предлагаемого Вашими преподами, от того, что в Википедии, для чего сосчитал и так, и так. Ну вот, судите сами (I - это как с Вас требуют, I1 - по Википедии):
Миниатюры
aa01.jpg  
Vladimir_S вне форума   Ответить с цитированием
Старый 19.05.2014, 18:26   #15 (permalink)
Cbvrf86
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 меньше.
И вот собственно вопрос, почему цикл заканчивается преждевременно, или я конкретно что то не так понял.
Cbvrf86 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 19.05.2014, 19:38   #16 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Cbvrf86 Посмотреть сообщение
последний интервал, после которого цикл заканчивается: [1.42621;1.42639] k=1.42630 НО b-a=0.00018 и оно никак не меньше Eps=0.0001
Сударь, не надо небылиц: если постусловие не выполнено, то и цикл закончится ну никак не может. И не заканчивается. Вот что вижу я (добавлен ТОЛЬКО вывод промежуточных результатов, остальное сохранено, как есть):
aa02.jpg
Цитата:
Сообщение от Cbvrf86 Посмотреть сообщение
и еще одно по моей методичке написано что должна быть (b-a)/2 а вы написали b-a, тоже вопрос где опечатка у меня или у вас
За содержимое Ваших методичек не отвечаю, но по-моему, чушь несусветная. По крайней мере то, что знаю я по половинному делению, это что расчет заканчивается, когда длина интервала станет меньше заданной точности. Впрочем, поскольку окончательный результат есть (b-a)/2, то можно и так. Тоже годится.
Цитата:
Сообщение от Cbvrf86 Посмотреть сообщение
[-1.5;1.5] вот из этого интервала он начинает искать
И зачем, интересно, лезть в отрицательную область, когда в условии записано "первый положительный корень"? Ну можно, конечно, ежели очень хочется.
Цитата:
Сообщение от Cbvrf86 Посмотреть сообщение
я подшаманил код, и теперь программа сама находит нужный интервал. в отличии от заданного заранее
А вот с этого места, пожалуйста, поподробнее. Это как же Вам такое удалось?
Vladimir_S вне форума   Ответить с цитированием
Старый 19.05.2014, 19:50   #17 (permalink)
Cbvrf86
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 уже изменять с определенным шагом пока не получу нужный интервал.
Cbvrf86 вне форума   Ответить с цитированием
Старый 19.05.2014, 20:13   #18 (permalink)
Cbvrf86
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;
Cbvrf86 вне форума   Ответить с цитированием
Старый 20.05.2014, 09:24   #19 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Cbvrf86 Посмотреть сообщение
Изменения пометил синим. т.к. "с"
Да, соглашусь - так лучше.

P.S. А еще загляните сюда и обратите внимание, насколько традиционная процедура Рунге-Кутты второго порядка с коррекцией (вариант 1) точнее той, что вам впендюривают ваши преподы (вариант 2). Вот лишь бы выпендриться - математики, блин...
Vladimir_S вне форума   Ответить с цитированием
Старый 20.05.2014, 12:30   #20 (permalink)
Cbvrf86
Member
 
Регистрация: 14.05.2014
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Владимир. Спасибо вам большое за все советы и помощь. Благодаря вам я хорошо разобрался в материале.
Cbvrf86 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 22:07.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.