• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Метод Рунге-Кутта 2-го порядка, Паскаль

Natalia91169

Ученик
Регистрация
5 Дек 2012
Сообщения
1
Реакции
0
Баллы
0
Метод Рунге-Кутта 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.
 
Помогите пожалуйста.
Попробую.
Прежде всего, я переделал программу решения по методу Рунге-Кутты. На мой взгляд, там у Вас та-а-акого понаверчено-понакручено, что - ух! Упростил.
Извините, входные данные оформил в виде констант - поправите сами, если нужно. Поскольку Вы не привели главного - параметров стартовой точки 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.
 
помогите пожалуйста написать программу на паскаль. методом Рунге Кутта решить диффер уравнение второго порядка U''(p)- p^2*U'(p) - (мю)*ln(1+ U(p))=0 на Паскаль, и обязателен вывод графика.промежуток от 0 до 10.(насколько я поняла график должен стремится к 1)
 
людиии!программа нужна срочно!!!завтра после обеда нужно сдать!!!(
 
помогите пожалуйста написать программу на паскаль. методом Рунге Кутта решить диффер уравнение второго порядка U''(p)- p^2*U'(p) - (мю)*ln(1+ U(p))=0 на Паскаль, и обязателен вывод графика.промежуток от 0 до 10.(насколько я поняла график должен стремится к 1)
"Элис... кто такая Элис?" (из популярного некогда шлягера). А у меня другой вопрос, и даже два - что же это Вы, Элис, только сейчас проснулись? Неужели нельзя было выложить задание хотя бы в пятницу - впереди три выходных, женский праздник, опять же... Так нет: извольте зарубиться на бессонную ночь перед рабочей неделей, но чтобы завтра к обеду... Между прочим, и это было бы в принципе преодолимо, учитывая наличие на нашем форуме решения похожей задачки: http://www.tehnari.ru/f43/t92797/ , но видите ли, какой закавык... Численный метод Рунге-Кутты решения дифференциальных уравнений второго порядка предполагает ОБЯЗАТЕЛЬНОЕ задание значения искомой функции и ее первой производной в стартовой точке. Обычно еще задается шаг вычисления. И где это всё в выложенном Вами задании? А нету! Потому что Вы даже толком сформулировать задачу с полным набором исходных данных не удосужились. В общем, "я тут вам что-то кинула, вы давайте, а я побежала!". Так? Ну... извините, но...
 
Спасибо за ответ, Владимир!дело в том, что программа у меня есть, но она неправильно выводит график! шаг h=0,001(кстати, в примерной программе h= -0,001 ). А стартовая точка х=0.
 
А стартовая точка х=0.
Этого мало! Повторяю: должны быть даны значения искомой функции и ее первой производной в стартовой точке. Т.е.
U(0) = ...
U'(0) = ...
кстати, аргументом является p, а не x.
Кроме того, в уравнении присутствует параметр μ - его значение тоже не худо бы знать.
А еще некоторое недоумение вызывает соотношение длины интервала (10) и шага (0.001). Это что же - 10000 точек считать? Не многовато?
 

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

Вложения

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