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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2013, 21:03   #1
xenon1000
Новичок
Джуниор
 
Регистрация: 13.02.2013
Сообщений: 4
Вопрос ОДУ методом Эйлера (проверить алгоритм Делфи)

Что не так в данном алгоритме? Почему при данном условии решение выводит все 0, и почему решений 11 всесто 10?
Условие задачи:
Используя метод Эйлера, составить таблицу приближенных значений интеграла дифференциального уравнения y’=3*y^(2/3) на отрезке [0;1] с шагом интегрирования h=0,1 и начальным условием y(0)=0.
Алгоритм в ДЕлфи:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
x,y,a,b,h:real;
function f(x,y:real):real;
 begin
   f:=power(3*y,2/3);
 end;
begin
 ListBox1.Clear;
h:=StrToFloat(Edit1.Text);
y:=StrToFloat(Edit2.Text);
a:=StrToFloat(Edit3.Text);
b:=StrToInt(Edit4.Text);
x:=a;
repeat
y:=y+h*f(x,y);
x:=x+h;
ListBox1.Items.Add(FormatFloat('y(0.###) = ', x) + FormatFloat('0.###', y));
until  (x>b);
   end;
end.

Последний раз редактировалось Stilet; 13.02.2013 в 22:08.
xenon1000 вне форума Ответить с цитированием
Старый 14.02.2013, 10:52   #2
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

А как Вы сами думаете, что там может быть кроме нуля с таким y(0)?
При цикле с таким постусловием он и должен выводить 11 строк, посчитайте сами.

Да, сам алгоритм правильный.

Upd. Я имею ввиду, сам метод Эйлера реализован правильно. А вот этот порядок операции неверный. Угадайте, почему.
Код:
y:=y+h*f(x,y);
x:=x+h;
ListBox1.Items.Add(FormatFloat('y(0.###) = ', x) + FormatFloat('0.###', y));
Upd. 2 А, да.. 3*y^(2/3) это не совсем то же, что power(3*y,2/3).
Μολὼν λαβέ

Последний раз редактировалось alexander13; 14.02.2013 в 11:14.
alexander13 вне форума Ответить с цитированием
Старый 14.02.2013, 19:10   #3
xenon1000
Новичок
Джуниор
 
Регистрация: 13.02.2013
Сообщений: 4
По умолчанию

Просто я не превык решая 1 задачу получать нулевой ответ) при этом этот ответ надо скриншотить.
to Upd. Как не переставлял местами все равно 11 ответов, если поставить вывод в листбокс перед Х то значения у(0) выдает вместо у(1,1). В чем косяк?
to Upd2. f:=3*Power(y,2/3); так да? Иначе 3 тоже возводит в степень.

И последний вопрос. Я скачал готовую прогу написано решает методом эйлера тоже, но там еще навороты - график, оформлено и т.д. Вставляю свою формулу - результат отличается от моего, при у(0)=1 как такое возможно?

Последний раз редактировалось xenon1000; 14.02.2013 в 19:24.
xenon1000 вне форума Ответить с цитированием
Старый 14.02.2013, 19:32   #4
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Цитата:
Сообщение от xenon1000 Посмотреть сообщение
Просто я не превык решая 1 задачу получать нулевой ответ)
Вы подумайте.. и увидите, что там никакого другого ответа и не могло быть при таких начальных данных.

Цитата:
Сообщение от xenon1000 Посмотреть сообщение
Как не переставлял местами все равно 11 ответов, если поставить вывод в листбокс перед Х то значения у(0) выдает вместо у(1,1). В чем косяк?
Ответов и ДОЛЖНО быть 11. Я же говорю, посчитайте. Просто если оставить Ваш порядок операций, то последним будет что-то типа
y(1,1) = ... При том, что у Вас функция вычисляется на отрезке [0,1] - как такое может быть?

Цитата:
Сообщение от xenon1000 Посмотреть сообщение
to Upd2. f:=3*Power(y,2/3); так да? Иначе 3 тоже возводит в степень.
Да.

Цитата:
Сообщение от xenon1000 Посмотреть сообщение
И последний вопрос. Я скачал готовую прогу написано решает методом эйлера тоже, но там еще навороты - график, оформлено и т.д. Вставляю свою формулу - результат отличается от моего, при у(0)=1 как такое возможно?
Я не телепат, не знаю, что Вы там скачали. Ради проверки я тоже нашел исходники другой проги, она мне выдала те же самые результаты. Может, в той, что Вы скачали, ошибка. Может еще что-то, не знаю.
Μολὼν λαβέ

Последний раз редактировалось alexander13; 14.02.2013 в 19:36.
alexander13 вне форума Ответить с цитированием
Старый 14.02.2013, 20:24   #5
xenon1000
Новичок
Джуниор
 
Регистрация: 13.02.2013
Сообщений: 4
По умолчанию

Спасибо!
xenon1000 вне форума Ответить с цитированием
Старый 14.02.2013, 21:04   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,318
По умолчанию

Обратите внимание на порядок вывода сообщения и увеличения x:
У Вас:
Код:
repeat
y:=y+h*f(x,y);
x:=x+h;
ListBox1.Items.Add(FormatFloat('y(0.###) = ', x) + FormatFloat('0.###', y));
until  (x>b);
Но должно быть так:
Код:
repeat
y:=y+h*f(x,y);
ListBox1.Items.Add(FormatFloat('y(0.###) = ', x) + FormatFloat('0.###', y));
x:=x+h;
until  (x>b);
Выводиться должно одиннадцать сообщений: 0.0, 0.1, 0.2, ... 0.9, 1.0 - счет с нуля ...

Как-то так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 14.02.2013, 21:52   #7
xenon1000
Новичок
Джуниор
 
Регистрация: 13.02.2013
Сообщений: 4
По умолчанию

Возник вопрос. Я хочу вывести ответ не в листбоксе перечнем, как выше написано в алгоритме, а раскидать значения в таблицу, используя объект StringGrid. Я прочитал кучу всего, но не нашел как циклом заполнить таблицу значениями.
Код:
 
For i:=1 to 10 do
begin
StringGrid1.Cells[i, 1]:=(FormatFloat('0.###', y));
end;
Этот цикл просто заполняет всеми значениями каждую ячейку, а надо раскидать по порядку.
Вкратце как правильно составить цикл вывода значений по ячейкам? Или придется переписывать полностью цикл repeat?
xenon1000 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение ОДУ методом Рунге-Кутты Демик Помощь студентам 7 03.12.2011 14:24
Написать программу на C++ для решения ОДУ разностным методом Macuka Фриланс 0 13.12.2010 21:29
численное решение дифуров методом Эйлера xbymzymx Помощь студентам 1 06.11.2010 18:14
ДУ методом Эйлера, Рунге-Кутта (Паскаль) Gebbellz Помощь студентам 6 13.06.2010 17:53
Задача Методом Эйлера и методом Рунге-Кутта. Прошу помочь. Очень срочно. BeNeDiKT Паскаль, Turbo Pascal, PascalABC.NET 0 12.05.2009 13:14