#include #include #define M_PI 3.14159265358979323846 // pi using namespace Eigen; #define STATE_VARS 3*2 // Сами переменные и их проивзодные #define PHI 5 // Количество узлов в схеме #define EDS 2 // Количество источиков напряжения #define MATRIX_DIM STATE_VARS+PHI+EDS // Размерность якобиана const double TK = 1e-3; // время расчета const double T_Start = 1e-10; // начальный шаг const double SMN = 1e-15; // минимальный шаг const double ACR = 1e-2; // точность // Параметры модели double TAU = 5e-9; double MFt = 0.026; double C1 = 0.1; double Cb = 2e-12; double L = 0.001; double R1 = 1000; double R2 = 10000; double Ru = 1e+6; double Rb = 20; double I = 1; double It = 1e-12; double IL_prev = 0; double UC1_prev = 0; double UCb_prev = 0; double E2 = 5.; // Синусоидальный источника тока double E1(double t) { const double amplitude = 10.0; const double period = 1e-4; const double frequency = 2 * M_PI / period; const double phase = 0.0; return amplitude * sin(frequency * t + phase); } // Якобиан MatrixXd Y = MatrixXd::Zero(MATRIX_DIM, MATRIX_DIM); // Вектор невязок VectorXd x = VectorXd::Zero(MATRIX_DIM); void Jacobian(double dt) { Y(0, 0) = 1, Y(0, 3) = -1. / dt; Y(1, 1) = 1, Y(1, 4) = -1. / dt; Y(2, 2) = 1, Y(2, 5) = -1. / dt; Y(3, 3) = 1., Y(3, 0) = -1.; Y(4, 4) = 1., Y(4, 8) = -1., Y(4, 9) = 1.; Y(5, 2) = L, Y(5, 7) = -1., Y(5, 10) = 1.; Y(6, 6) = 1. / R1, Y(6, 7) - 1. / R1, Y(6, 11) = -1.; Y(7, 5) = 1., Y(7, 6) = -1. / R1, Y(7, 7) = 1. / R1 + 1. / Rb, Y(7, 8) = -1. / Rb; Y(8, 1) = Cb, Y(8, 7) = -1. / Rb, Y(8, 8) = 1. / Rb + 1. / Ru, Y(8, 9) = -1. / Ru; Y(9, 1) = -Cb, Y(9, 8) = -1. / Ru, Y(9, 9) = 1. / Ru, Y(9, 11) = 1.; Y(10, 0) = C1, Y(10, 5) = -1., Y(10, 10) = 1. / R2; Y(11, 6) = -1.; Y(12, 9) = -1.; } int main() { Jacobian(0.1); std::cout << Y; }