Перейти к содержанию

Метод Адамса-Штёрмера


Рекомендуемые сообщения

Нужно запрограммировать метод Адамса-Штёрмера. Я вроде начал, но застрял на основной формуле

Вобщем там y[n+1]=...+h*h/240*(f[n+1]+...)

Вот зздесь я понять не могу как найти эту функцию f[n+1], которая зависит от х и у, по-моему даже от y[n+1].

В итоге получается одно уравнение и 2 неизвестных.

Ссылка на комментарий

http://reslib.com/book/Chislennie_metodi_v_tehnike/115

неплохая литература :)

насколько я понимаю.... там задействована рекурентная формула...

и функция f[n+1] зависит от x, y[n+1] и y'[n+1]? я не дочитал сам метод буков много :) просто предполагаю что это так :)

Ссылка на комментарий

Если честно надо читать :) Но когда я был студентом то задача Коши решалась достаточно просто) краевые условия ведь у тебя есть.

Судя по алгоритму тут будет рекурсивная функция, причем находя каждый раз новую Yn ты поидее получаешь новый Fn. А старт вычислений дают краевые условия --> то есть F0 ты получить должен вроде бы... :)

P.S. Вполне возможно что не прав :) Ужасть я забыл численные методы(посыпаю голову пеплом :) )

Ссылка на комментарий

Ну да краевое условие самому в проге нужно задавать y[0], отсюда f[0], просто с этой рекурсивной функцией у меня нелады, так что если можешь, то объясни поподробней про неё.

Вот моя функция y'=cos(x+y)+0,5(x-y) и как с ней проделывать эти операции не пойму

Ссылка на комментарий
  • 3 недели спустя...

народ помогите, я вроде еле как программу составил, а она некоторые значения не выводит.

program Kursovaya;

uses crt;

var

yo,y,yt,x: array [0..100] of real;

func1,func,o,pogr,e,yss,q,p,r,h:real;

n,a,b,i:integer;

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

var

l:real;

begin

yss:=cos(x+y)+0.5*(x+y);

l:=yss;

fc:=l;

end;

begin

clrscr;

writeln('vvedite znachenie koncov otrezka');

writeln('a=');

read(a);

writeln('b=');

read(B);

writeln('vvedite y[0]');

writeln('y[0]=');

read(y[0]);

writeln('vvedite kol-vo shagov');

writeln('n=');

read(n);

begin

h:=(b-a)/n;

x[0]:=a; x[n]:=b;

for i:=1 to n-1 do

x:=x[0]+i*h;

end;

begin

yo[0]:=y[0]-h*fc(x[0],y[0]);

yo[1]:=y[0]+h*fc(x[1],y[0]);

for i:=2 to 5 do

yo:=y[0]+2*h*fc(x,y[0]);

end;

begin

for i:=0 to 5 do

y:=yo;

end;

begin

for i:=5 to n-1 do

func:=67*fc(x,y)-8*fc(x[i-1],y[i-1])+122*fc(x[i-2],y[i-2]-8*fc(x[i-3],y[i-3])+67*fc(x[i-4],y[i-4]));

y[i+1]:=y+y[i-4]-y[i-5]+sqr(h)/48*(func);

begin

yt[0]:=y[0]-h*fc(x[0],y[0]);

yt[1]:=y[0]+h*fc(x[1],y[0]);

for i:=2 to 3 do

yt:=y[0]+2*h*fc(x,y[0]);

end;

begin

for i:=0 to 3 do

y:=yt;

end;

for i:=3 to n-1 do

func:=(fc(x[i-3],y[i-3])+fc(x[i-2],y[i-2])+fc(x[i-1],y[i-1])+fc(x,y));

func1:=17*(func)+232*fc(x,y)+222*fc(x[i-1],y[i-1])+232*fc(x[i-2],y[i-2])+17*fc(x[i-3],y[i-3]);

yt[i+1]:=y+y[i-2]-y[i-3]+sqr(h)/240*(func1);

end;

begin

for i:=0 to n do

o:=abs(y)-abs(yt);

o:=abs(o);

writeln('pogreshnost ravna ',o:5:2);

for i:=-1 to n-1 do

writeln(x[i+1]:5:2,' y[',i+1,']=',y[i+1]:5:2,' yt[',i+1,']=',yt[i+1]:5:2,' ',o:5:2);

end;

end.

посмотрите плз,только не надо структуру менять, только тот фрагмент где не выводит, может я где-то накосячил

Ссылка на комментарий

for i:=5 to n-1 do

func:=67*fc(x,y)-8*fc(x[i-1],y[i-1])+122*fc(x[i-2],y[i-2]-8*fc(x[i-3],y[i-3])+67*fc(x[i-4],y[i-4]));

y[i+1]:=y+y[i-4]-y[i-5]+sqr(h)/48*(func); //выполняется только один раз для y[n]

могу ошибаться но лучше так

for i:=5 to n-1 do

begin

func:=67*fc(x,y)-8*fc(x[i-1],y[i-1])+122*fc(x[i-2],y[i-2]-8*fc(x[i-3],y[i-3])+67*fc(x[i-4],y[i-4]));

y[i+1]:=y+y[i-4]-y[i-5]+sqr(h)/48*(func); //выполняется для каждого i в пределах ОДЗ

end;

--------------------------------

for i:=3 to n-1 do

func:=(fc(x[i-3],y[i-3])+fc(x[i-2],y[i-2])+fc(x[i-1],y[i-1])+fc(x,y));

func1:=17*(func)+232*fc(x,y)+222*fc(x[i-1],y[i-1])+232*fc(x[i-2],y[i-2])+17*fc(x[i-3],y[i-3]);

yt[i+1]:=y+y[i-2]-y[i-3]+sqr(h)/240*(func1);//выполняется только один раз для yt[n]

поменял на

for i:=3 to n-1 do

begin

func:=(fc(x[i-3],y[i-3])+fc(x[i-2],y[i-2])+fc(x[i-1],y[i-1])+fc(x,y));

func1:=17*(func)+232*fc(x,y)+222*fc(x[i-1],y[i-1])+232*fc(x[i-2],y[i-2])+17*fc(x[i-3],y[i-3]);

yt[i+1]:=y+y[i-2]-y[i-3]+sqr(h)/240*(func1);//выполняется для каждого i в пределах ОДЗ

end;

P.S. Первые 5 значений y и yt совпадают... остальные нет это верные итерации?

Ссылка на комментарий
  • 2 недели спустя...

всё больше не требуется, сдал курсач 8-)

народ снова Неlр!!!Унёс эту прогу преподу,она сказала что нужно взять уравнение второго порядка попроще с готовым точным решением и изменить прогу с заменой на новое уравнение. Кстати, я забыл что там должно быть 2 нач. условия(1-для у0,а 2 для у'0).Как изменить эту прогу с учётом всех выше перечисленных изменений?

Неправильно сформулировал. Вернее куда там совать второе условие, где оно там используется?

Ссылка на комментарий

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...