На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> метод Руеге-Кутты для автономной системы ОДУ
    Народ, поможите
    как будет выглядеть метод Рунге-Кутты 4 порядка для решения автономной системы ОДУ? Или объясните, плиз, как перейти от неавтономной системы к автономной и как при этом модифицируется алгоритм вычислений (в котором явно абсциссы не присутствуют).
      у-у:)
      а чем отличается автономная система от неавтономной?

      сам метод я  делал, только вот не знаю, для какой системы...
        Цитата tomsksmile, 03.07.03, 07:10:44
        как будет выглядеть метод Рунге-Кутты 4 порядка для решения автономной системы ОДУ?

        Так же, как и для неавтономной, только правая часть (функция F) теперь не зависит от х. Код приведен ниже (для автономной и неавтономной). Фактически, нет необходимости менять что-то в алгоритме вычисления, достаточно ввести функцию F, принимающую кроме аргумента y ещё и х, но зависящую только от y. Т.е. х будет фиктивным параметром.


        Цитата tomsksmile, 03.07.03, 07:10:44
        Или объясните, плиз, как перейти от неавтономной системы к автономной и как при этом модифицируется алгоритм вычислений (в котором явно абсциссы не присутствуют).

        Есть один способ. Пусть система имеет n неизвестных y1..yn. Введем новую переменную yn+1, такую, что yn+1'=1. Заменим в правой части системы х на yn+1. Теперь у системы увеличилась размерность на 1, но она явно не зависит от времени - хотя фактически, ничего не изменилось, кроме способа записи.
        В общем случае, другого способа, не повышающего размерность, не существует.


        Вот пример на псевдокоде. Перевести вручную на что хочешь не составит труда. Процедура решает систему из n уравнений с n неизвестными вида yi'=Fi(x,y), где производная берется по x. Шаг интегрирования (делается один шаг) равен h. Начальное состояние находится в y, там же находится состояние на следующем шаге.

        В псевдокоде используется вызов процедуры SetBounds, который устанавливает размер массивов так, чтобы в них были элементы с номерами от 1 до n.

        Это код для решения неавтономной системы
        ExpandedWrap disabled
          <br>function F(I:Integer; X:Real; Y:array of Real):Real;<br>begin<br>...<br>end;<br><br>procedure SystemRungeKuttStep(<br>    const   x   :   Real;<br>    const   h   :   Real;<br>    const   n   :   Integer;<br>    var     y   :   array of Real);<br>var<br>   I        :   Integer;<br>   yt       :   array of Real;<br>   k1       :   array of Real;<br>   k2       :   array of Real;<br>   k3       :   array of Real;<br>   k4       :   array of Real;<br>begin<br>    SetBounds(yt,   [1,N]);<br>    SetBounds(k1,   [1,N]);<br>    SetBounds(k2,   [1,N]);<br>    SetBounds(k3,   [1,N]);<br>    SetBounds(k4,   [1,N]);<br><br>    for I:=1 to N do<br>        k1[i] := h*F(i,x,y);<br><br>    for i := 1 to n do<br>        yt[i] := y[i]+0.5*k1[i];<br>    for I:=1 to N do<br>        k2[i] := h*F(i,x+h*0.5,yt);<br><br>    for i := 1 to n do<br>        yt[i] := y[i]+ 0.5*k2[i];<br>    for I:=1 to N do<br>        k3[i] := h*F(i,x+h*0.5,yt);<br><br>    for i := 1 to n do<br>        yt[i] := y[i] + k3[i];<br>    for I:=1 to N do<br>        k4[i] := h*F(i,x+h,yt);<br><br>    for i := 1 to n do<br>        y[i] := y[i] + (k1[i]+2.0*k2[i]+2.0*k3[i]+k4[i])/6;<br>end;<br>



        Это код для решения автономной системы
        ExpandedWrap disabled
          <br>function F(I:Integer;Y:array of Real):Real;<br>begin<br>...<br>end;<br><br>procedure SystemRungeKuttStep(<br>    const   h   :   Real;<br>    const   n   :   Integer;<br>    var     y   :   array of Real);<br>var<br>   I        :   Integer;<br>   yt       :   array of Real;<br>   k1       :   array of Real;<br>   k2       :   array of Real;<br>   k3       :   array of Real;<br>   k4       :   array of Real;<br>begin<br>    SetBounds(yt,   [1,N]);<br>    SetBounds(k1,   [1,N]);<br>    SetBounds(k2,   [1,N]);<br>    SetBounds(k3,   [1,N]);<br>    SetBounds(k4,   [1,N]);<br><br>    for I:=1 to N do<br>        k1[i] := h*F(i,y);<br><br>    for i := 1 to n do<br>        yt[i] := y[i]+0.5*k1[i];<br>    for I:=1 to N do<br>        k2[i] := h*F(i,yt);<br><br>    for i := 1 to n do<br>        yt[i] := y[i]+ 0.5*k2[i];<br>    for I:=1 to N do<br>        k3[i] := h*F(i,yt);<br><br>    for i := 1 to n do<br>        yt[i] := y[i] + k3[i];<br>    for I:=1 to N do<br>        k4[i] := h*F(i,yt);<br><br>    for i := 1 to n do<br>        y[i] := y[i] + (k1[i]+2.0*k2[i]+2.0*k3[i]+k4[i])/6;<br>end;<br>
          Цитата Demo_S, 03.07.03, 10:07:02
          а чем отличается автономная система от неавтономной?

          в автономной системе правая часть не содержит времени (в явной форме).
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0.2395 ]   [ 15 queries used ]   [ Generated: 6.10.26, 00:56 GMT ]