Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Метод Адамса 2-го порядка (Pascal)

41K
12 января 2009 года
MaReNa
6 / / 11.01.2009
2.1.Тема работы.
Разработка программы решения систем обыкновенных дифференциальных
2.2.Исходные данные.
2.2.1. Метод решения.
Метод Адамса 2го порядка.
2.2.2. Метод выбора начальных точек в методе Адамса.
Модифицированный метод Эйлера.
2.2.3. Точность решения.
ε=0.01
2.2.4. Способ выбора шага.
Постоянный шаг, выбираемый по разности двух решений, получаемых с шагом h и h/2.
2.2.5. Порядок системы.
Система 3го порядка.
2.2.6. Характер системы.
Линейная автономная система.
2.2.7. Контрольный пример с заданной системой обыкновенных дифференциальных уравнений, границей отрезка, на котором должна быть решена система, и начальными условиями.

y'1=3y2-2y3
y'2=-y3-3y2
y'3=2y1-y2

y1(a)=1
y2(a)=1
y3(a)=1

a=1
b=2

Код:
PROGRAM Ad_2;
  USES
     CRT;
  LABEL
     MET;
  CONST
     a = 1;
     b = 2;
     e = 0.01;
  VAR
     h : Real;
     i,u : Integer;
     Y1,Y2,Y3,X : Array [1..30] of Real;
  BEGIN
    clrscr;
    h:=0.05;
    Y1[1]:=1;
    Y2[1]:=1;
    Y3[1]:=1;
    repeat
          u:=0;
MET:   for i:=1 to 2 do
          begin
             Y1[i+1]:=Y1+h*(Y1+h/2*(3*Y2-2*Y3));
             Y2[i+1]:=Y2+h*(Y2+h/2*(-Y3-3*Y1));
             Y3[i+1]:=Y3+h*(Y3+h/2*(2*Y1-Y2));
          end;
       if u=0
          then
             begin
                h:=h/2;
                u:=1;
                goto MET
             end;
     until ((abs(Y1[2])-Y1[3])<=(3*e)) and ((abs(Y2[2])-Y2[3])<=(3*e))
                                       and ((abs(Y3[2])-Y3[3])<=(3*e));
    h:=h*2;
    for i:=2 to (round((b-a)/h)+1) do
       begin
          Y1[i+1]:=Y1+h/2*(3*(3*Y2-2*Y3)-(3*Y2[i-1]-2*Y3[i-1]));
          Y2[i+1]:=Y2+h/2*(3*(-Y3-3*Y1)-(-Y3[i-1]-3*Y1[i-1]));
          Y3[i+1]:=Y3+h/2*(3*(2*Y1-Y2)-(2*Y1[i-1]-Y2[i-1]))
       end;
    writeln ('   X           Y1          Y2          Y3');
    writeln ('-------------------------------------------');
    for i:=1 to (round((b-a)/h)+1) do
       begin
          X:=a+h*(i-1);
          writeln (X:7:4, Y1:12:4, Y2:12:4, Y3:12:4);
       end;
    writeln;
    write (' ':5,'Шаг интегрирования: ',h:4:4);
    readkey
  END.


Как погрешность найти (хотя бы по какой формуле) и что здесь не так?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог