Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 31.03.2013, 20:55   #1 (permalink)
Natalia91169
Новичок
 
Регистрация: 05.12.2012
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Метод Рунге-Кутта 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.
Natalia91169 вне форума   Ответить с цитированием

Старый 31.03.2013, 20:55
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

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

Методом Рунге-Кутта найти решение дифференциальных уравнений
Помогите собрать корпус для бандпасса 6-го порядка
Заполнить с клавиатуры симметричную квадратную действительную матрицу N-го порядка
Метод Ван Хао C++
Определение порядка фильтров верхних частот
Метод Рунге-Кутта-Мерсона в Turbo Pascal

Старый 31.03.2013, 22:47   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Natalia91169 Посмотреть сообщение
Помогите пожалуйста.
Попробую.
Прежде всего, я переделал программу решения по методу Рунге-Кутты. На мой взгляд, там у Вас та-а-акого понаверчено-понакручено, что - ух! Упростил.
Извините, входные данные оформил в виде констант - поправите сами, если нужно. Поскольку Вы не привели главного - параметров стартовой точки 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.
Vladimir_S вне форума   Ответить с цитированием
Старый 10.03.2014, 21:18   #3 (permalink)
Элис
Новичок
 
Регистрация: 10.03.2014
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

помогите пожалуйста написать программу на паскаль. методом Рунге Кутта решить диффер уравнение второго порядка U''(p)- p^2*U'(p) - (мю)*ln(1+ U(p))=0 на Паскаль, и обязателен вывод графика.промежуток от 0 до 10.(насколько я поняла график должен стремится к 1)
Элис вне форума   Ответить с цитированием
Старый 10.03.2014, 21:19   #4 (permalink)
Элис
Новичок
 
Регистрация: 10.03.2014
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

людиии!программа нужна срочно!!!завтра после обеда нужно сдать!!!(
Элис вне форума   Ответить с цитированием
Старый 10.03.2014, 21:56   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Элис Посмотреть сообщение
помогите пожалуйста написать программу на паскаль. методом Рунге Кутта решить диффер уравнение второго порядка U''(p)- p^2*U'(p) - (мю)*ln(1+ U(p))=0 на Паскаль, и обязателен вывод графика.промежуток от 0 до 10.(насколько я поняла график должен стремится к 1)
"Элис... кто такая Элис?" (из популярного некогда шлягера). А у меня другой вопрос, и даже два - что же это Вы, Элис, только сейчас проснулись? Неужели нельзя было выложить задание хотя бы в пятницу - впереди три выходных, женский праздник, опять же... Так нет: извольте зарубиться на бессонную ночь перед рабочей неделей, но чтобы завтра к обеду... Между прочим, и это было бы в принципе преодолимо, учитывая наличие на нашем форуме решения похожей задачки: Нужна помощь с Паскалем , но видите ли, какой закавык... Численный метод Рунге-Кутты решения дифференциальных уравнений второго порядка предполагает ОБЯЗАТЕЛЬНОЕ задание значения искомой функции и ее первой производной в стартовой точке. Обычно еще задается шаг вычисления. И где это всё в выложенном Вами задании? А нету! Потому что Вы даже толком сформулировать задачу с полным набором исходных данных не удосужились. В общем, "я тут вам что-то кинула, вы давайте, а я побежала!". Так? Ну... извините, но...
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 10.03.2014, 22:43   #6 (permalink)
Элис
Новичок
 
Регистрация: 10.03.2014
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо за ответ, Владимир!дело в том, что программа у меня есть, но она неправильно выводит график! шаг h=0,001(кстати, в примерной программе h= -0,001 ). А стартовая точка х=0.
Элис вне форума   Ответить с цитированием
Старый 11.03.2014, 10:08   #7 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Элис Посмотреть сообщение
А стартовая точка х=0.
Этого мало! Повторяю: должны быть даны значения искомой функции и ее первой производной в стартовой точке. Т.е.
U(0) = ...
U'(0) = ...
кстати, аргументом является p, а не x.
Кроме того, в уравнении присутствует параметр μ - его значение тоже не худо бы знать.
А еще некоторое недоумение вызывает соотношение длины интервала (10) и шага (0.001). Это что же - 10000 точек считать? Не многовато?
Vladimir_S вне форума   Ответить с цитированием
Старый 12.01.2019, 15:26   #8 (permalink)
xamelione25
Новичок
 
Регистрация: 09.01.2019
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
1
Помогите добавить к программе из этой темы из первого поста (рунге 4го порядка), решение этого задания еще по методу Эйлера. С выбором метода решения через case
Миниатюры
screenshot_2.jpg  
xamelione25 вне форума   Ответить с цитированием
Старый 12.01.2019, 18:35   #9 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от xamelione25 Посмотреть сообщение
Помогите добавить к программе из этой темы из первого поста (рунге 4го порядка), решение этого задания еще по методу Эйлера. С выбором метода решения через case
Всё, что Вам нужно, изложено мною внятно и подробно здесь:
Численные методы решения дифференциальных уравнений
Подстановку нужной функции, удаление лишнего и выбор процедур через Case сделаете сами, невелика премудрость.
Не очень, правда, понимаю, как мыслится добиться "заданной точности". В отличие от алгебраических уравнений, эти методы не предполагают какой-либо итерационной процедуры. Если только дробить шаг до получения сходимости. Если так, то добавьте внешний цикл по измельчению шага.
P.S. И ещё: как модератор, я НАСТОЯТЕЛЬНО прошу Вас прекратить цепляться к чужим темам. Создавайте свои темы под свои задачи.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Метки
паскаль; помогите;, рунге-кутта

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.