Nie będę dociekał, jak to powinno wyglądać w C++. Tym bardziej nie będę się wdawał w klasy (można mnie nazwać przeciwnikiem OOP, ale używanie klas w momencie, kiedy wystarczy jedna prosta funkcja, to już przykład overengineering).
Natomiast jeśli chodzi o obliczenie wyjścia na podstawie wejścia, to mam następujące uwagi:
0) W Twoich wzorach jest założenie, że warunek początkowy jest zerowy:
y(0) = 0
1) Dalej jest potrzebna jakaś funkcja do całkowania numerycznego.
Bo mamy przecież:
dy(t) / dt = K/T * [ x(t) - y(t) ]
U Ciebie jest jakiś inny wzór. W sumie to nie wiem, skąd się wziął. (A może autor miał coś zupełnie innego na myśli?)
No to dla najprostrzego całkowania, metodą Eulera, może być tak (kod w Pythonie, można sprawdzić działanie w JDoodle, jak ktoś nie ma zainstalowanego):
def fPrim(x, K, T):
def prim(y):
return K/T * (x - y)
return prim
def euler(f, start = 0, end = 1, h = 0.125, initial = 0):
y = initial
t = start
out = [y]
while t < end:
y = y + h * f(y)
out.append(y)
t = t + h
return out
print( euler(fPrim(20, 1, 1), end=5) )
Funkcja euler przyjmuje jako pierwszy parametr funkcję zwracającą pochodną po czasie dla danej wartości y.
Poniżej coś podobnego w C (C++ się tykał nie będę ;-)), testowane w JDoodle:
#include<stdio.h>
double deriv(double x, double K, double T, double y) {
return K/T * (x - y);
}
int main() {
double t = 0;
double y = 0;
double h = 0.125;
while ( t < 5 ) {
printf( "%.3f %.2f\n", t, y );
y = y + h * deriv(20, 1, 1, y);
t = t + h;
}
printf( "%.3f %.2f\n", t, y );
return 0;
}
Zwracam przy tym drobną uwagę na krok całkowania: h = 0.125. Można zastosować inny, ale dla bezpieczeństwa (numerycznego) powinna być to wartość 1 / 2^N (N - całkowite). Ja zastosowałem N = 3, czyli 1/8.
Przy całkowaniu numerycznym można też zastosować inne metody, np. Rungego-Kutty - będą zapewnie dawały mniejsze błędy.