Автор Тема: Метод Рунге-Кутта для решения системы диффуров(F''i=F(x,Y))  (Прочитано 9033 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Qwerty100$

  • Губернский секретарь
  • **
  • Сообщений: 44
  • Репутация: 0
у меня вопрос как приспособить этот метод для решения системы слде диффуров
d2_x/dt_2=-GMx/(x^2+y^2)^(3/2)
d2_y/dy_2=-GMy/(x^2+y^2)^(3/2)
Код: (cpp) [Выделить]
#include <stdio.h>
#include <stdafx.h>
#include <math.h>
#include <iostream>

using namespace std;
double f(int i,double x,double y[4]){

}
/*************************************************************************
Один шаг метода Рунге-Кутта четвертого порядка для решения
системы дифферециальных уравнений.

procedure SystemRungeKuttStep(
    const   x   :   Real;
    const   h   :   Real;
    const   n   :   Integer;
    var     y   :   array of Real);

Алгоритм совершает один шаг метода для системы
диффуров y[i]'=F(i,x,y) для i=1..n

Начальная точка имеет кординаты (x,y[1], ..., y[n])

После выполнения алгоритма в переменной y содержится состояние
системы в точке x+h
*************************************************************************/
void step(double x,double h,int n,double y[4])
{
    int i=0;
    double yt[4];
    double k1[4];
    double k2[4];
    double k3[4];
    double k4[4];

    for(i = 1; i <= n; i++)
    {
        k1[i] = h*f(i, x, y);
    }
    for(i = 1; i <= n; i++)
    {
        yt[i] = y[i]+0.5*k1[i];
    }
    for(i = 1; i <= n; i++)
    {
        k2[i] = h*f(i, x+h*0.5, yt);
    }
    for(i = 1; i <= n; i++)
    {
        yt[i] = y[i]+0.5*k2[i];
    }
    for(i = 1; i <= n; i++)
    {
        k3[i] = h*f(i, x+h*0.5, yt);
    }
    for(i = 1; i <= n; i++)
    {
        yt[i] = y[i]+k3[i];
    }
    for(i = 1; i <= n; i++)
    {
        k4[i] = h*f(i, x+h, yt);
    }
    for(i = 1; i <= n; i++)
    {
        y[i] = y[i]+(k1[i]+2.0*k2[i]+2.0*k3[i]+k4[i])/6;
    }
}
/*************************************************************************
Алгоритм решает систему диффуров y[i]'=F(i,x,y) для i=1..n
методом Рунге-Кутта 4 порядка.

Начальная точка имеет кординаты (x,y[1], ..., y[n])

До конечной точки мы добираемся через n промежуточных
с постоянным шагом h=(x1-x)/m

Результат помещается в переменную result[4]
*************************************************************************/
void solvesystemrungekutta(double x,double x1,int steps,double result[4]){
   
    for(int i = 1; i <= steps-1; i++)
    {
        step(x+i*(x1-x)/steps, (x1-x)/steps,4, result);
    }
}

int _tmain(){
//первая координата
double temporaryresult[4];
solvesystemrungekutta(2,3,3,temporaryresult);
for(int i=1;i<=4;i++){
printf("Htpekmnf",temporaryresult[i],'\n');
}
char c=getchar();
return 0;
}


Оффлайн pesOK

  • Коллежский регистратор
  • *
  • Сообщений: 18
  • Репутация: 0
  • Пол: Мужской
Можно приспособить систему.
Если ввести обозначения z=dx/dt и u=dy/dx, получим систему:
       dx/dt=z;
       dz/dt=-GMx/(x^2+y^2)^(3/2);
       dy/dx=u;
       du/dx=-GMy/(x^2+y^2)^(3/2);
Получили систему из 4-х дифуров первого порядка, которую можно решить этим методом (конечно если хватает начальных условий).
       


Оффлайн Qwerty100$

  • Губернский секретарь
  • **
  • Сообщений: 44
  • Репутация: 0
1)мне вот нужны координаты X Y а при такой замене я еще получу координаты X' Y'.Как мне отсеять X' Y'?Просто этот алгоритм не я писал , и чет я не могу его понять
2)Как мне закодить эту систему?

Оффлайн N@tulk@89

  • Губернский секретарь
  • **
  • Сообщений: 23
  • Репутация: 0
помогите пожалуйста! мне нужно с помощью Паскаля осуществить метод Рунге-Кутта для системы 2дифференциальных уравнений 1-ого порядка. вот уравнеия и все что нужно: Найти решение задачи Коши для системы однородных дифференциальных уравнений на отрезке [а,b].
f1=e в степени (y1y2)
f2=e  в степени (-y1y2)   y1(a)=y2(a)=0  a=0, b=2

Оффлайн Likyrg

  • .net developer
  • Надворный советник
  • *****
  • Сообщений: 470
  • Репутация: 16
  • Пол: Мужской
хе! алгоритм могу скинуть, а сразу так готовое решение - прошу в платный раздел (первый в очереди исполнителей буду  :) )
PS хотел прикрепить алгоритм - не получилось, могу на почту или по аське
лучший способ в чём-то разобраться до конца — это попробовать научить этому компьютер (Кнут)

Оффлайн N@tulk@89

  • Губернский секретарь
  • **
  • Сообщений: 23
  • Репутация: 0
скинь пожалуйста по почте, адрес: natalyia89@mai.ru заранее благодарна!

Оффлайн N@tulk@89

  • Губернский секретарь
  • **
  • Сообщений: 23
  • Репутация: 0
извини, я тут в адресе маленmкую ошибку сделала! адрес natalyia89@mail.ru
перешли пожалуйста еще раз!

Оффлайн Likyrg

  • .net developer
  • Надворный советник
  • *****
  • Сообщений: 470
  • Репутация: 16
  • Пол: Мужской
почти не дурак - прислал сразу по правильному адресу, должно быть уже
лучший способ в чём-то разобраться до конца — это попробовать научить этому компьютер (Кнут)

Оффлайн petncik

  • Коллежский регистратор
  • *
  • Сообщений: 1
  • Репутация: 0
нужно решить диф урав методом рунге-кутта. О цене договоримся. Пишите на ignatovpetr@gmail.com