Member 11387650 Ответов: 1

Пиковое значение и погрешность расчета для Рунге Кутты


Мне пришлось вычислять дифференциальное уравнение по времени с помощью метода Рунге-Кутты. Я приложил свой код, но мне нужна дополнительная помощь, чтобы также найти пиковое значение в момент времени 43 секунды в коде. Мне нужна помощь в том, как приблизиться к пиковому значению Z().
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include "winbgi2.h"
#define n 3
#define dist 0.1
#define max 50
void rungekutta(double x, double y[], double step);     
double fun(double x, double y[], int i);

void main()
{
   graphics(50,30);
   double t, z[n];
   int j;
   FILE *f;
   fopen_s(&f, "padela.txt", "w+");          
   t = 0.0;
   z[0] = 0;            
   z[1] = 0;
   z[2] = 0;
   fprintf(f,"time\t\tZ-axis\n");
   fprintf(f, "%lf\t\t%lf\n",t,z[2]);
   for (j = 1; j*dist <= max; j++)
   {
      t = j*dist;
      rungekutta(t,z,dist);
      fprintf(f, "%lf\t\t%lf\n",t,z[2]);
      circle(t+200,z[2]+200,7);
   }

   fclose(f);
   getch();
}

void rungekutta(double x, double z[], double step)
{ 
   double h = step / 2.0,        
   t1[n], t2[n], t3[n],          
   k1[n], k2[n], k3[n], k4[n];   
   int i;
   for (i = 0; i<n; i++)
   {
      t1[i] = z[i] + 0.5*(k1[i] = step*fun(x, z, i));
   }
   for (i = 0; i<n; i++)
   {
      t2[i] = z[i] + 0.5*(k2[i] = step*fun(x + h, t1, i));
   }
   for (i = 0; i<n; i++)
   {
      t3[i] = z[i] + (k3[i] = step*fun(x + h, t2, i));
   }
   for (i = 0; i<n; i++)
   {
      k4[i] = step*fun(x + step, t3, i);
   }
   for (i = 0; i<n; i++)
   {
      z[i] += (k1[i] + 2 * k2[i] + 2 * k3[i] + k4[i]) / 6.0;
   }
}

double fun(double x, double z[], int i)
{
   double a=0.2,b=0.2,c=5.7;
   if (i == 0)
   {
      return -z[1]-z[2];
   }
   if (i == 1)
   {
      return z[0]+(a*z[1]);
   }
   if (i == 2)
   {
      return b+(z[2]*(z[0]-c));
   }
}


Что я уже пробовал:

Мне нужна помощь в том, как приблизиться к пиковому значению Z().

Richard MacCutchan

Это ваш третий пост с этим вопросом, удалили ли вы предыдущие версии, которые уже дали вам решения?

1 Ответов

Рейтинг:
1

KarstenK

Вы должны сохранить свое максимальное значение и проверить его, а не только обновить новое максимальное значение. Лучше всего хранить также значение времени.

Пишите свой код лучше так, потому что он понятнее и поэтому позволяет избежать ошибок:

for (i = 0; i<n; i++)
  {
     k2[i] = step*fun(x + h, t1, i);
     t2[i] = z[i] + 0.5*(k2[i]);
  }
Используйте отладчик и сделайте больше выходных данных.