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