Układ 'n' równań różniczkowych liniowych

0

Mam do napisania program obiektowo rozwiązujący układ 'n' równań różniczkowych liniowych.

Oczywiście nie chodzi mi tutaj o zrobienie przez Was zadania za mnie, bo chcę się tego nauczyć.

Jednak chciałbym pojąć, jak należy to wykonać matematycznie.

Jakie to jest równanie różniczkowe liniowe, a jakie nieliniowe? (w google nie znalazłem nic konkretnie mówiącego o tym)

Czy podając ile tych równań będzie, powinno się też podawać jakiego rzędu mają być te równania?

Czy jest ktoś z Was w stanie naprowadzić mnie na dobry tok myślenia?

0

Liniowe czyli np x'' = x^2 + 45x +8
a nie np. x'' = sin(x)
Ogólnie liniowe możesz przedstawić jako macierz

0

Mea culpa. Pochrzaniło mi się bo też można jako macierz zapisać :)

0

mam przydatny kod programu do rozwiązywania układów równań różniczkowych;

przykład, który zamieszczam poniżej to obiektowo rozwiązany układ transmitancji

plik: unit1.cpp

#include <math.h>
#include <conio.h>
#include "diffeq.h"
#include <iostream.h>
#include <vcl.h>

const double H=0.0001;  //krok całkowania
const double pi=M_PI;   //deklaracja wartosci liczby PI
const float fs=10;      //czestotliwosc strojenia wzmacniacza

float xp (float t)   //pochodna funkcji sinus(wt)
   {
      return 2*pi*fs*cos(2*fs*pi*t);
   };

//Deklaracja klasy - dziedziczy z DifferentialEquations
class  rownanie : public DifferentialEquations
   {
      float y1,y2;      //sygnal wyjsciowy
      float dy1,dy2;    //pochodna sygnalu wyjsciowego
      float x;          //wartosc syganlu wejsciowego
      float ksi, k, ws; //paramtery wzmacniacza

      public:
         rownanie();       //konstruktor
         ~rownanie(){};    //destruktor

         void Init(double StartTime);
         void PutValuesToObject(float New_t,float New_x);
         void GetValuesFromObject(float& New_y1,float& New_y2);
         void RightPartsCalculation();
   };

//Deklaracja metod klasy rownanie

rownanie::rownanie():DifferentialEquations(2,H,0.0){};   //konstruktor

void rownanie::Init(double StartTime) //metoda ustalajaca dane poczatkowe
   {
      t=StartTime;

      //paramtery wzmacniacza
      k=10;
      ksi=0.6;
      ws=2*pi*fs;

      y1=0.0; ptrArrayY[0]=&y1; // przekazanie wskaznikowi adresu y1
      y2=0.0; ptrArrayY[1]=&y2; // przekazanie wskaznikowi adresu y2

      dy1=0.0; ptrArraydY[0]=&dy1; //przekazanie wskaznikowi adresu dy1
      dy2=0.0; ptrArraydY[1]=&dy2; //przekazanie wskaznikowi adresu dy2


   }

void rownanie::RightPartsCalculation() //prawe strony ukladu rownan
   {
      dy1=y2;
      dy2=(-2*ksi*ws)*y2-(ws*ws)*y1+(2*ksi*k*ws)*x;
   }

void rownanie::PutValuesToObject(float New_t,float New_x)
   {  //metoda za pomoca ktorej wprowadza sie dane do obiektu
      t=New_t;
      x=New_x;
   }

void rownanie::GetValuesFromObject(float &New_y1,float &New_y2)
   {  //metoda wyprowadzajaca wyniki  z obiektu
      New_y1=y1;
      New_y2=y2;
   }



int main()
   {
      float y1,y2,xx,tmax,x;
      double t;
      //zapis do pliku
      FILE *wsk, *wsk1;
      wsk=fopen("d:\\wyn1.txt","w");
      wsk1=fopen("d:\\wyn2.txt","w");

      rownanie Rownanie_wzm; //inicjalizacja obiektu Rownanie_wzm klasy rownanie

      //dane poczatkowe
      tmax=1;
      t=0.0;
      x=xp(t);

      Rownanie_wzm.Init(t);//Inicjowanie obiektu danymi poczatkowymi
      Rownanie_wzm.PutValuesToObject(t,x);//wprowadzanie do obiektu czasu i wartosci
                //sygnalu wejsciowego
      do
         {
            t+=H;
            x=xp(t);
            Rownanie_wzm.PutValuesToObject(t,x);
            Rownanie_wzm.Run(t);
            cout << "\nt = "<<t<<"  y1 =  "<<y1<<"  y2 = "<<y2;
            Rownanie_wzm.GetValuesFromObject(y1,y2);
            fprintf(wsk,"\n%f  %f",t, y1);
            fprintf(wsk1,"\n%f  %f",t, y2);
         }
     while( t<tmax);
     getch();
     return 0;
   };

plik: DIFFEQ.cpp

#ifndef __DIFFEQ_H__
#include "diffeq.h"             
#define __DIFFEQ_H__
#endif

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*                                                       */
/*         class    DifferentialEquations   v2.0         */
/*                                                       */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * */
DifferentialEquations::DifferentialEquations (int      New_qDiffEquations,
					      double    New_IntegrationStep,
					      double   StartTime)
{
  t=StartTime;
  qDiffEquations = New_qDiffEquations;
  IntegrationStep= New_IntegrationStep;
  IntegrationStep_2= New_IntegrationStep/2.;

  if( (ptrArrayY  = new float * [qDiffEquations])==NULL ||
      (ptrArraydY = new float * [qDiffEquations])==NULL ||
      (ArraydY_1  = new float [qDiffEquations])==NULL )
  {
    printf(" ERROR: Brak pamieci dla obiektu 'DifferentialEquations'.\n");
    exit(1);
  };
     
  for ( i=0; i<qDiffEquations; i++)  ArraydY_1[i] =0.;
}

DifferentialEquations::~DifferentialEquations()
{
  delete[] ptrArrayY;
  delete[] ptrArraydY;

  delete[] ArraydY_1;              
}

void DifferentialEquations::Integration()
{
  RightPartsCalculation();
  for (i=0; i < qDiffEquations; i++)
    *(ArraydY_1+i)=*ptrArraydY[i];
  t+=IntegrationStep;
  RightPartsCalculation();
  for( i=0; i < qDiffEquations; i++ )
    *ptrArrayY[i] += (*ptrArraydY[i] + *(ArraydY_1+i)) * IntegrationStep_2;
}

void DifferentialEquations::Run(double  New_t)
{
  if (t > New_t) return;
  Integration();
}

żeby program zadziałał należy otworzyć plik unit1.cpp i poprzez: PROJECT/ADD TO PROJECT lub Shift+F11 (dla C++ Builder 6) nalezy podać ścieżkę do pliku DIFFEQ.cpp . Po uruchomieniu, program rozpocznie całkowanie a wynik zapisany zostanie w 2 plikach *.txt na partycji 'D'.

Podobno program DIFFEQ.cpp służy do rozwiązywania układów równań różniczkowych, ja jednak nie mam pojęcia jak to powiązać z programem, który ja mam wykonać, a mianowicie "Obiektowe rozwiązanie układu 'n' równań różniczkowych liniowych".

1 użytkowników online, w tym zalogowanych: 0, gości: 1