Mam za zadanie napisać program który rozwiąże układ równań różniczkowych opisany transmitancją:

G(s)=k/(s*(Tws+1)(Tms+1)+k)

Dostałem za przykład taki kod:

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
/*program rozwiazuje uklad dwoch rownan rozniczkowych powstaly z rownania
rozniczkowego drugiego rzedu czlonu oscylacyjnego metoda trapezow
	 T^2*d^2y/dy^2+2*ksi*T*dy/dt+y=k*f(t)
przez podstawienie y=y1,dy1/dt=y2. W wyniku otrzymamy uklad rownan pierwszego
 rzedu
    dy1/dy=y2
    dy2/dt=-2*ksi/T*y2-1/T/T*y1+k/T/T*f(t)

Oznaczenia k -wspolczynnik wzmocnienia;
	   ksi - wspolczynnik tlumienia
	   T - stala czasowa
nalezy podstawic warunki poczatkowe y1(t=t0) i y2(t=t0)
*/
const float pi=M_PI;
//---------------------------------
 float f(float t)
  {
    float f0=100.0; //czestotliwosc
   return 1.0;
    //return sin(2*f0*pi*t);
  }

 int main()
  {
   FILE *wsk; //wskaznik typu FILE
   wsk=fopen("d:\\1\\rozw1.dat","w");
   float y1,y2,dy1,dy2,t,dt,tk,g,ksi,T,k;
   int n,m;
   n=2; m=2;
   float**ptrArrayY; //macierz wskaznikow calkowanych wartosi
                       //wskaznikow zmiennych calkowanych Y)
   float**ptrArraydY;  //tablica  wskaznikow pochodnych)
   float* ArraydY_1;// tablica pierwszych wartosci dy1 i dy2;
   //Dynamiczny przydzial pamieci
  if( (ptrArrayY  = new float*[n])==NULL ||
      (ptrArraydY = new float * [n])==NULL ||
      (ArraydY_1 =  new float [n])==NULL )
  {
    printf(" ERROR: Brak pamieci dla macierzy");
    cout<<endl;
    exit(1);
  }
   t=0.0;  dt=0.001;  tk=2.0; k=1.0; ksi=0.3; T=0.1;
   y1=0.0; y2=0.0;
   y1  = 0.0;   ptrArrayY[0] = & y1;
   g=f(t);
   dy1=y2;  ptrArraydY[0] = &dy1;
   y2   = 0.0;   ptrArrayY[1] = & y2;
   dy2=-2*ksi/T*y2-1/T/T*y1+k/T/T*f(t);  ptrArraydY[1] = &dy2;
  // *(ArraydY_1)=0.0;

      for (int i=0; i < n; i++)
       *(ArraydY_1+i)=*ptrArraydY[i];

     do
     {
      t+=dt;
      g=f(t);
      dy1=y2;
      dy2=-2*ksi/T*y2-1/T/T*y1+k/T/T*f(t);
       for (int i=0; i<n; i++)
    *(ArraydY_1+i)=*ptrArraydY[i];
      for( int i=0; i < n; i++ )
     *ptrArrayY[i] += (*ptrArraydY[i] + *(ArraydY_1+i)) * dt/2;
      fprintf(wsk,"\n %f %f %f",t,*ptrArrayY[0],*ptrArrayY[1]);
     // *(ArraydY_1+i))
     } while(t<tk);

      fclose(wsk);
      getch();
      return 0;
  }

Po wielu próbach odtworzenia tego programu dla równania o wyższym rzędzie, przychodzę prosić o jakieś ukierunkowanie. To do czego sam doszedłem to układ równań:
link

Nie bardzo wiem jak uzależnić kolejne pochodne tak aby zostały same równania pierwszego rzędu.