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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2013, 10:43   #1
FeonoR
 
Регистрация: 01.10.2011
Сообщений: 4
По умолчанию Программное решение Задача Коши для ОДУ

Доброго всем времени суток. Тов. программисты нужна помощь, т.к. голова уже отваливается и я устал биться над этими программами.

Итак, в чём суть проблемы: Имеем лабораторную по Численным методом, в которой требуется реализовать метод Эйлера, метод Рунге-Кутты 4 порядка, метод трапеций, для ОДУ 1 и 2 порядка. Сами методы я понимаю, коды прилагаются ниже, но не могу понять почему такие результаты.

По порядку:

Задание1.
Напишите программу решения задачи Коши для ОДУ первого порядка методами Эйлера, трапеций и Рунге-Кутты 4-го порядка на отрезке [t0;t0+5] c шагом h=0.1. Постройте точки, соответствующие приближенным решениям и график точного решения в одной системе координат.
ОДУ:
|dx\dt = (t*e^c*t)/cos(a*x+b)
|x(t0)=t0
a=-2.91;
b=3.11;
c=2.66;
t0=2.8;
x0=0.02;

Метод Эйлера:
Код:
const
a=-2.91;
b=3.11;
c=2.66;
h=0.1;
t0=2.8;
x0=0.02;
n=50;//(t0+5-t0)/h;

function f(x,y:double):Double;
 begin
  f:=(x*Exp(c*x))/cos(a*y+b);
 end;

function Eiler(yn,xn:Double):Double;
var
  i:Integer;
  y,x,fi:Double;

begin
  y:=yn;
  x:=xn;
  for i:=0 to n do
   begin
    //Writeln('x= '+floattostr(x)+' | '+'y= '+floattostr(y));
    fi:=f(x,y);
    Writeln('x= '+floattostr(x)+' | '+'y= '+floattostr(y)+' | '+'y`= '+floattostr(fi));
    y:=y+h*fi;
    x:=x+h;
    end;
  Result:=y;
end;
Метод Рунге-Кутты 4 порядка:
Код:
const
a=-2.91;
b=3.11;
c=2.66;
h=0.1;
t0=2.8;
x0=0.02;
n=50;//(t0+5-t0)/h;

function f(x,y:double):Double;
 begin
  f:=(x*Exp(c*x))/cos(a*y+b);
 end;

function RugKut(yn,xn:Double):Double;
var
  i:Integer;
  y,x,k0,k1,k2,k3:Double;

begin
  y:=yn;
  x:=xn;
  for i:=1 to n do
   begin
    k0:=f(x,y);
    k1:=f(x+h/2,y+h*k0/2);
    k2:=f(x+h/2,y+h*k1/2);
    k3:=f(x+h,y+h*k2);
    Writeln('k0= '+floattostr(k0)+' | '+'k1= '+floattostr(k1)+' | '+'k2= '+floattostr(k2)+' | '+'k3= '+floattostr(k3));
    y:=y+(k0+2*k1+2*k2+k3)*h/6;
    x:=x+h;
    Writeln('y= '+floattostr(y));
    end;
  Result:=y;
end;
Обращаемся:
Код:
begin
 Writeln('Decision by method of Eiler');
 Eiler(x0,t0);
 Readln;
 Writeln('Decision by method of Runge-Kutte 4 order');
 RugKut(x0,t0);
 Readln;
end.
Метод трапеций заключается в следующем:
Код:
function trapeze(yn,xn:Double):Double;
var
  h,xi,res:Double;
begin
 h:=(b-a)/n;
res:=res+func(a);
for i:=1 to n-1 do
  begin
    xi:=a+i*h;
    res:=res+2*func(xi);
  end;
  xi:=a+n*h;
  res:=res+func(xi);
  trap:=0.5*h*res;
  end;
Но как его применить для решения ОДУ пока не разобрался - буду рад помощи.

При вычислении, что Эйлером, что Р-К результат оказывается просто огромным! И я думаю, что это не верно. Притом, что в качестве проверки нужно использовать Maple - там всё ещё хуже, он вообще не хочет ничего считать. Файл ниже.
[spoiler]
Decision by method of Eiler
x= 2,8 | y= 0,02 | y`= -4825,43519936531
x= 2,9 | y= -482,523519936531 | y`= 6601,22789149022
x= 3 | y= 177,599269212491 | y`= 164002,742322582
x= 3,1 | y= 16577,8735014707 | y`= -14883,0053676869
x= 3,2 | y= 15089,572964702 | y`= 19970,0287161341
x= 3,3 | y= 17086,5758363154 | y`= 21420,754813944
x= 3,4 | y= 19228,6513177098 | y`= 32808,8903122896
...
x= 7,29999999999999 | y= -30012074657,7528 | y`= 2324204791,20442
x= 7,39999999999999 | y= -29779654178,6323 | y`= 5091343204,23928
x= 7,49999999999999 | y= -29270519858,2084 | y`= -4323752930,07664
x= 7,59999999999999 | y= -29702895151,2161 | y`= 4580839322,13523
x= 7,69999999999999 | y= -29244811219,0025 | y`= -6049436316,2179
x= 7,79999999999999 | y= -29849754850,6243 | y`= 8581516260,23141

Decision by method of Runge-Kutte 4 order
y= 881,595410237557
y= 315,133286210344
y= -347,781877948207
y= -2313,30486122142
y= -5361,0496077353
y= -6249,24719046837
y= 16811,8427429044
y= 100428,652838274
y= 107083,839695085
y= 103037,68432944
....
y= -190947721,034963
y= -530570392,544522
y= -529436833,728456
y= -566003581,539525
y= -503298660,504548
y= -2564658276,65178
y= -2364288674,32911
y= -2536671485,87118
y= -2618220645,57135
y= -4077590706,50066
y= -3553254462,24192
y= -118788666559,263
[/spoiler]

На всякий случай сделал данные методы в экселе файл ниже.
[hr]
Задание 2.
Напишите программу решения задачи Коши на отрезке [t0;t0+5] c шагом h=0.1 методом Рунге-Кутты 4-го порядка. Постройте точки найденного решения на фазовой плоскости и сравните с фазовой траекторией, построенной средствами Maple.
ОДУ:
|d^2x/dt^2=x*dx/dt+a*sin(t+b)
|x(t0)=t0
|dx(t0)/dt=x`0
a=2.66;
b=0.02;
h=0.1;
t0=2.8;
x0=4,8
x`0=3,9

Тут всё для меня немного сложнее, не могу понять как применить метод. Сказали что нужно свести это уравнение к 2м уравнениям первого порядка - свёл, но дальше не продвинулся.

Заранее спасибо, буду рад любой помощи.
Вложения
Тип файла: rar 5 Лаб.rar (40.6 Кб, 39 просмотров)

Последний раз редактировалось FeonoR; 13.05.2013 в 10:49.
FeonoR вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение ОДУ 2порядка (Delphi) volkysha_k Помощь студентам 0 11.05.2012 12:23
Решение задачи Коши для ОДУ первого порядка MrVi Общие вопросы Delphi 3 15.04.2012 21:08
Решение ОДУ 2-го порядка Yanita Фриланс 1 24.02.2012 20:41
Решение ОДУ 2го порядка Aladin Общие вопросы C/C++ 0 17.05.2011 20:26
вычматы, задача Коши для ОДУ, методы Рунге-Кутты TdS Помощь студентам 0 02.01.2011 17:56