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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2011, 20:45   #1
byzyan
 
Регистрация: 19.11.2009
Сообщений: 9
По умолчанию Проблема с ДУ(Рунге-Кутт)

Добрый вечер(день)!
Разбираюсь с методом Рунге-Кутта 4 порядка. Всё предельно ясно и понятно: в правой части должна быть зависимая переменная и независимая(время). Собственно время и является шагом.
Но вот беда.. мне необходимо решить уравнение dIe/dt=(E-Re*Ie-Iн*Rн)/Le
Как видно, в правой части есть только Ie. Все остальные числа известны.
Подскажите, каким образом я могу шагать по времени? Вот материал на Вики
byzyan вне форума Ответить с цитированием
Старый 03.03.2011, 21:52   #2
pwian
Пользователь
 
Регистрация: 03.07.2009
Сообщений: 21
По умолчанию

Так же как и если бы правая часть явно зависела от времени t. Примерно так:
Код:
function f(t,y:real):real; //правая часть твоего уравнения
begin
 f:=(E-Re*y-Iн*Rн)/Le; //будим считать что E,Re,Ih,Rh,Le ты как-то где-то определил
end;

function Rung(t,y,h:real):real;                               //Метод Рунге-Кутты.
var
 k1,k2,k3,k4:real;
begin
 //Вычисляешь k1,k2,k3,k4
 k1:=f(t,y,h);
 k2:=f(t+h/2,y+h/2*k1);
 // и так далее для k3,k4
 f:=y+h/6*(k1+2*k2+2*k3+K4)
end;

t:=t0;                                      //t0 - начальный момент времени
while t<=Tmax do                      //Получаем решение на отрезке [t0,Tmax];
 begin
  y:=Rung(t,y,h);               
    {Получили приближенное решение в точке t, а именно точку (t,y);
   Можно построить на графике Series1.Add(t,y);}          
  t:=t+h;             //Следующая точка.
  end;
*********
Как видно в данном случаи функции f время t предедается, но не используется. И еще - ты написал, что "Собственно время и является шагом" - это не так, время мы постоянно увеличиваем на некий шаг h, который ты выбираешь сам из соображения точности, обычно выбирают h=0.1; h=0.01; и т.д.
Последнее - я написал что-то вроде примера, чтобы он работал его нужно немного подредакитровать.
P.S. Данное уравнение можно решить методом разделения переменных, т.е получить точное решение.

Последний раз редактировалось Stilet; 05.03.2011 в 08:58.
pwian вне форума Ответить с цитированием
Старый 04.03.2011, 07:39   #3
byzyan
 
Регистрация: 19.11.2009
Сообщений: 9
По умолчанию

Спасибо за разъяснение. т.е. получается, что на каждом шаге я нахожу как бы среднее арифметическое новой точки? но делается это "грубо" т.к. нельзя шагнуть h/2... правильно?
byzyan вне форума Ответить с цитированием
Старый 04.03.2011, 12:51   #4
pwian
Пользователь
 
Регистрация: 03.07.2009
Сообщений: 21
По умолчанию

На каждом шаге ты находишь приближенное значение точки, а не среднее, как ты сказал. А насчет слово "грубо", то учитывая, что метод Рунги-Кутты у тебя имеет 4-ый порядок точности (это довольно хорошая точность), то найденное приближенное решение получится близким к точному (т.е решение не грубое). На h/2 ты можешь шагнуть, и вообще на любой другой шаг. В этом случаи сетка не равномерная и моей проге следует как-то указывать как изменяется этот шаг в зависимости от времени t (можно в самом начале цикла while). Но в изменени шага смысла мало, лучше выбирать постоянный шаг. Хотя в некоторых случаях можно и уменьшить - если точность не достигнута, и увеличить, если желаемая точность достигается уже на нескольких точках подряд (для экономии времени).

Последний раз редактировалось pwian; 04.03.2011 в 13:01.
pwian вне форума Ответить с цитированием
Старый 04.03.2011, 16:31   #5
byzyan
 
Регистрация: 19.11.2009
Сообщений: 9
По умолчанию

pwian, объясните, пожалуйста, о каком шаге идет речь? Ведь если я не могу задать период следования расчетов(квантования... как угодно можно назвать), то как я могу говорить о том, чтобы вычислить при h/2???
Я получаю просто набор ответов, пусть они и представляют экспоненту на графике, но я НИКАК не могу привязать их к оси времени...
byzyan вне форума Ответить с цитированием
Старый 04.03.2011, 16:49   #6
pwian
Пользователь
 
Регистрация: 03.07.2009
Сообщений: 21
По умолчанию

Есть задача Коши:
y=f(t,y);
y(t0)=y0; t0,y0- заданы.
Нужно построить решение на отрезке [t0,Tmax].
Ты сам произвольно выбираешь шаг h - чем меньше он будет, тем точнее получится решение, но дольше программа будет вычислять его.
Чертим оси координат t,y.
С помощью метода Р-К ты находишь:
1) сначала точку (t1,y1). Соединяешь ее с точкой (t0,y0). Далее если сильно надо пора изменить шаг h - также как хочешь (например, h/2; или 2h);
2) находишь точку (t2,y2). Соединяешь ее с точкой (t1,y1). И так далее.
pwian вне форума Ответить с цитированием
Старый 04.03.2011, 19:05   #7
byzyan
 
Регистрация: 19.11.2009
Сообщений: 9
По умолчанию

ладно... давайте переформулирую вопрос:
я могу смело предположить, что в при t0 Ie = 0... т.е. цепь разомкнута и ток не течет...
НО! ГДЕ я подставляю в формулу параметр t??? нет его там...я тупо получаю следующую точку, основываясь на вычисленной ранее точке... а время, за которое произошло изменение, мне НЕ известно и никак не задается в явном виде... я НИКАК не влияю на шаг
byzyan вне форума Ответить с цитированием
Старый 04.03.2011, 19:26   #8
pwian
Пользователь
 
Регистрация: 03.07.2009
Сообщений: 21
По умолчанию

ГДЕ я подставляю в формулу параметр t - нигде, так как в правой части уравнения его нет.
а время, за которое произошло изменение, мне НЕ известно и никак не задается в явном виде... - Если это ты про Tmax, то ответ прост - он должен быть обязательно для метода Рунге-кутты, поэтому придется задать как-то самому.
я НИКАК не влияю на шаг - шаг выбираешь сам произвольно, как хочешь, лишь бы он маленький был. Я вижу мы не понимаем друг друга. Объясни, что тебе надо.

Особенно это поясни:
а время, за которое произошло изменение, мне НЕ известно и никак не задается в явном виде... я НИКАК не влияю на шаг

Последний раз редактировалось Stilet; 05.03.2011 в 08:58.
pwian вне форума Ответить с цитированием
Старый 04.03.2011, 19:40   #9
byzyan
 
Регистрация: 19.11.2009
Сообщений: 9
По умолчанию

мне нужно решить это уравнение так, чтобы я мог сказать(узнать), что в i-тый момент времени ток равен "значение"... вот так
byzyan вне форума Ответить с цитированием
Старый 04.03.2011, 20:10   #10
pwian
Пользователь
 
Регистрация: 03.07.2009
Сообщений: 21
По умолчанию

Ты находишь точки (tj,yj) - запоминаешь их в массиве. Значит в i-ый момент времен:
1) находишь точки t[j],t[j+1] в нашем массиве, таких, что t[j]<=t[i]<=t[j+1], где t[i]- наш i-ый момент времен.
2) Тебе также известны значения y[j],y[j+1] - в нашем массиве. Теперь соединяешь их прямой, на этой прямой обозначаешь y[i], и как-то по подобию треугольников находишь ее значение.
Для данной задачи лучше выбрать постоянный шаг, например шаг h=0.1 or h=0.01;
Если t[i]>Tmax, которое ты ввел, то введи Tmax>t[i].
pwian вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПРОГРАММА В РУНГЕ-КУТТЕ Roman967 Паскаль, Turbo Pascal, PascalABC.NET 0 20.05.2010 18:22
Рунге- Кутта на Си Ekатерина Помощь студентам 5 28.04.2010 19:31
Метод Рунге-Кутта (Си) PPPPPP Общие вопросы C/C++ 1 13.04.2010 00:55
Метод Рунге-Кутта (Си) PPPPPP Помощь студентам 2 12.04.2010 02:58
метод Рунге sneZZZinka Помощь студентам 1 21.12.2009 17:31