У меня проблема с умножением матриц , в функции gaussdet, примерно на 147 строчке кода у меня вызывается функция multimass которая умножает две матрицы и выдает результат произведения , в моем случае первая матрица 4 на 4, вторая 4 на 1 , при выводе их на экран проблем нет , а при выводе результирующей (в программе матрица X) со второго элемента выходит за пределы памяти , не могу разобраться почему
P.S когда будете запускать , может выходить сообщение : Problem on diagonal , это просто проверка на нулевой элемент на диагонали , если он есть то программа заканчивается (ВЫВОД ФУНКЦИИ НАПИСАЛ В КОНЦЕ ПРОГРАММЫ(ЕСЛИ ЧТО) , НО ПРОБЛЕМА ЕЩЕ НЕ РЕШЕНА)
Gaussdet(A, T, size) — ТАК ВЫГЛЯДИТ;
КАК ВЫГЛЯДИТ ОШИБКА :
T=
1.00 0.12 -0.24 0.06
-10.00 1.00 10.29 -3.83
-0.60 -0.24 1.00 -0.13
-0.38 -2.35 3.30 1.00
B=
-1.18
-133.32
5.12
47.83
X= -4.72
58272643341906563227001172011003450238171962660182166064623285546474534185353454120209369334948557897585914528605758787177320684741845861550522368.00
0.00
-0.00
#include <iostream>
#include <math.h>
#include <ctime>
#include <iomanip>
using namespace std;
#define clean system("cls");
#define next cout<<endl;
int ShowMtx(double** A, int size)//вывод с выравниванием
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size + 1; j++)
{
cout << fixed << setprecision(2) << setw(6) << A[i][j] << " ";
}
next
}
return 0;
}
int ShowMtx1(double** A, int size,int size1)//вывод с выравниванием
{
if (size1 != size)
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size1; j++)
{
cout << fixed << setprecision(2) << setw(6) << A[i][j] << " ";
}
next
}
next
}
else
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
cout << fixed << setprecision(2) << setw(6) << A[i][j] << " ";
}
next
}
next
}
return 0;
}
int MultiMass(double** T, double** B, double** X, int size)//умножение
{
cout << "T=" << endl; ShowMtx1(T, size,size); next
cout << "B=" << endl; ShowMtx1(B,size,1); next
for (int i = 0; i < size; i++) {
for (int j = 0; j < 1; j++)
{
X[i][j] = 0;
for (int k = 0; k < size; k++)
{
X[i][j] += T[i][j] * B[j][i];
}
}
}
cout << "X="; ShowMtx1(X,size,1);
return 0;
}
int Gaussdet(double** A, double**T, int size)
{
double eps;
cout << "Enter the epsilon" << endl;
cin >> eps;// минимальный модуль элемента матрицы //
while ((eps >= 1) || (eps <= 0)) { cout << "Error , enter the epsilon(<1,>0)" << endl; cin >> eps; }
bool isNull = false;
for (int i = 0; i < size - 1; i++)
{
if (A[i][i] == 0)
{
isNull = true;
break;
}
}
if (isNull)
{
cout << "Problem on diagonal" << endl;//если находим нуль на главной диагонали, то выводим сообщение об ошибке
return 0;
}
//проверка на нулевую строку
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
int schet = 0, schet1 = 0;
if (A[i][j] < eps) schet += 1;
if ((schet == size - 1) || (schet1 == size - 1))
{
cout << "Nulevaya stroka,det=0" << endl;
}
}
}
for (int d = 0; d < size - 1; d++)//прямой ход
{
for (int i = d + 1; i < size; i++)
{
double tmp = double(A[i][d] / A[d][d]);
for (int j = 0; j < size + 1; j++)
{
A[i][j] = A[i][j] - A[d][j] * tmp;
T[i][j] = T[i][j] - T[d][j] * tmp;
}
}
}
next
int columns = size + 1;
for (int k = 1; k < size; k++)
{
int indexDop = size - k;
for (int i = size - k - 1; i >= 0; i--)
{
double tmp = A[i][indexDop] / A[indexDop][indexDop];
for (int j = indexDop; j < columns; j++)
{
A[i][j] = A[i][j] - A[indexDop][j] * tmp;
T[i][j] = T[i][j] - T[indexDop][j] * tmp;
}
}
}
ShowMtx(A, size); next
cout << "A^(-1)=" << endl; ShowMtx1(T,size,size);
int det = 1;//вычисление определителя
for (int i = 0; i < size; i++) det *= A[i][i];
cout << "det(A)=" << det << endl;
// X-матрица решений
double** B = new double* [size];
for (int i = 0; i < size; i++)
B[i] = new double[1];
for (int j = 0; j < size; j++) {
B[j][0] = A[j][size]; cout <<"B="<< B[j][0] << "n";
}
double** X = new double* [size];
for (int i = 0; i < size; i++)
X[i] = new double[1];
cout << "X=T^(-1)*B" << endl;
MultiMass(T, B, X, size);
return 0;
}
int Summmtx(double** A, double** B, double** C, int size)//вычисление суммы матриц
{
cout << "A="; ShowMtx(A, size);
cout << "B="; ShowMtx(B, size);
for (int i = 0; i < size; i++) {// результат суммирования матриц в новую матрицу
for (int j = 0; j < size; j++)
{
C[i][j] = A[i][j] + B[i][j];
}
next
}
cout << "C="; ShowMtx(C, size);
return 0;
}
void deleteMtx(double** A, int size)
{
for (int i = 0; i < size + 1; i++)
{
delete[] A[i];
}
delete[] A;
}
void deleteMtx1(double** B, int size)
{
for (int i = 0; i < size; i++)
{
delete[] B[i];
}
delete[] B;
}
int main()
{
int rows, size, choice;
cout << "ttttttInput matrix A" << endl;//ввод матрицы A
cout << "Enter the size of matrix A (>0,<=15)" << endl;
cin >> size;
while ((size < 0) || (size > 15)) { cout << "Enter the size of matrix A again" << endl; cin >> size; }
//выход за пределы диапазона//
double** A = new double* [size];//матрица A
for (int i = 0; i < size; i++)
{
A[i] = new double[size + 1];
}
label:
cout << "1-Randomly(matrix A)n2-Manually(matrix A) " << endl;//автоматически или вручную//
cin >> choice;
switch (choice)
{
case 1:
{
srand(time(0));
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size + 1; j++)
{
A[i][j] = rand() % 20;
}
}
break;
}
case 2:
{
for (int i = 0; i < size; i++) {
for (int j = 0; j < size + 1; j++)
{
cout << "A[" << i << "," << j << "]= ";
cin >> A[i][j];
}
next
}
break;
}
default:
{
goto label;
}
}
ShowMtx(A,size);
double** C = new double* [size];// C - копия матрицы А
for (int i = 0; i < size; i++)
{
C[i] = new double[size + 1]; C[i] = A[i];
}
double** T = new double* [size];// T-для обратной матрицы
for (int i = 0; i < size; i++)
{
T[i] = new double[size + 1];
}
for (int i = 0; i < size; i++)//заполнение смежной матрицы T
{
for (int j = 0; j < size; j++)
{
if (i == j) { T[i][j] = 1; }
else { T[i][j] = 0; }
}
}
Gaussdet(A, T, size);
}
Помогите пожалуйста с задачками, необходимо решить через внешний файл, и желательно полное решение. Заранее спасибо!
Задание 6
Дан массив X1, … , X12.
Сформировать массив, где Yi=(Xi*i)(sqrt(abs(Xi))) . Определить S — сумму Yi, меньших Х2.
Задание 7
Даны массивы
PR1, … , PR9 — наименования заводов;
L1, … , L9 — лимит электроэнергии, кВт. ч;
R1, … , R9 — израсходованная электроэнергия, кВт. ч.
Вывести список заводов, у которых экономия электроэнергии составила более 5%. Найти завод с наибольшим процен¬том экономии электроэнергии.
Задание 8
Дана матрица. Если на главной диагонали находится хотя бы один нулевой элемент, то заменить все чётные строки глав¬ной диагональю, в противном случав такой же замене подлежат все нечётные столбцы.
На приведении расширенной матрицы системы к ступенчатым матрицам специального вида основан метод решения систем линейных уравнений, называемый методом Гаусса или методом последовательного исключения неизвестных.
На первом этапе (прямой ход метода Гаусса) расширенная матрица Приводится к ступенчатой матрице , у которой все ненулевые строки имеют первый элемент, равный единице. Решение полученной системы уравнений с расширенной ступенчатой матрицей называется обратным ходом метода Гаусса. Обратный ход может быть выполнен как в форме последовательного определения неизвестных, начиная с последнего, так и в форме последующего преобразования матрицы к ступенчатой матрице , у которой все ненулевые строки содержат только одну единицу и позволяют в явном виде представить решение системы.
Отметим, что, выполняя прямой ход метода Гаусса, мы получаем возможность эффективного вычисления ранга матрицы и определителя. Если нас интересует ранг матрицы, то после преобразования ее к ступенчатой форме, достаточно подсчитать число ненулевых строк: это и будет ранг матрицы.
Если нас интересует определитель матрицы, то эта матрица, естественно, должна быть квадратной. После преобразования ее методом Гаусса к ступенчатой форме она примет вид верхней треугольной матрицы, то есть матрицы, у которой все элементы ниже главной диагонали равны нулю. Определитель любой верхней треугольной матрицы равен произведению всех элементов, стоящих на главной диагонали. Если на главной диагонали имеется хотя бы один нулевой элемент, то определитель треугольной матрицы равен нулю и, соответственно, определитель исходной матрицы равен нулю. Если же на главной диагонали в результате преобразований прямого хода метода Гаусса окажутся только единицы, то надо в процессе преобразований следить за перестановками строк, которые изменяют знак определителя на обратный, и за умножениями или делениями строк матрицы на числа, которые пропорционально изменяют величину определителя. Определитель исходной матрицы находится как произведение всех чисел, на которые делились строки. Знак этого произведения остается прежним, если было проведено четное число перестановок строк, и изменяется на противоположный, если число перестановок строк было нечетным.
Пример. Решим методом Гаусса следующую систему:
Выполняя прямой ход метода Гаусса, приведем расширенную матрицу этой системы к ступенчатой матрице, у которой все ненулевые строки имеют первый ненулевой элемент, равный единице. На первом этапе выполним следующие элементарные преобразования исходной расширенной матрицы: разделим первую строку на число два; сложим вторую строку с первой и результат запишем во вторую строку; из третьей строки вычтем преобразованную первую строку и результат запишем в третью строку:
.
Мы получили в результате, что первая строка ненулевая, имеет первым ненулевым элементом число один, а все элементы в первой колонке под числом один равны нулю. Для того чтобы, вторая строка начиналась с единицы, переставим вторую и третью строки местами:
.
Для того чтобы под единицей во втором столбце стоял нуль, из третьей строки полученной матрицы вычтем вторую строку, умноженную на три, и запишем в третью строку:
.
Наконец, чтобы третья строка имела первым ненулевым элементом число один, поделим третью строку на число пять:
=.
На этом завершается прямой ход метода Гаусса, а преобразованная система уравнений, соответствующая полученной ступенчатой расширенной матрице, равносильна исходной системе уравнений и имеет следующий вид:
Отметим, что, выполняя прямой ход метода Гаусса, мы получаем возможность эффективного вычисления ранга матрицы и определителя. Если нас интересует ранг матрицы, то после преобразования ее к ступенчатой форме, достаточно подсчитать число ненулевых строк: это и будет ранг матрицы.
Если нас интересует определитель матрицы, то эта матрица, естественно, должна быть квадратной. После преобразования ее методом Гаусса к ступенчатой форме она примет вид верхней треугольной матрицы, то есть матрицы, у которой все элементы ниже главной диагонали равны нулю. Определитель любой верхней треугольной матрицы равен произведению всех элементов, стоящих на главной диагонали. Если на главной диагонали имеется хотя бы один нулевой элемент, то определитель треугольной матрицы равен нулю и, соответственно, определитель исходной матрицы равен нулю. Если же на главной диагонали в результате преобразований прямого хода метода Гаусса окажутся только единицы, то надо в процессе преобразований следить за перестановками строк, которые изменяют знак определителя на обратный, и за умножениями или делениями строк матрицы на числа, которые пропорционально изменяют величину определителя. Определитель исходной матрицы находится как произведение всех чисел, на которые делились строки. Знак этого произведения остается прежним, если было проведено четное число перестановок строк, и изменяется на противоположный, если число перестановок строк было нечетным.
В нашем примере, выполнив прямой ход метода Гаусса, мы одновременно нашли ранг матрицы коэффициентов системы (, так как число ненулевых строк преобразованной матрицы равно трем), а также ранг расширенной матрицы (, так как число ненулевых строк преобразованной матрицы равно трем).
Для вычисления определителя исходной матрицы коэффициентов необходимо обратить внимание на три обстоятельства: вид верхней треугольной матрицы, в которую преобразовалась исходная матрица; на какие числа делились или умножались строки; какое количество (четное или нечетное) перестановок было выполнено в процессе преобразований. Так как на главной диагонали стоят только единицы, то определитель не равен нулю. Далее в процессе преобразований было использовано деление на число 2 первой строки и деление на число 5 третьей строки. Их надо перемножить и подсчитать число перестановок строк местами: была выполнена одна перестановка. Таким образом, определитель матрицы коэффициентов равен: .
Выполним обратный ход метода Гаусса сначала первым способом, то есть последовательно определим неизвестные, начиная с последнего уравнения:
Выполним обратный ход метода Гаусса вторым способом. Продолжим элементарные преобразования матрицы и приведем ее к ступенчатой матрице , у которой все ненулевые строки содержат только одну единицу. Это позволит в явном виде представить решение системы. Сложим вторую строку с третьей строкой и результат запишем во вторую строку:
= .
Далее, чтобы заменить число два первой строки на число нуль, умножим третью строку на число (-2), сложим с первой строкой и результат запишем в первую строку:
.
На этом заканчивается обратный ход метода Гаусса. Преобразованная система уравнений, соответствующая полученной ступенчатой расширенной матрице типа, равносильна исходной системе уравнений и имеет следующий вид
Который представляет собой запись решения системы в явной форме.
Для исследования решения систем линейных уравнений с произвольным числом уравнений и неизвестных полезна следующая теорема.
< Предыдущая | Следующая > |
---|
Сначала докажем, что матрица $%A$% должна быть диагональной, то есть $%a_{km}=0$% при $%kne m$%. Выберем в качестве $%X$% матрицу $%e_{mk}$% (одна единица на пересечении $%m$%-й строки и $%k$%-го столбца; остальные нули). Ясно, что след такой матрицы равен нулю, поскольку все числа на главной диагонали нулевые.
Перемножим две матрицы: $%AX=sumlimits_{i,j}a_{ij}e_{ij}cdot e_{mk}=sumlimits_{i}a_{im}e_{ik}$%. Нас интересует сумма диагональных элементов этой матрицы, то есть коэффициентов при матрицах вида $%e_{ii}$%. Здесь такой коэффициент всего один, и он равен $%a_{km}$%. Следовательно, $%a_{km}={rm tr}(AX)=0$%.
Осталось доказать, что все элементы на диагонали матрицы $%A$% равны между собой. Для этого достаточно установить, что $%a_{ii}=a_{11}$% при всех $%i > 1$%. Выбираем матрицу $%X=e_{11}-e_{ii}$%. След у неё нулевой, так как это диагональная матрица с единицей на первом месте и числом $%-1$% на $%i$%-м месте; все остальные элементы нулевые.
Диагональные матрицы перемножаются поэлементно, поэтому на первом и на $%i$%-м местах главной диагонали у матрицы $%AX$% будут стоять числа $%a_{11}$% и $%-a_{ii}$%. Сумма этих чисел по условию равна нулю, откуда всё следует.
Перед тем как перейти к знакомству с единичной и нулевой матрицей, вспомним, что такое матрица, а также ее основные типы. Особое внимание при повторении следует уделить квадратной матрице и ее подтипам — диагональной, симметричной и кососимметричной матрицам.
Итак, среди квадратных матриц можно выделить класс диагональных матриц, у которых все элементы кроме элементов главной диагонали равны нулю. Рассмотрим два вида матриц с совпадающими элементами на главной диагонали. К таким матрицам относят нулевую и единичную. Рассмотрим каждую более подробно.
Нулевая матрица
Матрица, у которой все элементы равны нулю.
Ее принято обозначать как ZZ или OO или OmnO_{mn}.
Общий вид нулевой матрицы:
O=(00…000…0…………00…0)O=begin{pmatrix}0&0&…&0\0&0&…&0\…&…&…&…\0&0&…&0end{pmatrix}
Как различать: все элементы матрицы — нули.
Пример 1
O1=(0000)O_{1}=begin{pmatrix}0&0\0&0end{pmatrix} — квадратная нулевая матрица 2-го порядка поскольку имеет размер 2×22times 2.
Нулевая матрица существует для любого размера m×nmtimes n.
Пример 2
O2=(00000000000000000000)O_{2}=begin{pmatrix}0&0&0&0\0&0&0&0\0&0&0&0\0&0&0&0\0&0&0&0end{pmatrix} — нулевая матрица размера 5×45times 4.
Свойства нулевой матрицы
Нулевая матрица играет такую же роль при выполнении действий над матрицами, как число нуль при соответствующих арифметических операциях.
- При умножении нулевой матрицы на число, получаем ту же нулевую матрицу: k⋅O=O⋅k=Okcdot O=Ocdot k=O.
Важно понимать, что на какое бы число мы ни умножили нулевую матрицу любого размера, всегда получим ту же нулевую матрицу.
Пример 1
152⋅(0000)=(0000)152cdot begin{pmatrix}0&0\0&0end{pmatrix}=begin{pmatrix}0&0\0&0end{pmatrix}
Пример 2
73⋅(000000000)=(000000000)73cdot begin{pmatrix}0&0&0\0&0&0\0&0&0end{pmatrix}=begin{pmatrix}0&0&0\0&0&0\0&0&0end{pmatrix}
- Сумма произвольной матрицы и нулевой матрицы того же размера есть произвольная матрица: A+O=O+A=AA+O=O+A=A.
Складывая произвольную ненулевую матрицу с нулевой матрицей того же размера, получаем исходную ненулевую матрицу.
Пример 1
(39672548)+(0000)=(39672548)begin{pmatrix}39&67\25&48end{pmatrix}+begin{pmatrix}0&0\0&0end{pmatrix}=begin{pmatrix}39&67\25&48end{pmatrix}
Пример 2
(9678354927781014567)+(000000000)=(9678354927781014567)begin{pmatrix}96&78&35\49&27&78\101&45&67end{pmatrix}+begin{pmatrix}0&0&0\0&0&0\0&0&0end{pmatrix}=begin{pmatrix}96&78&35\49&27&78\101&45&67end{pmatrix}
С правилами сложения произвольных матриц вы можете ознакомиться в теме «Как складывать матрицы».
- Разность произвольной матрицы и нулевой матрицы того же размера есть произвольная матрица.
Вычитая из матрицы любого порядка нулевую матрицу такого же порядка, получим исходную ненулевую матрицу.
Пример 1
(48362954)−(0000)=(48362954)begin{pmatrix}48&36\29&54end{pmatrix}-begin{pmatrix}0&0\0&0end{pmatrix}=begin{pmatrix}48&36\29&54end{pmatrix}
Если же мы вычтем из нулевой матрицы произвольную матрицу такого же порядка, получим исходную ненулевую матрицу со знаком «минус» (с противоположным знаком): O−A=−AO-A=-A.
Пример 2
(0000)−(57342019)=−(57342019)begin{pmatrix}0&0\0&0end{pmatrix}-begin{pmatrix}57&34\20&19end{pmatrix}=-begin{pmatrix}57&34\20&19end{pmatrix}
С правилами вычитания матриц вы можете ознакомиться здесь.
- Произведение произвольной матрицы размера k×lktimes l и нулевой матрицы размера l×mltimes m есть нулевая матрица размера k×mktimes m.
Правила, существующие при умножении произвольных матриц, выполняются и в данном случае. Ознакомиться с ними вы можете тут.
Пример 1
(54762453)⋅(0000)=(0000)begin{pmatrix}54&76\24&53end{pmatrix}cdot begin{pmatrix}0&0\0&0end{pmatrix}=begin{pmatrix}0&0\0&0end{pmatrix}
Пример 2
(91195736)⋅(000000)=(000000)begin{pmatrix}91&19\57&36end{pmatrix}cdot begin{pmatrix}0&0&0\0&0&0end{pmatrix}=begin{pmatrix}0&0&0\0&0&0end{pmatrix}
Возможен случай, когда произведение двух ненулевых матриц дает нулевую матрицу:
(025010)⋅(607300)=(0000)begin{pmatrix}0&25\0&10end{pmatrix}cdot begin{pmatrix}60&73\0&0end{pmatrix}=begin{pmatrix}0&0\0&0end{pmatrix}
Также нулевая матрица является симметричной и кососимметричной.
Единичная матрица
Матрица, каждый элемент главной диагонали которой равен единице, а все остальные — нулю.
Общий вид единичной матрицы:
E=(10…001…0…………00…1)E=begin{pmatrix}1&0&…&0\0&1&…&0\…&…&…&…\0&0&…&1end{pmatrix}
Пример 1
E1=(1001)E_{1}=begin{pmatrix}1&0\0&1end{pmatrix}
Пример 2
E2=(100010001)E_{2}=begin{pmatrix}1&0&0\0&1&0\0&0&1end{pmatrix}
Свойство единичной матрицы
Произведение произвольной матрицы и единичной матрицы соответствующего размера (её порядок равен числу столбцов исходной ненулевой матрицы) есть исходная матрица: AE=EA=AAE=EA=A.
Пример 1
(253741173619)⋅(100010001)=(253741173619)begin{pmatrix}25&37&41\17&36&19end{pmatrix}cdot begin{pmatrix}1&0&0\0&1&0\0&0&1end{pmatrix}=begin{pmatrix}25&37&41\17&36&19end{pmatrix}
Пример 2
(2579)⋅(1001)=(2579)begin{pmatrix}25&79end{pmatrix}cdot begin{pmatrix}1&0\0&1end{pmatrix}=begin{pmatrix}25&79end{pmatrix}
С действиями над произвольными матрицами мы познакомимся на следующих уроках.
Помощь с решением задач по математике от специалистов на Студворк!