Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Метод Рунге-Кутта 2-го порядка, Паскаль (http://www.tehnari.ru/f41/t87015/)

Natalia91169 31.03.2013 20:55

Метод Рунге-Кутта 2-го порядка, Паскаль
 
Есть решение задачи Коши для обыкновенного дифференциального уравнения 1-го порядка с помощью метода Рунге-Кутты 4-го порядка

А что надо изменить, если нужен рунге-кутта 2 порядка?

Помогите пожалуйста.

Program R_K;
Uses crt;
Var
a, b, x0, y0, x1, y1, x2, y2, eps, p, u01, u02, u11, u2, h, g, m, k1, k2, k3, k4: real;
i: integer;
Function f(x,y:real):real;
begin
f:=y/x;
end;
Function u1(x,y,h:real):real;
begin
k1:=f(x,y);
k2:=f(x+h/2,y+h*k1/2);
k3:=f(x+h/2,y+h*k2/2);
k4:=f(x+h,y+h*k3);
u1:=u01+ h*(k1+2*k2+2*k3+k4)/6;
end;
Begin
ClrScr;
writeln(' Vvedite a,b ');
readln(x0, b);
writeln('Vvedite y0');
readln(y0);
writeln('Vvedite h, E ');
readln(h, eps);
writeln('X':10,'Y':17,'h':19,'P':20);
u01:=y0;
u02:=y0;
x1:=x0;
x2:=x0;
y1:=y0;
y2:=y0;
While x2<b do
begin
u11:=u1(x1,y1,h);
u01:=u11;
y1:=u11;
x1:=x1+h;
m:=h/2;
u2:=u1(x2,y2,m);
u02:=u2;
y2:=u2;
x2:=x2+m;
u2:=u1(x2,y2,m);
u02:=u2;
g:=y2;
y2:=u2;
x2:=x2+m;
P:=abs(u11-u2);
if (p>eps) then
h:=h/2;
end;
x1:=x0;
u11:=0;
u01:=y0;
y1:=y0;
u02:=y0;
y2:=y0;
x2:=x0;
u2:=0;
While x1<b do
begin
u11:=u1(x1,y1,h);
u01:=u11;
y1:=u11;
m:=h/2;
u2:=u1(x2,y2,m);
u02:=u2;
y2:=u2;
x2:=x2+m;
u2:=u1(x2,y2,m);
u02:=u2;
y2:=u2;
x2:=x2+m;
P:=abs(u11-u2);
writeln((x1):15:13,' ',u11:15:13,' ',h:15:13,' ',p:15:13);
x1:=x1+h;
end;
readln;
End.

Vladimir_S 31.03.2013 22:47

Цитата:

Сообщение от Natalia91169 (Сообщение 889268)
Помогите пожалуйста.

Попробую.
Прежде всего, я переделал программу решения по методу Рунге-Кутты. На мой взгляд, там у Вас та-а-акого понаверчено-понакручено, что - ух! Упростил.
Извините, входные данные оформил в виде констант - поправите сами, если нужно. Поскольку Вы не привели главного - параметров стартовой точки x0, y0 и интересующего диапазона, я взял "с потолка" одно из решений исходного уравнения, а именно y=4x, и диапазон от 1 до 10. Подбор шага сохранил, только сделал по-человечески.
Итак, мой вариант Рунге-Кутты:
Код:

Uses crt;
Const
 x0=1.0;
 y0=4.0;
 b=10.0;
 eps=0.1;

Var
 x1,y1,y2,h,p:real;
 i,N:integer;

Function f(x,y:real):real;
begin
 f:=y/x;
end;

Function u1(x,y,h:real):real;
var k1,k2,k3,k4:real;
begin
 k1:=f(x,y);
 k2:=f(x+h/2,y+h*k1/2);
 k3:=f(x+h/2,y+h*k2/2);
 k4:=f(x+h,y+h*k3);
 u1:=y+h*(k1+2*k2+2*k3+k4)/6;
end;

Begin
 y2:=y0;
 h:=2;
 Repeat
  ClrScr;
  x1:=x0;
  y1:=y0;
  h:=h/2;
  N:=Round((b-x0)/h);
  for i:=1 to N do
  begin
    x1:=x1+h;
    y1:=u1(x1,y1,h);
    writeln('x= ',x1:6:3,'  y= ',y1:6:3,'  h= ',h:0:5);
  end;
  p:=Abs(y1-y2);
  y2:=y1;
 Until p<eps;
 Readln
End.

Теперь по поводу "Рунге-Кутты второго порядка". Как я понял, речь идет на самом деле о модифицированном методе Эйлера с пересчетом. Если я прав, то так (исходные данные те же):
Код:

Uses crt;
Const
 x0=1.0;
 y0=4.0;
 b=10.0;
 eps=0.1;

Var
 x1,y1,x2,y2,y2a,y3,h,p:real;
 i,N:integer;

Function f(x,y:real):real;
begin
 f:=y/x;
end;

Begin
 y3:=y0;
 h:=2;
 Repeat
  ClrScr;
  x1:=x0;
  y1:=y0;
  h:=h/2;
  N:=Round((b-x0)/h);
  for i:=1 to N do
  begin
    x2:=x1+h;
    y2a:=y1+h*f(x1,y1);
    y2:=y1+h*(f(x1,y1)+f(x2,y2a))/2;
    writeln('x= ',x2:6:3,'  y= ',y2:6:3,'  h= ',h:0:5);
    x1:=x2;
    y1:=y2;
  end;
  p:=Abs(y2-y3);
  y3:=y2;
 Until p<eps;
 Readln
End.


Элис 10.03.2014 21:18

помогите пожалуйста написать программу на паскаль. методом Рунге Кутта решить диффер уравнение второго порядка U''(p)- p^2*U'(p) - (мю)*ln(1+ U(p))=0 на Паскаль, и обязателен вывод графика.промежуток от 0 до 10.(насколько я поняла график должен стремится к 1)

Элис 10.03.2014 21:19

людиии!программа нужна срочно!!!завтра после обеда нужно сдать!!!(

Vladimir_S 10.03.2014 21:56

Цитата:

Сообщение от Элис (Сообщение 1013946)
помогите пожалуйста написать программу на паскаль. методом Рунге Кутта решить диффер уравнение второго порядка U''(p)- p^2*U'(p) - (мю)*ln(1+ U(p))=0 на Паскаль, и обязателен вывод графика.промежуток от 0 до 10.(насколько я поняла график должен стремится к 1)

"Элис... кто такая Элис?" (из популярного некогда шлягера). А у меня другой вопрос, и даже два - что же это Вы, Элис, только сейчас проснулись? Неужели нельзя было выложить задание хотя бы в пятницу - впереди три выходных, женский праздник, опять же... Так нет: извольте зарубиться на бессонную ночь перед рабочей неделей, но чтобы завтра к обеду... Между прочим, и это было бы в принципе преодолимо, учитывая наличие на нашем форуме решения похожей задачки: http://www.tehnari.ru/f43/t92797/ , но видите ли, какой закавык... Численный метод Рунге-Кутты решения дифференциальных уравнений второго порядка предполагает ОБЯЗАТЕЛЬНОЕ задание значения искомой функции и ее первой производной в стартовой точке. Обычно еще задается шаг вычисления. И где это всё в выложенном Вами задании? А нету! Потому что Вы даже толком сформулировать задачу с полным набором исходных данных не удосужились. В общем, "я тут вам что-то кинула, вы давайте, а я побежала!". Так? Ну... извините, но...

Элис 10.03.2014 22:43

Спасибо за ответ, Владимир!дело в том, что программа у меня есть, но она неправильно выводит график! шаг h=0,001(кстати, в примерной программе h= -0,001 ). А стартовая точка х=0.

Vladimir_S 11.03.2014 10:08

Цитата:

Сообщение от Элис (Сообщение 1013975)
А стартовая точка х=0.

Этого мало! Повторяю: должны быть даны значения искомой функции и ее первой производной в стартовой точке. Т.е.
U(0) = ...
U'(0) = ...
кстати, аргументом является p, а не x.
Кроме того, в уравнении присутствует параметр μ - его значение тоже не худо бы знать.
А еще некоторое недоумение вызывает соотношение длины интервала (10) и шага (0.001). Это что же - 10000 точек считать? Не многовато?

xamelione25 12.01.2019 15:26

Вложений: 1
Цитата:

Сообщение от Vladimir_S (Сообщение 1014115)
1

Помогите добавить к программе из этой темы из первого поста (рунге 4го порядка), решение этого задания еще по методу Эйлера. С выбором метода решения через case

Vladimir_S 12.01.2019 18:35

Цитата:

Сообщение от xamelione25 (Сообщение 2621959)
Помогите добавить к программе из этой темы из первого поста (рунге 4го порядка), решение этого задания еще по методу Эйлера. С выбором метода решения через case

Всё, что Вам нужно, изложено мною внятно и подробно здесь:
http://www.tehnari.ru/f41/t96417/
Подстановку нужной функции, удаление лишнего и выбор процедур через Case сделаете сами, невелика премудрость.
Не очень, правда, понимаю, как мыслится добиться "заданной точности". В отличие от алгебраических уравнений, эти методы не предполагают какой-либо итерационной процедуры. Если только дробить шаг до получения сходимости. Если так, то добавьте внешний цикл по измельчению шага.
P.S. И ещё: как модератор, я НАСТОЯТЕЛЬНО прошу Вас прекратить цепляться к чужим темам. Создавайте свои темы под свои задачи.


Часовой пояс GMT +4, время: 10:28.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.