double* ForwardEulerSolver::SolveEquation(){
    double* output = new double[GetIterationNumber()];
    double y = GetInitialValue();
    output[0] = y;
    
    for (int i = 1; i < GetIterationNumber(); ++i) {
        output[i] = y + GetStepSize()*RightHandSide(y, GetInitialTime() + i*GetStepSize());
        y = output[i];
    }
    return output;
}
void RungeKuttaSolver::SolveEquation(std::ostream& stream)
{
	double y = GetInitialValue();

	double t = GetInitialTime();

	double h = GetStepSize();
	assert(h > 1e-6);
	std::cout << "Step size: " << h << std::endl;

	int n = static_cast<int>(
			std::floor((GetFinalTime() - GetInitialTime()) / h));

	stream << t << " " << y << "\n";

	for (int i = 1; i <= n; ++i) {
		double k1 = h * RightHandSide(y, t);
		double k2 = h * RightHandSide(y + 0.5 * k1, t + 0.5 * h);
		double k3 = h * RightHandSide(y + 0.5 * k2, t + 0.5 * h);
		double k4 = h * RightHandSide(y + k3, t + h);

		double temp = y + 1.0/6.0 * (k1 + 2 * k2 + 2 * k3 + k4);
		if (-1e-6 <= temp && temp <= 0.0) {
			y = 0.0;
		} else if (1.0 <= temp && temp <= (1.0 + 1e-6) ) {
			y = 1.0;
		} else if (0.0 < temp && temp < 1.0) {
			y = temp;
		} else {
			// Freak out!
			throw Exception("STEP", "Step size too large.");
		}
		t += h;

		stream << t << " " << y << "\n";
	}
}