Компьютеры
и программирование

Программная реализация метода Крамера

Программу на C++, решающую системы линейных уравнений методом Крамера, удобно реализовать с функциями для вычисления определителя системы и определителя при неизвестных.

Рассмотрим вариант программы, решающей методом Крамера системы из трёх линейных уравнений с тремя неизвестными. В ней требуется объявить четыре функции: одна (determinant) вычисляет определитель системы, а три (determinantX1, determinant X2, determinantX3) вычисляют определители при неизвестных.

Как и положено при объявлении функций, укажем в них формальные параметры - массивы, хранящие значения определителя системы и определителей при неизвестных. Те же формальные параметры указываются и при описании функций (в конце программы, после функции main). Тело каждой функции содержит и запись математических операций вычисления определителей.

А в вызове функций указываются уже фактические параметры - массивы, храняющие перечисленные данные, но уже состоящие из значений, введённых пользователем.

Далее всё предельно просто: в функции main вычисляются и выводятся значения неизвестных как результаты деления определителей при неизвестных на определитель системы, как и должно быть при решении систем линейных уравнений методом Крамера.

Код C++

#include <iostream> using namespace std; int determinant(int matrix[3][3]); int determinantX1(int coefMatrix[3][3], int constTermsMatrix[3]); int determinantX2(int coefMatrix[3][3], int constTermsMatrix[3]); int determinantX3(int coefMatrix[3][3], int constTermsMatrix[3]); int main() { int i, j; int coefficientsMatrix3x3[3][3]; int constantTermsMatrix3x1[3]; cout << "Vvedite koefficienty i sbobodnye chleny " << endl; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { cout << "a[ " << i << "," << j << "]= "; cin >> coefficientsMatrix3x3[i][j]; } cout << "b,[ " << i << "]= "; cin >> constantTermsMatrix3x1[i]; } int det = determinant(coefficientsMatrix3x3); int detX1 = determinantX1(coefficientsMatrix3x3, constantTermsMatrix3x1); int detX2 = determinantX2(coefficientsMatrix3x3, constantTermsMatrix3x1); int detX3 = determinantX3(coefficientsMatrix3x3, constantTermsMatrix3x1); if (det != 0) { cout << "X1 = " << (float)detX1/(float)det << endl; cout << "X2 = " << (float)detX2/(float)det << endl; cout << "X3 = " << (float)detX3/(float)det << endl; } else cout << "Sistema ne imejet reshenij " << endl << endl; return 0; } int determinant(int matrix[3][3]) { int a11 = matrix[0][0]; int a12 = matrix[0][1]; int a13 = matrix[0][2]; int a21 = matrix[1][0]; int a22 = matrix[1][1]; int a23 = matrix[1][2]; int a31 = matrix[2][0]; int a32 = matrix[2][1]; int a33 = matrix[2][2]; return (a11 * a22 * a33) + (a12 * a23 * a31) + (a13 * a21 * a32) - (a13 * a22 * a31) - (a11 * a23 * a32) - (a12 * a21 * a33); } int determinantX1(int coefMatrix[3][3], int constTermsMatrix[3]) { int a12 = coefMatrix[0][1]; int a13 = coefMatrix[0][2]; int a22 = coefMatrix[1][1]; int a23 = coefMatrix[1][2]; int a32 = coefMatrix[2][1]; int a33 = coefMatrix[2][2]; int c1 = constTermsMatrix[0]; int c2 = constTermsMatrix[1]; int c3 = constTermsMatrix[2]; return (c1 * a22 * a33) + (a12 * a23 * c3) + (a13 * c2 * a32) - (a13 * a22 * c3) - (c1 * a23 * a32) - (a12 * c2 * a33); } int determinantX2(int coefMatrix[3][3], int constTermsMatrix[3]) { int a11 = coefMatrix[0][0]; int a13 = coefMatrix[0][2]; int a21 = coefMatrix[1][0]; int a23 = coefMatrix[1][2]; int a31 = coefMatrix[2][0]; int a33 = coefMatrix[2][2]; int c1 = constTermsMatrix[0]; int c2 = constTermsMatrix[1]; int c3 = constTermsMatrix[2]; return (a11 * c2 * a33) + (c1 * a23 * a31) + (a13 * a21 * c3) - (a13 * c2 * a31) - (a11 * a23 * c3) - (c1 * a21 * a33); } int determinantX3(int coefMatrix[3][3], int constTermsMatrix[3]) { int a11 = coefMatrix[0][0]; int a12 = coefMatrix[0][1]; int a21 = coefMatrix[1][0]; int a22 = coefMatrix[1][1]; int a31 = coefMatrix[2][0]; int a32 = coefMatrix[2][1]; int c1 = constTermsMatrix[0]; int c2 = constTermsMatrix[1]; int c3 = constTermsMatrix[2]; return (a11 * a22 * c3) + (a12 * c2 * a31) + (c1 * a21 * a32) - (c1 * a22 * a31) - (a11 * c2 * a32) - (a12 * a21 * c3); }

По тому же алгоритму несложно уже написать программу, вычисляющую мотодом Крамера системы их двух линейных уравнений с двумя неизвестными, а также вариант программы с ветвлением на случаи систем 2х2 и 3х3.