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".