public Model() { wspolczynniki = new Coefficients() { k1 = 1.0, k2 = 1.0, l1 = 1.0, l2 = 1.0, b = 1.0, mass = 1.0, simulation_step = 0.1, simulation_time = 100.0, amplitude = 1.0, period = 1.0, constant = 0.0, init_x1 = 0.0, init_x2 = 0.0 }; wspolczynniki.calculate_size(); }
public bool Calculate() { double czas_koncowy = wspolczynniki.simulation_time; // Koniec zakresu calkowania double krok = wspolczynniki.simulation_step; // Krok calkowania double a0, b0, c0, a1, b1, c1, a2, b2, c2, a3, b3, c3; // Wspolczynniki do metody calkowania wspolczynniki.calculate_size(); int size = wspolczynniki.size; double k1 = wspolczynniki.k1; double k2 = wspolczynniki.k2; double l1 = wspolczynniki.l1; double l2 = wspolczynniki.l2; double b = wspolczynniki.b; double m = wspolczynniki.mass; double x1, x2, v; wspolrzedne_x1 = new double[size]; wspolrzedne_x2 = new double[size]; double[] wspolrzedne_v = new double[size]; t = new double[size]; // Warunki poczatkowe /* * wspolrzedne_x1[0] = wspolczynniki.init_x1; * wspolrzedne_x2[0] = wspolczynniki.init_x2; * wspolrzedne_v[0] = wspolczynniki.init_v;*/ wspolrzedne_x1[0] = 0; wspolrzedne_x2[0] = 0; wspolrzedne_v[0] = 0; // Inicjalizacja wektora X rozwiazania for (int i = 0; i < size; i++) { t[i] = krok * i; } // Algorytm całkowania for (int i = 0; i < size - 1; i++) { x1 = wspolrzedne_x1[i]; x2 = wspolrzedne_x2[i]; v = wspolrzedne_v[i]; a0 = krok * x1_prim(t[i], x1, x2, v); b0 = krok * x2_prim(t[i], x1, x2, v); c0 = krok * v_prim(t[i], x1, x2, v); a1 = krok * x1_prim(t[i] + 0.5 * krok, x1 + 0.5 * a0, x2 + 0.5 * b0, v + 0.5 * c0); b1 = krok * x2_prim(t[i] + 0.5 * krok, x1 + 0.5 * a0, x2 + 0.5 * b0, v + 0.5 * c0); c1 = krok * v_prim(t[i] + 0.5 * krok, x1 + 0.5 * a0, x2 + 0.5 * b0, v + 0.5 * c0); a2 = krok * x1_prim(t[i] + 0.5 * krok, x1 + 0.5 * a1, x2 + 0.5 * b1, v + 0.5 * c1); b2 = krok * x2_prim(t[i] + 0.5 * krok, x1 + 0.5 * a1, x2 + 0.5 * b1, v + 0.5 * c1); c2 = krok * v_prim(t[i] + 0.5 * krok, x1 + 0.5 * a1, x2 + 0.5 * b1, v + 0.5 * c1); a3 = krok * x1_prim(t[i] + krok, x1 + a2, x2 + b2, v + c2); b3 = krok * x2_prim(t[i] + krok, x1 + a2, x2 + b2, v + c2); c3 = krok * v_prim(t[i] + krok, x1 + a2, x2 + b2, v + c2); wspolrzedne_x1[i + 1] = wspolrzedne_x1[i] + (1.0 / 6.0) * (a0 + 2 * a1 + 2 * a2 + a3); wspolrzedne_x2[i + 1] = wspolrzedne_x2[i] + (1.0 / 6.0) * (b0 + 2 * b1 + 2 * b2 + b3); wspolrzedne_v[i + 1] = wspolrzedne_v[i] + (1.0 / 6.0) * (c0 + 2 * c1 + 2 * c2 + c3); if (Double.IsInfinity(wspolrzedne_x1[i + 1]) || Double.IsInfinity(wspolrzedne_x2[i + 1]) || Double.IsInfinity(wspolrzedne_v[i + 1]) || Double.IsNaN(wspolrzedne_x1[i + 1]) || Double.IsNaN(wspolrzedne_v[i + 1]) || Double.IsNaN(wspolrzedne_x2[i + 1])) { return(false); } } for (int i = 0; i < size; i++) { wspolrzedne_x1[i] += wspolczynniki.init_x1; wspolrzedne_x2[i] += wspolczynniki.init_x2; } return(true); }