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

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

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

> Численные методы решения ОДУ
сообщение
Сообщение #1





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

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


Я написала программу на Паскале для формулы yn+1=yn+h*fn
Вот код:
program eiler;

var x,y,a,b,h:real;

function f(x,y:real):real;

begin f:= y*y*(8-20*x); end;

begin

writeln('vvedite y, a, b, h');

readln(y,a,b,h); x:=a;

repeat

writeln(x:0:1,' ',y:0:3);

y:=y+h*f(x,y);

x:=x+h;

until not (x<b);

readln;

end.


А как написать переделать для формулы
yn+1=yn+h*fn+1
и для формулы yn+1=yn+(h/2)*(3fn-fn-1)
Подскажите, пожалуйста, кто-нибудь. Заранее спасибо
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


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

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

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


Цитата(TarasBer @ 11.04.2011 14:39) *
Для f(x[n], y[n]) - да, было.
А для f(x[n+1], y[n]) - не уверен. Я такого не помню.
А зачем помнить? Можно порассуждать )).
1. Сначала представим себе, что f не зависит от y. Если мы аппроксимируем y прямой y'*x на участке от xn до xn+1, то неважно, где брать значение y' - слева или справа. То есть обе формулы имеют право на жизнь и примерно одинаковую точность. Было бы лучше, если бы мы брали значение f в центре. Логично также взять среднее ар. значений на концах (или другое взвешенное значение). Есть также методы, которые предполагают наличие двух различных сеток для x и y. Добавление зависимости от y дела не меняет (в определенных предположениях о функции, ессно). Так или иначе, сходимость должна быть.

2. Я вообще не вижу смысла вникать в выч.мат. в данном случае. Человек принес с собой формулы и просит помочь с программированием их. Если ты считаешь, что есть формулы лучше - ну, упомяни об этом... Но это, мне кажется, не секрет )).

3. С тем, что для реализации последней формулы нужно как-то (по-другому) рассчитывать первое значение, ты, пожалуй, прав.. Я как-то не сразу врубился, о чем речь, извини. Об этом я сейчас еще напишу (ниже).

Цитата(Гость @ 11.04.2011 17:08) *
Тогда для формулы yn+1=yn+(h/2)*(3fn-fn-1)
будет вот так:
<...>
Правильно? проверьте, пожалуйста
Нет, не правильно.
Во-первых, ты воплотила формулу:
yn+1=yn+(h/2)*(3fn+1-fn)
- а это СОВСЕМ не то..
Марин, тут есть две возможности.
1. Если нам разрешено использовать функцию f за пределами отрезка [a,b], то все просто:
program eiler_2;

var
x,y,a,b,h: real;

function f(x,y: real): real;
begin
f:= y*y*(8-20*x);
end;

begin
writeln('vvedite y, a, b, h');
readln(y,a,b,h);
x:= a;
repeat
writeln(x:0:1,' ',y:0:3);
y:= y+(h/2)*(3*f(x,y)-f(x-h,y)); // исправлена формула
x:= x+h;
until not (x<b);
readln;
end.

- и все.

2. Если за пределы отрезка [a,b] по x вылезать нельзя, то для реализации этой формулы нужно сначала подсчитать y1 (отсчет от 0) каким-то другим методом, как уже говорил TarasBer. Каким именно - не сказано, так что ты можешь выбрать любой (первый, например). Точность решения от этого сильно зависеть не будет все равно.
Примерно вот так:
program eiler_3;

var
x,y,a,b,h: real;

function f(x,y: real): real;
begin
f:= y*y*(8-20*x);
end;

begin
writeln('vvedite y, a, b, h');
readln(y,a,b,h);

writeln(a:0:1,' ',y:0:3); // печать перед первой итерацией
y:= y+h*f(x,y); // первая итерация (первый метод)

x:= a+h; // цикл начинаем со второй итерации
repeat
writeln(x:0:1,' ',y:0:3);
y:= y+h/2*(3*f(x,y)-f(x-h,y)); // честно пишем формулу
x:= x+h;
until x>=b;
readln;
end.

Понятно? Спрашивай, что неясно.


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

Сообщений в этой теме
Veina   Численные методы решения ОДУ   11.04.2011 13:58
TarasBer   fn - это f(xn,yn)? > yn+1=yn+h*fn+1 В общем с…   11.04.2011 14:34
Lapp   fn - это f(xn,yn)?Думаю, что f - производная, т.е.…   11.04.2011 15:13
TarasBer   > Начальное значение y вводится с клавы, см. пр…   11.04.2011 15:38
Lapp   А минус-первое? Первый шаг итерации делается так ж…   11.04.2011 15:56
TarasBer   Не понял. Зачем? Задано граничное условие.. Во…   11.04.2011 16:43
Lapp   На вычметодах такое точно было?Ну это же самое нач…   11.04.2011 17:23
TarasBer   > Ну это же самое начало. Для f(x[n], y[n]) - …   11.04.2011 17:39
Гость   Тогда для формулы yn+1=yn+(h/2)*(3fn-fn-1) будет в…   11.04.2011 20:08
Lapp   Для f(x[n], y[n]) - да, было. А для f(x[n+1], y[n]…   12.04.2011 8:29
-Veina-   program eiler_3; var x,y,a,b,h: real; function …   30.04.2011 17:58
Гость   И ещё: всё таки для неявного метода Эйлера (вторая…   30.04.2011 21:48
Lapp   И ещё: всё таки для неявного метода Эйлера (вторая…   4.05.2011 7:15
-Veina-   Lapp, откликнетесь, пожалуйста, очень нужна ваша п…   3.05.2011 16:33
Krjuger   Хоть я и не Lapp,и извините,что влезаю,но прочти э…   3.05.2011 20:35
Veina   Не хочет никак открываться((   3.05.2011 21:14
-TarasBer-   Правой кнопкой мыши по ссылке -> сохранить объе…   3.05.2011 22:03
Veina   Раз не открывает, значит и не качает( Может вы сам…   3.05.2011 22:06
Krjuger   Ты немного не правильно подходишь в решению. Смотр…   3.05.2011 23:45


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

 





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