Рубрики

Метод Рунге-Кутты 4-го порядка для решения дифференциального уравнения

Учитывая следующие входные данные,

  • Обычное дифференциальное уравнение, которое определяет значение dy / dx в виде x и y.
  • Начальное значение y, т. Е. Y (0)

Таким образом, мы приведены ниже.

Задача состоит в том, чтобы найти значение неизвестной функции y в заданной точке x.

Метод Рунге-Кутты находит приблизительное значение y для данного x. Только обыкновенные дифференциальные уравнения первого порядка могут быть решены с помощью метода 4-го порядка Рунге Кутты.

Ниже приведена формула, используемая для вычисления следующего значения y n + 1 из предыдущего значения y n . Значения n равны 0, 1, 2, 3,… (x — x0) / h. Здесь h — высота шага, а x n + 1 = x 0 + h

, Меньший размер шага означает большую точность.


Формула в основном вычисляет следующее значение y n + 1, используя текущее значение y n плюс средневзвешенное значение четырех приращений.

  • k 1 — приращение, основанное на наклоне в начале интервала, используя y
  • K 2 представляет собой приращение на основе наклона в средней точке интервала, с использованием Y + 1 HK / 2.
  • к 3 снова приращение на основе наклона в средней точке, используя при помощи у + кк 2/2.
  • k 4 — это приращение, основанное на наклоне в конце интервала, с использованием y + hk 3 .

Этот метод является методом четвертого порядка, это означает, что локальная ошибка усечения имеет порядок O (h 5 ), в то время как общая накопленная ошибка составляет порядок O (h 4 ).

Источник: https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods

Ниже приведена реализация приведенной выше формулы.

C / C ++

// C программа для реализации метода Рунге Кутты
#include<stdio.h>

  
// Пример дифференциального уравнения "dy / dx = (x - y) / 2"

float dydx(float x, float y)

{

    return((x - y)/2);

}

  
// Находит значение y для заданного x, используя размер шага h
// и начальное значение y0 в x0.

float rungeKutta(float x0, float y0, float x, float h)

{

    // Подсчитать количество итераций, используя размер шага или

    // высота шага h

    int n = (int)((x - x0) / h);

  

    float k1, k2, k3, k4, k5;

  

    // Итерация по количеству итераций

    float y = y0;

    for (int i=1; i<=n; i++)

    {

        // Применить формулы Рунге Кутты, чтобы найти

        // следующее значение у

        k1 = h*dydx(x0, y);

        k2 = h*dydx(x0 + 0.5*h, y + 0.5*k1);

        k3 = h*dydx(x0 + 0.5*h, y + 0.5*k2);

        k4 = h*dydx(x0 + h, y + k3);

  

        // Обновить следующее значение y

        y = y + (1.0/6.0)*(k1 + 2*k2 + 2*k3 + k4);;

  

        // Обновляем следующее значение x

        x0 = x0 + h;

    }

  

    return y;

}

  
// Метод драйвера

int main()

{

    float x0 = 0, y = 1, x = 2, h = 0.2;

    printf("\nThe value of y at x is : %f",

            rungeKutta(x0, y, x, h));

    return 0;

}

Джава

// Java-программа для реализации метода Рунге Кутты

import java.io.*;

class differential

{

    double dydx(double x, double y)

    {

        return ((x - y) / 2);

    }

      

    // Находит значение y для заданного x, используя размер шага h

    // и начальное значение y0 в x0.

    double rungeKutta(double x0, double y0, double x, double h)

    {

        differential d1 = new differential();

        // Подсчитать количество итераций, используя размер шага или

        // высота шага h

        int n = (int)((x - x0) / h);

  

        double k1, k2, k3, k4, k5;

  

        // Итерация по количеству итераций

        double y = y0;

        for (int i = 1; i <= n; i++) 

        {

            // Применить формулы Рунге Кутты, чтобы найти

            // следующее значение у

            k1 = h * (d1.dydx(x0, y));

            k2 = h * (d1.dydx(x0 + 0.5 * h, y + 0.5 * k1));

            k3 = h * (d1.dydx(x0 + 0.5 * h, y + 0.5 * k2));

            k4 = h * (d1.dydx(x0 + h, y + k3));

  

            // Обновить следующее значение y

            y = y + (1.0 / 6.0) * (k1 + 2 * k2 + 2 * k3 + k4);

              

            // Обновляем следующее значение x

            x0 = x0 + h;

        }

        return y;

    }

      

    public static void main(String args[])

    {

        differential d2 = new differential();

        double x0 = 0, y = 1, x = 2, h = 0.2;

          

        System.out.println("\nThe value of y at x is : " 

                    + d2.rungeKutta(x0, y, x, h));

    }

}

  
// Этот код предоставлен Prateek Bhindwar

питон

# Программа Python для реализации метода Рунге Кутты
# Пример дифференциального уравнения "dy / dx = (x - y) / 2"

def dydx(x, y):

    return ((x - y)/2)

  
# Находит значение y для заданного x, используя размер шага h
# и начальное значение y0 при x0.

def rungeKutta(x0, y0, x, h):

    # Подсчитать количество итераций, используя размер шага или

    # высота шага h

    n = (int)((x - x0)/h) 

    # Итерировать по количеству итераций

    y = y0

    for i in range(1, n + 1):

        "Apply Runge Kutta Formulas to find next value of y"

        k1 = h * dydx(x0, y)

        k2 = h * dydx(x0 + 0.5 * h, y + 0.5 * k1)

        k3 = h * dydx(x0 + 0.5 * h, y + 0.5 * k2)

        k4 = h * dydx(x0 + h, y + k3)

  

        # Обновить следующее значение y

        y = y + (1.0 / 6.0)*(k1 + 2 * k2 + 2 * k3 + k4)

  

        # Обновить следующее значение x

        x0 = x0 + h

    return y

  
# Метод драйвера

x0 = 0

y = 1

x = 2

h = 0.2

print 'The value of y at x is:', rungeKutta(x0, y, x, h)

  
# Этот код предоставлен Prateek Bhindwar

C #

// C # программа для реализации Runge
// метод Кутты

using System;

  

class GFG {

      

    static double dydx(double x, double y)

    {

        return ((x - y) / 2);

    }

      

    // Находит значение y для данного x

    // используя размер шага h и начальный

    // значение y0 в x0.

    static double rungeKutta(double x0,

                double y0, double x, double h)

    {

      

        // Подсчитать количество итераций используя

        // размер шага или высота шага h

        int n = (int)((x - x0) / h);

  

        double k1, k2, k3, k4;

  

        // Итерация по количеству итераций

        double y = y0;

          

        for (int i = 1; i <= n; i++) 

        {

              

            // Применяем формулы Рунге Кутты

            // найти следующее значение у

            k1 = h * (dydx(x0, y));

              

            k2 = h * (dydx(x0 + 0.5 * h,

                             y + 0.5 * k1));

                               

            k3 = h * (dydx(x0 + 0.5 * h,

                            y + 0.5 * k2));

                              

            k4 = h * (dydx(x0 + h, y + k3));

  

            // Обновить следующее значение y

            y = y + (1.0 / 6.0) * (k1 + 2 

                       * k2 + 2 * k3 + k4);

              

            // Обновляем следующее значение x

            x0 = x0 + h;

        }

          

        return y;

    }

      

    // Код драйвера

    public static void Main()

    {

          

        double x0 = 0, y = 1, x = 2, h = 0.2;

          

        Console.WriteLine("\nThe value of y"

                             + " at x is : "

                 + rungeKutta(x0, y, x, h));

    }

}

  
// Этот код предоставлен Sam007.

PHP

<?php
// PHP-программа для реализации
// метод Рунге Кутта

  
// Пример дифференциального уравнения
// "dy / dx = (x - y) / 2"

function dydx($x, $y)

{

    return(($x - $y) / 2);

}

  
// Находит значение y для
// дано х, используя размер шага h
// и начальное значение y0 в x0.

function rungeKutta($x0, $y0, $x, $h)

{

      

    // Подсчитать количество итераций

    // используя размер шага или шаг

    // высота h

    $n = (($x - $x0) / $h);

  

    $k1; $k2; $k3; $k4; $k5;

  

    // Итерация по номеру

    // итераций

    $y = $y0;

    for($i = 1; $i <= $n; $i++)

    {

          

        // Применить Рунге Кутта

        // формулы для поиска

        // следующее значение у

        $k1 = $h * dydx($x0, $y);

        $k2 = $h * dydx($x0 + 0.5 * $h,

                        $y + 0.5 * $k1);

        $k3 = $h * dydx($x0 + 0.5 * $h

                        $y + 0.5 * $k2);

        $k4 = $h * dydx($x0 + $h, $y + $k3);

  

        // Обновить следующее значение y

        $y = $y + (1.0 / 6.0) * ($k1 + 2 * 

                    $k2 + 2 * $k3 + $k4);;

  

        // Обновляем следующее значение x

        $x0 = $x0 + $h;

    }

  

    return $y;

}

  

    // Метод драйвера

    $x0 = 0;

    $y = 1; 

    $x = 2; 

    $h = 0.2;

    echo "The value of y at x is : ",

          rungeKutta($x0, $y, $x, $h);

  
// Этот код предоставлен anuj_67.
?>

Выход:

The value of y at x is : 1.103639

Сложность по времени вышеупомянутого решения составляет O (n), где n — (x-x0) / ч.

Некоторые полезные ресурсы для подробных примеров и большего количества объяснения.
http://w3.gazi.edu.tr/~balbasi/mws_gen_ode_txt_runge4th.pdf
https://www.youtube.com/watch?v=kUcc8vAgoQ0

Эта статья предоставлена Арпит Агарвал . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Метод Рунге-Кутты 4-го порядка для решения дифференциального уравнения

0.00 (0%) 0 votes