Содержание
Программу на C++, решающую системы линейных уравнений методом Крамера, удобно реализовать с функциями для вычисления определителя системы и определителя при неизвестных.
Рассмотрим вариант программы, решающей методом Крамера системы из трёх линейных уравнений с тремя неизвестными. В ней требуется объявить четыре функции: одна (determinant) вычисляет определитель системы, а три (determinantX1, determinant X2, determinantX3) вычисляют определители при неизвестных.
Как и положено при объявлении функций, укажем в них формальные параметры – массивы, хранящие значения определителя системы и определителей при неизвестных. Те же формальные параметры указываются и при описании функций (в конце программы, после функции main). Тело каждой функции содержит и запись математических операций вычисления определителей.
А в вызове функций указываются уже фактические параметры – массивы, храняющие перечисленные данные, но уже состоящие из значений, введённых пользователем.
Далее всё предельно просто: в функции main вычисляются и выводятся значения неизвестных как результаты деления определителей при неизвестных на определитель системы, как и должно быть при решении систем линейных уравнений методом Крамера.
Код C++
#includeusing 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 << <span>”Vvedite koefficienty i sbobodnye chleny “<< endl; <span>for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { cout << <span>”a[ “<< i << <span>”,”<< j << <span>”]= “; 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 << <span>”X1 = “<< (<span>float)detX1/(float)det << endl; cout << <span>”X2 = “<< (<span>float)detX2/(float)det << endl; cout << <span>”X3 = “<< (<span>float)detX3/(float)det << endl; } <span>else cout << <span>”Sistema ne imejet reshenij “<< endl << endl; <span>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.
Весь блок Программирование C++
Пример 1. Система 2 уравнений¶
Рассмотрим простую систему из 2 линейных уравнений с 2 неизвестными:
begin{matrix} 2x+5y=1 &(1) \ x-10y=3 &(2) end{matrix}
Аналитическое решение¶
Система легко решается аналитически. Для этого достаточно выразить из уравнения (2) переменную x:
begin{matrix} x=3 + 10y &(3) end{matrix}
После чего подставить её в уравнение (1): begin{matrix} 2cdot(3 + 10y)+5y=1, end{matrix} и решить получившееся линейное уравнение относительно переменной y: begin{matrix} 25y+6=1 end{matrix}
begin{matrix} 25y=-5 \ end{matrix}begin{matrix} y=-0.2 end{matrix}
Полученное значение y можно подставить в выражение для x в уравнение (3): begin{matrix} x=3 + 10cdot (-0.2) end{matrix} и получить значение переменной x: begin{matrix} x=1 end{matrix} Таким образом решением системы будет: (1; -0,2)
(1-е значение в ответе – x, 2-е – y)
Решение матричным методом (python numpy)¶
Запишем исходную систему уравнений в виде матрицы (левая часть) и вектора (правая часть): begin{matrix} 2x+5y=1 \ x-10y=3 end{matrix}
Для этого выпишем по порядку все коэффициенты перед неизвестными в матрицу.
Коэффициент перед переменной х 1й строки на место в матрице с координатами 0,0. (2)
Коэффициент перед переменной y 1й строки на место в матрице с координатами 0,1. (5)
Коэффициент перед переменной х 2й строки на место в матрице с координатами 1,0. (1)
Коэффициент перед переменной y 2й строки на место в матрице с координатами 1,1. (-10)
begin{pmatrix} 2& 5 \ 1 & -10 end{pmatrix}
Значение свободного члена (число, не умноженное ни на одну переменную системы) после знака равенства 1й строки на место 0 в векторе.
Значение свободного члена 2й строки на место 1 в векторе.
begin{pmatrix} 1 \ 3 end{pmatrix}
Для этого воспользуемся numpy массивами:
In [1]:
importnumpy# импортируем библиотеку M1=numpy.array([[2.,5.],[1.,-10.]])# Матрица (левая часть системы)v1=numpy.array([1.,3.])# Вектор (правая часть системы)#Запишем все числа с точкой, т.к. иначе в Python 2 они будут участвовать в целочисленных операциях (остатки от деления будут отбрасываться)
Для решения системы воспользуемся функцией numpy.linalg.solve модуля numpy (документация – http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.solve.html). Функция принимает на вход 2 параметра:
1й – матрица коэффициентов перед переменными
2й – вектор свободных членов
In [2]:
numpy.linalg.solve(M1,v1)
Out[2]:
array([ 1. , -0.2])
Обратим внимание, что ответом так же является numpy массив!
при этом порядок следования ответов в массиве соответствует порядку столбцов исходной матрицы. Т.е. на 0 месте находится x=1, т.к. мы в матрице внесли в 0 столбец коэффициенты перед переменной х!
Ответ: (1; -0,2)
Пример 2. Система 4 уравнений¶
Рассмотрим простую систему из 2 линейных уравнений с 2 неизвестными: begin{matrix} A + C = 2 &(4) \ -A + B – 2C + D = -2 &(5) \ 4A + C – 2D = 0 &(6) \ -4A + 4B + D = 5 &(7) end{matrix}
Для наглядности решения данной системы матричным методом запишем её в таком виде, чтобы каждое уравнение содержало все 4 переменных, и чтобы они занимали в каждой строке одно и то же порядковое место (А – 0, B – 1, C – 2, D – 3):
begin{matrix} A + 0B + C + 0D = 2 &(8) \ -A + B – 2C + D = -2 &(9) \ 4A + 0B + C – 2D = 0 &(10) \ -4A + 4B + 0C + D = 5 &(11) end{matrix}
теперь аналогично примеру 1 выпишем матрицу (коэффициенты перед переменными из левой части системы построчно в порядке следования переменных) и вектор (свободные члены из правой части системы):
begin{pmatrix} 1 & 0 & 1 & 0 \ -1 & 1 & -2 & 1 \ 4 & 0 & 1 & -2 \ -4 & 4 & 0 & 1 end{pmatrix}begin{pmatrix} 2 \ -2 \ 0 \ 5 end{pmatrix} In [3]:
importnumpy# импортируем библиотеку M2=numpy.array([[1.,0.,1.,0.],[-1.,1.,-2.,1.],[4.,0.,1.,-2.],[-4.,4.,0.,1.]])# Матрица (левая часть системы)v2=numpy.array([2.,-2.,0.,5.])# Вектор (правая часть системы)numpy.linalg.solve(M2,v2)
Out[3]:
array([ 0., 1., 2., 1.])
Ответ: (0; 1; 2; 1)
A = 0, B = 1, C =2, D = 1
Пример 3. Система 3 уравнений (с приведением к линейному виду)¶
Матричный метод применим только для решения линейных уравнений. Однако иногда можно встретить нелинейные уравнения, легко приводимые к линейной форме, например:
begin{matrix} 2x_{1}+x_{2}^2+x_{3} = 2 &(12) \ x_{1}-x_{2}^2 = -2 &(13) \ 3x_{1}-x_{2}^2+2x_{3} = 2 &(14) end{matrix}
Можно заметить, что переменная x2 входит во все 3 уравнения только в квадратичной форме. Это означает, что мы можем осуществить замену:
begin{matrix} x_{2}^2 = a &(15) end{matrix}
С учётом этой подстановки запишем систему, аналогично примеру 2 с вхождением всех 3 переменных:
begin{matrix} 2x_{1}+a+x_{3} = 2 &(16) \ x_{1}-a+0x_{3} = -2 &(17) \ 3x_{1}-a+2x_{3} = 2 &(18) end{matrix}
Для новой системы мы уже умеем записывать матрицу (коэффициенты перед переменными из левой части системы) и вектор (свободные члены из правой части):
begin{pmatrix} 2 & 1 & 1 \ 1 & -1 & 0 \ 3 & -1 & 2 end{pmatrix}begin{pmatrix} 2 \ -2 \ 2 end{pmatrix} In [4]:
importnumpy# импортируем библиотеку M3=numpy.array([[2.,1.,1.],[1.,-1.,0.],[3.,-1.,2.]])# Матрица (левая часть системы)v3=numpy.array([2.,-2.,2.])# Вектор (правая часть системы)numpy.linalg.solve(M3,v3)
Out[4]:
array([-1., 1., 3.])
Мы получили промежуточный результат:
$x_{1}= -1, a= 1, x_{3}= 3,$
или
$x_{1}= -1, x_{2}^2= 1, x_{3}= 3,$
$x_{2}^2=1$ соответствует 2 значениям $x_{2}$: 1 и -1.
Таким образом мы получаем 2 решения нашей системы: $x_{1}= -1, x_{2}= 1, x_{3}= 3,$ и $x_{1}= -1, x_{2}= -1, x_{3}= 3,$
Ответ: (-1; 1; 3) и (-1; -1; 3)
Пример 4. Решение простой задачи с помощью системы линейных уравнений.¶
Навстречу друг другу из одного города в другой, расстояние между которыми составляет 30 км, едут два велосипедиста. Предположим, что если велосипедист 1 выедет на 2 ч раньше своего товарища, то они встретятся через 2,5 часа после отъезда велосипедиста 2; если же велосипедист 2 выедет 2мя часами ранее велосипедиста 1, то встреча произойдет через 3 часа после отъезда первого. С какой скоростью движется каждый велосипедист?
Обозначим за неизвестные x и y скорости велосипедистов.
Путь = скорость * время
Расстояние между велосипедистами = путь 1 велосипедиста + путь 2 велосипедиста
На основании этих простых рассуждений и данных задачи можно записать уравнения:
begin{matrix} (2.5 + 2)x+2.5y=30 &(19) \ 3x + (3+2)y=30 &(20) end{matrix}
или
begin{matrix} 4.5x+2.5y=30 &(21) \ 3x + 5y=30 &(22) end{matrix}
Аналогично примеру 1 легко составим матрицу коэффициентов перед неизвестными (левая часть системы) и вектор со свободными членами (права часть системы):
begin{pmatrix} 4.5& 2.5 \ 3 & 5 end{pmatrix}begin{pmatrix} 30 \ 30 end{pmatrix} In [5]:
importnumpy# импортируем библиотеку M4=numpy.array([[4.5,2.5],[3.,5.]])# Матрица (левая часть системы)v4=numpy.array([30.,30.])# Вектор (правая часть системы)numpy.linalg.solve(M4,v4)
Out[5]:
array([ 5., 3.])
Ответ: 5км/ч и 3км/ч
Пример 5. Нахождение уравнения плоскости по точкам, через которые она проходит.¶
Уравнение плоскости в 3-х мерном пространстве задаётся уравнением: begin{matrix} z = ax + by + c & (23) end{matrix} Уравнение плоскости однозначно задаётся 3 точками через которые она проходит.
Таким образом легко понять, что если мы знаем координаты точек, через которые проходит плоскость, то в уравнении (23) у вас 3 переменных: a, b, c. А значения x, y, z нам известны для 3 точек.
Если плоскость проходит через точки (1;-6;1), (0;-3;2) и (-3;0;-1), то мы легко можем найти коэффициенты, подставив значения соответствующих координат для всех 3 точек в уравнение (23) и получив систему из 3 уравнений.
Для точки x = 1, y = -6, z = 1: begin{matrix} acdot 1 + bcdot (-6) + c = 1 &(24) end{matrix}
Для точки x = 0, y = -3, z = 2: begin{matrix} acdot 0 + bcdot (-3) + c = 2 &(25) end{matrix}
Для точки x = -3, y = 0, z = -1: begin{matrix} acdot (-3) + bcdot 0 + c = -1 &(26) end{matrix}
На основании системы уравнений (24), (25), (26) можно записать матрицу коэффициентов перед неизвестными (левая часть матрицы):
begin{pmatrix} 1& -6 & 1 \ 0 & -3 & 1 \ -3 & 0 & 1 end{pmatrix}
И вектор свободных членов (правая часть): begin{pmatrix} 1 2 -1 end{pmatrix}
In [6]:
importnumpy# импортируем библиотеку M5=numpy.array([[1.,-6.,1.],[0.,-3.,1],[-3,,1]])# Матрица (левая часть системы)v5=numpy.array([1.,2.,-1.])# Вектор (правая часть системы)numpy.linalg.solve(M5,v5)
Out[6]:
array([ 2., 1., 5.])
Ответ: уравнение искомой плоскости в пространстве задаётся уравнением $z = 2x + y + 5$
Пример 6. Нахождение уравнения параболы по 2 точкам и касательной¶
Найти уравнение параболы ($f(x) = ax^2 + bx + x & (27)$), проходящей через точки (1,1) и (-1,1) и касающейся биссектрисы 1й координатной четверти.
Как и в предыдущем примере неизвестными для нас являются коэффициенты a, b, c.
Подставив в уравнение параболы (27) значения аргумента (x) и функции (f(x)) получим 2 уравнения:
begin{matrix} acdot 1^2 + bcdot 1 + c = 1 &(28) \ acdot (-1)^2 + bcdot (-1) + c = 1 &(29) end{matrix}
Однако для нахождения 3 неизвестных 2 уравнений мало. Необходимо найти ещё одно из оставшихся условий.
Касание биссектрисы 1й координатной четверти означает, что наша парабола имеет касательную $y = x$. Если посмотреть на условие задачи, то мы увидим, что одна из точек (1, 1) лежит на этой прямой. Это означает, что мы знаем точку касания.
Уравнение прямой, делящей 1-ю координатную четверть пополам (биссектрисы) имеет вид $y = kx quad (30)$
При этом мы знаем, что угол уравнения касательной (коэффициент k уравнения (30)) равен производной от функции (27) в точке касания.
begin{matrix} f'(x) = 2ax + bx & (31) end{matrix}
Подставив значение аргумента (x = 1) в точке касания и коэффициента (k = 1 в качестве производной f'(x))
begin{matrix} 1 = 2acdot1 + bcdot1 & (32) end{matrix}
Используя уравнения (28), (29) и (32), запишем полную систему уравнений, которую нам необходимо решить:
begin{matrix} acdot 1 + bcdot 1 + c cdot 1 = 1 &(33) \ acdot 1 + bcdot (-1) + c cdot 1 = 1 &(34) \ acdot 2 + bcdot 1 + c cdot 0 = 1 &(35) end{matrix}
По привычной уже схеме запишем коэффициенты перед переменными (левую часть системы) в матрицу, а свободные члены (правую часть) в вектор:
begin{pmatrix} 1& 1 & 1 \ 1 & -1 & 1 \ 2 & 1 & 0 end{pmatrix}begin{pmatrix} 1 \ 1 \ 1 end{pmatrix} In [7]:
importnumpy# импортируем библиотеку M6=numpy.array([[1.,1.,1.],[1.,-1.,1],[2,1,]])# Матрица (левая часть системы)v6=numpy.array([1.,1.,1.])# Вектор (правая часть системы)numpy.linalg.solve(M6,v6)
Out[7]:
array([ 0.5, -0. , 0.5])
Ответ: уравнение искомой параболы задаётся функцией $f(x) = 0.5x^2 + 0.5$
Примечание к примеру 6¶
На иллюстрации ниже изображены графики параболы и биссектрисы, которой она касается. А так же 2 точки, через которых проходит парабола.
In [8]:
importnumpyimportmatplotlibasmplimportmatplotlib.pyplotasplt%matplotlibinlinempl.rc('font',family='Verdana',size=16)w=numpy.linalg.solve(M6,v6)# запишем найденные коэффициенты в переменнуюdeff(x):returnw[]*x**2+w[1]*x+w[2]# уравнение параболыfig,ax=plt.subplots(figsize=(10,5))x=numpy.linspace(-2,2,200)ax.axis([-2.,2.,0.,2.])ax.grid()ax.plot(x,f(x),label='Парабола')ax.plot(x,x,label='Биссектриса 1йnкоординатной четверти')ax.set_xlabel(u'x',{'fontname':'Arial','size':24})ax.set_ylabel(u'f(x)',{'fontname':'Arial','size':24})plt.plot([-1,1],[1,1],'ro',label='Точки дляnпостроения графика')ax.annotate('Точкаnкасания',xy=(1.,1.),xytext=(1.5,0.5),arrowprops=dict(facecolor='black',shrink=0.05),)ax.legend(bbox_to_anchor=(1.6,1.))plt.show()
Вопросы-ответы » Информатика Заказать домашнюю работуЗадать свой вопрос
- Полторецкая Ангелина
- Информатика
- 2019-09-23 11:59:19
- 1
1 ответ Сережа Дорошевский2019-09-23 12:03:04
uses crt;
var
x, y, A1, A2, B1, B2, C1, C2:real;
begin
clrscr;
writeln(‘enter A1:’);
writeln(‘enter A2:’);
writeln(‘enter B1:’);
writeln(‘enter B2:’);
writeln(‘enter C1:’);
writeln(‘enter C2:’);
read(A1,A2,B1,B2,C1,C2);
if (A2 * B1 – A1 * B2) = 0 then
writeln(‘Программка не имеет решений’)
else
begin
x:= (B1*C2-B2*C1) / (A2*B1-A1*B2);
y:= (A2 * C1 – A1 * C2) / (A2 * B1 – A1 * B2);
end;
writeln(‘x=’, x:10:2);
writeln(‘y=’, y:10:2);
end.
Veronika Hisamutdinova2019-09-23 12:05:25 Спасибо! Вы сможете подсказать – как вывести результаты программки? Mjasnjanko Svetlana2019-09-23 12:10:29 https://rextester.com/SVDBNH55154 Егор Чугрин2019-09-23 12:12:19 по этой ссылке пуск программки в онлайн компиляторе Имя:* E-Mail: Похожие вопросы
Решение систем уравнений
Язык
Решение систем линейных уравнений онлайн – это нахождение неизвестных переменных входящих в уравнения, при подстановке которых система обращается в равенство.
Решить систему линейных уравнений можно различными способами, например используя метод Крамера и метод Гаусса, метод Жордана Гаусса и метод Кронекера Капелли, или другими способами. Используя наш сервис, вы можете бесплатно в режиме онлайн получить решения разными способами с пошаговыми действиями и пояснениями. Наш калькулятор будет также полезен, если вам необходимо проверить выполненные самостоятельно вычисления.
,
Решение:
- Описание
- Как пользоваться
Наш онлайн сервис позволяет решать системы линейных алгебраических уравнений различными способами:
- методом Крамера (правило Крамера)
- методом обратной матрицы
- методом Гаусса-Монтанте (алгоритм Барейса)
- методом Гаусса (метод последовательного исключения переменных)
- методом Гаусса-Жордана (метод полного исключения неизвестных)
При этом сервис предоставляет последовательность решения, а не только ответ.
Дополнительно вы сможете проверить систему уравнений на совместимость.
- С помощью знаков «+» и «–» задайте необходимое количество переменных в уравнении. Если в ваше уравнение не входят какие-либо неизвестные, то просто оставьте поля пустыми (незаполненными).
- В ячейках укажите коэффициенты (значения) при неизвестных. Если в исходных данных указано значение x1, x2 и так далее, то в ячейке перед указанными неизвестными укажите значение «1».
- Значения при неизвестных могут быть:
- целые числа:
7
,-3
, - десятичные (конечные и периодические) дроби:
7/8
,6.13
,-1.3(56)
,1.2e-4
- арифметические выражения:
1/2+3*(6-4)
,(6-y)/x^3
,2^0.5
- целые числа:
- Далее нажмите на кнопку с названием нужной математической операции.
- Значения в результатах решения можно с помощью мышки перетаскивать на поле исходных данных.
Система линейных алгебраических уравнений (теория)
Варианты решений
Любое уравнение может считаться решенным только тогда, когда будут отысканы его корни. В программе Excel существует несколько вариантов поиска корней. Давайте рассмотрим каждый из них.
Способ 1: матричный метод
Самый распространенный способ решения системы линейных уравнений инструментами Excel – это применение матричного метода. Он заключается в построении матрицы из коэффициентов выражений, а затем в создании обратной матрицы. Попробуем использовать данный метод для решения следующей системы уравнений:
14x1+2x2+8x4=218 7x1-3x2+5x3+12x4=213 5x1+x2-2x3+4x4=83 6x1+2x2+x3-3x4=21
- Заполняем матрицу числами, которые являются коэффициентами уравнения. Данные числа должны располагаться последовательно по порядку с учетом расположения каждого корня, которому они соответствуют. Если в каком-то выражении один из корней отсутствует, то в этом случае коэффициент считается равным нулю. Если коэффициент не обозначен в уравнении, но соответствующий корень имеется, то считается, что коэффициент равен 1. Обозначаем полученную таблицу, как вектор A.
- Отдельно записываем значения после знака «равно». Обозначаем их общим наименованием, как вектор B.
- Теперь для нахождения корней уравнения, прежде всего, нам нужно отыскать матрицу, обратную существующей. К счастью, в Эксель имеется специальный оператор, который предназначен для решения данной задачи. Называется он МОБР. Он имеет довольно простой синтаксис:
=МОБР(массив)
Аргумент «Массив» — это, собственно, адрес исходной таблицы.
Итак, выделяем на листе область пустых ячеек, которая по размеру равна диапазону исходной матрицы. Щелкаем по кнопке «Вставить функцию», расположенную около строки формул.
- Выполняется запуск Мастера функций. Переходим в категорию «Математические». В представившемся списке ищем наименование «МОБР». После того, как оно отыскано, выделяем его и жмем на кнопку «OK».
- Запускается окно аргументов функции МОБР. Оно по числу аргументов имеет всего одно поле – «Массив». Тут нужно указать адрес нашей таблицы. Для этих целей устанавливаем курсор в это поле. Затем зажимаем левую кнопку мыши и выделяем область на листе, в которой находится матрица. Как видим, данные о координатах размещения автоматически заносятся в поле окна. После того, как эта задача выполнена, наиболее очевидным было бы нажать на кнопку «OK», но не стоит торопиться. Дело в том, что нажатие на эту кнопку является равнозначным применению команды Enter. Но при работе с массивами после завершения ввода формулы следует не кликать по кнопке Enter, а произвести набор сочетания клавиш Ctrl+Shift+Enter. Выполняем эту операцию.
- Итак, после этого программа производит вычисления и на выходе в предварительно выделенной области мы имеем матрицу, обратную данной.
- Теперь нам нужно будет умножить обратную матрицу на матрицу B, которая состоит из одного столбца значений, расположенных после знака «равно» в выражениях. Для умножения таблиц в Экселе также имеется отдельная функция, которая называется МУМНОЖ. Данный оператор имеет следующий синтаксис:
=МУМНОЖ(Массив1;Массив2)
Выделяем диапазон, в нашем случае состоящий из четырех ячеек. Далее опять запускаем Мастер функций, нажав значок «Вставить функцию».
- В категории «Математические», запустившегося Мастера функций, выделяем наименование «МУМНОЖ» и жмем на кнопку «OK».
- Активируется окно аргументов функции МУМНОЖ. В поле «Массив1» заносим координаты нашей обратной матрицы. Для этого, как и в прошлый раз, устанавливаем курсор в поле и с зажатой левой кнопкой мыши выделяем курсором соответствующую таблицу. Аналогичное действие проводим для внесения координат в поле «Массив2», только на этот раз выделяем значения колонки B. После того, как вышеуказанные действия проведены, опять не спешим жать на кнопку «OK» или клавишу Enter, а набираем комбинацию клавиш Ctrl+Shift+Enter.
- После данного действия в предварительно выделенной ячейке отобразятся корни уравнения: X1, X2, X3 и X4. Они будут расположены последовательно. Таким образом, можно сказать, что мы решили данную систему. Для того, чтобы проверить правильность решения достаточно подставить в исходную систему выражений данные ответы вместо соответствующих корней. Если равенство будет соблюдено, то это означает, что представленная система уравнений решена верно.
Урок: Обратная матрица в Excel
Способ 2: подбор параметров
Второй известный способ решения системы уравнений в Экселе – это применение метода подбора параметров. Суть данного метода заключается в поиске от обратного. То есть, основываясь на известном результате, мы производим поиск неизвестного аргумента. Давайте для примера используем квадратное уравнение
3x^2+4x-132=0
- Принимаем значение x за равное . Высчитываем соответствующее для него значение f(x), применив следующую формулу:
=3*x^2+4*x-132
Вместо значения «X» подставляем адрес той ячейки, где расположено число , принятое нами за x.
- Переходим во вкладку «Данные». Жмем на кнопку «Анализ «что если»». Эта кнопка размещена на ленте в блоке инструментов «Работа с данными». Открывается выпадающий список. Выбираем в нем позицию «Подбор параметра…».
- Запускается окно подбора параметров. Как видим, оно состоит из трех полей. В поле «Установить в ячейке» указываем адрес ячейки, в которой находится формула f(x), рассчитанная нами чуть ранее. В поле «Значение» вводим число «0». В поле «Изменяя значения» указываем адрес ячейки, в которой расположено значение x, ранее принятое нами за. После выполнения данных действий жмем на кнопку «OK».
- После этого Эксель произведет вычисление с помощью подбора параметра. Об этом сообщит появившееся информационное окно. В нем следует нажать на кнопку «OK».
- Результат вычисления корня уравнения будет находиться в той ячейке, которую мы назначили в поле «Изменяя значения». В нашем случае, как видим, x будет равен 6.
Этот результат также можно проверить, подставив данное значение в решаемое выражение вместо значения x.
Урок: Подбор параметра в Excel
Способ 3: метод Крамера
Теперь попробуем решить систему уравнений методом Крамера. Для примера возьмем все ту же систему, которую использовали в Способе 1:
14x1+2x2+8x4=218 7x1-3x2+5x3+12x4=213 5x1+x2-2x3+4x4=83 6x1+2x2+x3-3x4=21
- Как и в первом способе, составляем матрицу A из коэффициентов уравнений и таблицу B из значений, которые стоят после знака «равно».
- Далее делаем ещё четыре таблицы. Каждая из них является копией матрицы A, только у этих копий поочередно один столбец заменен на таблицу B. У первой таблицы – это первый столбец, у второй таблицы – второй и т.д.
- Теперь нам нужно высчитать определители для всех этих таблиц. Система уравнений будет иметь решения только в том случае, если все определители будут иметь значение, отличное от нуля. Для расчета этого значения в Экселе опять имеется отдельная функция – МОПРЕД. Синтаксис данного оператора следующий:
=МОПРЕД(массив)
Таким образом, как и у функции МОБР, единственным аргументом выступает ссылка на обрабатываемую таблицу.
Итак, выделяем ячейку, в которой будет выводиться определитель первой матрицы. Затем жмем на знакомую по предыдущим способам кнопку «Вставить функцию».
- Активируется окно Мастера функций. Переходим в категорию «Математические» и среди списка операторов выделяем там наименование «МОПРЕД». После этого жмем на кнопку «OK».
- Запускается окно аргументов функции МОПРЕД. Как видим, оно имеет только одно поле – «Массив». В это поле вписываем адрес первой преобразованной матрицы. Для этого устанавливаем курсор в поле, а затем выделяем матричный диапазон. После этого жмем на кнопку «OK». Данная функция выводит результат в одну ячейку, а не массивом, поэтому для получения расчета не нужно прибегать к нажатию комбинации клавиш Ctrl+Shift+Enter.
- Функция производит подсчет результата и выводит его в заранее выделенную ячейку. Как видим, в нашем случае определитель равен -740, то есть, не является равным нулю, что нам подходит.
- Аналогичным образом производим подсчет определителей для остальных трех таблиц.
- На завершающем этапе производим подсчет определителя первичной матрицы. Процедура происходит все по тому же алгоритму. Как видим, определитель первичной таблицы тоже отличный от нуля, а значит, матрица считается невырожденной, то есть, система уравнений имеет решения.
- Теперь пора найти корни уравнения. Корень уравнения будет равен отношению определителя соответствующей преобразованной матрицы на определитель первичной таблицы. Таким образом, разделив поочередно все четыре определителя преобразованных матриц на число -148, которое является определителем первоначальной таблицы, мы получим четыре корня. Как видим, они равны значениям 5, 14, 8 и 15. Таким образом, они в точности совпадают с корнями, которые мы нашли, используя обратную матрицу в способе 1, что подтверждает правильность решения системы уравнений.
Способ 4: метод Гаусса
Решить систему уравнений можно также, применив метод Гаусса. Для примера возьмем более простую систему уравнений из трех неизвестных:
14x1+2x2+8x3=110 7x1-3x2+5x3=32 5x1+x2-2x3=17
- Опять последовательно записываем коэффициенты в таблицу A, а свободные члены, расположенные после знака «равно» — в таблицу B. Но на этот раз сблизим обе таблицы, так как это понадобится нам для работы в дальнейшем. Важным условием является то, чтобы в первой ячейке матрицы A значение было отличным от нуля. В обратном случае следует переставить строки местами.
- Копируем первую строку двух соединенных матриц в строчку ниже (для наглядности можно пропустить одну строку). В первую ячейку, которая расположена в строке ещё ниже предыдущей, вводим следующую формулу:
=B8:E8-$B$7:$E$7*(B8/$B$7)
Если вы расположили матрицы по-другому, то и адреса ячеек формулы у вас будут иметь другое значение, но вы сможете высчитать их, сопоставив с теми формулами и изображениями, которые приводятся здесь.
После того, как формула введена, выделите весь ряд ячеек и нажмите комбинацию клавиш Ctrl+Shift+Enter. К ряду будет применена формула массива и он будет заполнен значениями. Таким образом мы произвели вычитание из второй строки первой, умноженной на отношение первых коэффициентов двух первых выражений системы.
- После этого копируем полученную строку и вставляем её в строчку ниже.
- Выделяем две первые строки после пропущенной строчки. Жмем на кнопку «Копировать», которая расположена на ленте во вкладке «Главная».
- Пропускаем строку после последней записи на листе. Выделяем первую ячейку в следующей строке. Кликаем правой кнопкой мыши. В открывшемся контекстном меню наводим курсор на пункт «Специальная вставка». В запустившемся дополнительном списке выбираем позицию «Значения».
- В следующую строку вводим формулу массива. В ней производится вычитание из третьей строки предыдущей группы данных второй строки, умноженной на отношение второго коэффициента третьей и второй строки. В нашем случае формула будет иметь следующий вид:
=B13:E13-$B$12:$E$12*(C13/$C$12)
После ввода формулы выделяем весь ряд и применяем сочетание клавиш Ctrl+Shift+Enter.
- Теперь следует выполнить обратную прогонку по методу Гаусса. Пропускаем три строки от последней записи. В четвертой строке вводим формулу массива:
=B17:E17/D17
Таким образом, мы делим последнюю рассчитанную нами строку на её же третий коэффициент. После того, как набрали формулу, выделяем всю строчку и жмем сочетание клавиш Ctrl+Shift+Enter.
- Поднимаемся на строку вверх и вводим в неё следующую формулу массива:
=(B16:E16-B21:E21*D16)/C16
Жмем привычное уже нам сочетание клавиш для применения формулы массива.
- Поднимаемся ещё на одну строку выше. В неё вводим формулу массива следующего вида:
=(B15:E15-B20:E20*C15-B21:E21*D15)/B15
Опять выделяем всю строку и применяем сочетание клавиш Ctrl+Shift+Enter.
- Теперь смотрим на числа, которые получились в последнем столбце последнего блока строк, рассчитанного нами ранее. Именно эти числа (4, 7 и 5) будут являться корнями данной системы уравнений. Проверить это можно, подставив их вместо значений X1, X2 и X3 в выражения.
Как видим, в Экселе систему уравнений можно решить целым рядом способов, каждый из которых имеет собственные преимущества и недостатки. Но все эти методы можно условно разделить на две большие группы: матричные и с применением инструмента подбора параметров. В некоторых случаях не всегда матричные методы подходят для решения задачи. В частности тогда, когда определитель матрицы равен нулю. В остальных же случаях пользователь сам волен решать, какой вариант он считает более удобным для себя.
Мы рады, что смогли помочь Вам в решении проблемы.
Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.
ли со статьей или есть что добавить?