• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Численное Интегрирование Системы Диф. Уравнений Методом Рунге-кутта

  • Автор темы DenProx
  • Дата начала
D

DenProx

Доброго времени суток. У меня есть вот такая задачка:

Разработать функцию для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта. Прототип функции:

C++:
void runge_k(void f(double *y, double *ys, double t), double *y, int n, duble tn, double tk, int m, double delt);

где:

f - функция вычисления правых частей системы дифференциальных уравнений;
y - массив размера n значений зависимых переменных;
ys - массив размера n значений производных;
n - порядок системы дифференциальных уравнений;
t - независимая переменная;
tn - начальное значение интервала интегрирования;
tk - конечное значение интервала интегрирования;
m - начальное число разбиений отрезка интегрирования ;
delt - шаг интегрирования.

Шаг интегрирования для метода использовать 0,0001.

Помогите решить, пожалуйста !

У меня есть примерное решение на С++ (решено не до конца)

C++:
void runge_k(
void f(double *y, double *ys, double t),
double *y, int n,
duble tn, double tk,
int m, double delt)
{
double k1[n],k2[n],k3[n],k4[n],Yh[n+1];
double h=delt;
double* ys=y+n+1;
double X;
for(X=tn;X<tk;X+=h){
f(y,ys,X);

for( int i=0;i<n;i++) k1[i]=h*y[i+1];
for( int i=0;i<n;i++) Yh[i]=y[i]+0.5*k1[i];		 
f(Yh,Yh+n+1,X+h*0.5);

for( int i=0;i<n;i++) k2[i]=h*Yh[i+1];
for( int i=0;i<n;i++) Yh[i]=y[i]+0.5*k2[i];
f(Yh,Yh+n+1,X+h*0.5);

for( int i=0;i<n;i++) k3[i]=h*Yh[i+1];
for( int i=0;i<n;i++) Yh[i]=y[i]+k3[i];
f(Yh,Yh+n+1,X+h);

for( int i=0;i<n;i++) k4[i]=h*Yh[i+1];

for( int i=0;i<n;i++) y[i]+=1./6.*(k1[i]+2*k2[i]+2*k3[i]+k4[i]);
}
h=tk-X;
f(y,ys,X);

for( int i=0;i<n;i++) k1[i]=h*y[i+1];
for( int i=0;i<n;i++) Yh[i]=y[i]+0.5*k1[i];		 
f(Yh,Yh+n+1,X+h*0.5);

for( int i=0;i<n;i++) k2[i]=h*Yh[i+1];
for( int i=0;i<n;i++) Yh[i]=y[i]+0.5*k2[i];
f(Yh,Yh+n+1,X+h*0.5);

for( int i=0;i<n;i++) k3[i]=h*Yh[i+1];
for( int i=0;i<n;i++) Yh[i]=y[i]+k3[i];
f(Yh,Yh+n+1,X+h);

for( int i=0;i<n;i++) k4[i]=h*Yh[i+1];

for( int i=0;i<n;i++) y[i]+=1./6.*(k1[i]+2*k2[i]+2*k3[i]+k4[i]);
}

Буду очень признателен за любую помощь!
 
D

DenProx

Еще забыл написать, что необходимо применить эту функцию для интегрирования дифференциального уравнения 3-го порядка:

y''' + 2y'' + 3y' + y = 5 + x^2

в интервале x [0,2] с шагом delta X = 0,1
и начальными условиями: x=0; y(0) =1; y'(0) = 0,1 ; y''(0) = 0
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!