Как решить систему уравнений в c
Перейти к содержимому

Как решить систему уравнений в c

  • автор:

Как обработать все случаи при решении системы линейных уравнений с двумя неизвестными?

Прошу прощения за мой несколько глупый вопрос, но у меня возникла проблема при подготовке к олимпиаде. Конкретно проблемы вот с этой вот задачей про систему уравнений с двумя неизвестными.
Глохну на 34 тесте.

Казалось бы, все просто:
1 случай (коэффициенты при переменных непропорциональны) Здесь система имеет однозначное решение.

2 случай (коэффициенты при переменных пропорциональны):
Этот случай разбивается на два:
а) коэффициенты при переменных и свободные члены пропорциональны

б) коэффициенты при переменных и свободные члены пропорциональны
Тут просто решений нет, так как прямые параллельны.

Рассматриваю случай а) подробнее, так как требуется выводить разные значения исходя из возможных пар (x, y).
1. Все коэффициенты при переменных равны 0 и свободные члены равны 0 — бесконечное число решений
2. Все коэффициенты при переменных равны 0, но какой-то из свободных членов 0 не равен — решений нет
3. Когда коэффициенты при X равны 0 — тогда у нас есть единственное решение для Y, а X может быть любым
4. Когда коэффициенты при Y равны 0 — тогда у нас есть единственное решение для X, а Y может быть любым
5. Ненулевые коэффициенты, тогда решение у нас представляется в виде Y = k * X + B

Все это я реализовал на C++, код представлен ниже:

int main() < double a, b, c, d, e, f; double x, y; const int no_roots = 0; const int kx_roots = 1; const int one_xy_root = 2; const int one_x = 3; const int one_y = 4; const int inf_roots = 5; cin >> a >> b >> c >> d >> e >> f; double det = a * d - b * c; double det_x = (e * d - b * f); double det_y = (a * f - e * c); bool x_null = a == 0 && c == 0; bool y_null = b == 0 && d == 0; if (det != 0) < x = det_x / det; y = det_y / det; cout else < if (det_x == 0 && det_y == 0) < if (x_null && y_null) < if (e != 0 || f != 0) < cout else < cout > else if (x_null) < if (b != 0) < y = e / b; >else < y = f / d; >cout else if (y_null) < if (a != 0) < x = e / a; >else < x = f / a; >cout else < double bi, k; if (b != 0) < bi = e / b; k = -a / b; >else < bi = f / d; k = -c / d; >cout > else < cout > return 0; >

Что я упускаю из вида? Не могу подобрать такие коэффициенты, на которых программа выдавала бы некорректный ответ.

  • Вопрос задан более трёх лет назад
  • 1940 просмотров

1 комментарий

Оценить 1 комментарий

Решение уравнений

Author24 — интернет-сервис помощи студентам

Добрый вечер!
Надо написать программу,которая считает уравнения. Если условие выполняется,то считается функция 1,если нет,то функция 2.
Я примерно понимаю как делать,но мне не хватает знаний,дабы грамотно записать.
Даны значения (я сразу их решу)
a=x^2 -9
x=+-3
b=x/(12x^2+7x-5)
x не равен -1 и 5\12
условие b должно быть меньше нуля. Если оно исполняется то считается функция
-1/(2a) * (ab-a\2)
а не может быть равно 0
если условие б не выполняется то:
a^3 (b+2ab)
собственно мой код,который требует дополнений:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
#include #include #include int main(int argc, char *argv[])  float a, b, x, f; printf("\nx="); scanf("%f", &x); a = pow(x,2)-9; b = x/(12*pow(x,2)+7*x-5); if (x == -1 if (b0) if (b0) { f = -(1/2*a)*(a*b-(a/2)); printf("\nf1=%.3f", f); } else { printf("\не правильное значение х (f1)"); return 2; } else if (b>0) { f = pow(a,3)*(b+2*a*b); printf("\nf2=%.3f", f); } else { printf("\не правильное значение х (f2)"); return 3; } return 0; }

Разбираемся в решении линейных уравнениях раз и навсегда

Отметим, что не всегда количество неизвестных будет совпадать с количеством уравнений в системе, но системы такого уровня рассматриваются в старшей школе. В данной статье речь пойдёт о системах двух уравнений с двумя переменными, за исключением пункта «Решение систем линейных уравнений методом Гаусса», где мы рассмотрим систему с тремя переменными. Вот несколько методов решения систем линейных уравнений.

Решение системы линейных уравнений методом подстановки («школьный метод»)

Метод подстановки знаком из курса школьной математики, его изучают в 7 классе. Это самый лёгкий способ решения систем линейных уравнений. Его алгоритм достаточно прост и заключается в следующем:

  1. одна переменная из одного линейного уравнения выражается через другую переменную;
  2. выраженная переменная подставляется в другое уравнение системы;
  3. полученное уравнение, содержащее только одну переменную, решается относительно этой переменной;
  4. значение переменной, полученное в пункте 3, подставляется в выражение для другой (первой) переменной (см. пункт 1).

Для примера применим данный метод решения к следующей системе уравнений:

Пример системы линейных алгебраических уравнений с двумя переменными

Согласно первому пункту алгоритма решения СЛАУ нужно выразить одну переменную через другую. В данном случае удобно из второго уравнения системы выразить переменную y через переменную x:

Из второго уравнения системы выражаем переменную y через переменную x

Далее подставим переменную y, выраженную через x, в первое уравнение системы. Получим:

Подставим переменную y, выраженную через x, в первое уравнение системы

Тогда можно записать систему уравнений, равносильную первой:

Запишем систему уравнений, равносильную первой

Раскроем скобки и приведём первое уравнение системы к следующему виду:

Приведём первое уравнение системы к следующему виду

Получаем значение переменной x

Теперь найдём значение y, подставив значение переменной x в выражение для второй переменной:

Подставим значение переменной x в выражение для второй переменнойПолучаем значение переменной y

Применив данный метод к рассматриваемой системе линейных уравнений, мы нашли пару чисел (7;3), являющуюся её решением.

Решение системы линейных уравнений методом почленного сложения (вычитания) уравнений системы

Суть данного метода состоит в избавлении от одной из переменных в системе уравнений, алгоритм метода достаточно простой:

  1. все уравнения системы почленно умножаются на такое число, чтобы коэффициенты при одной из переменных стали противоположными числами (если коэффициенты при одной из переменных уже являются противоположными числами, то сразу можно переходить к пункту 2);
  2. правая и левая части каждого уравнения почленно складываются, получается уравнение с одной переменной;
  3. полученное уравнение решается относительно единственной переменной;
  4. значение найденной переменной подставляется в одно из исходных уравнений системы, далее определяется значение второй переменной.

В качестве примера решим систему уравнений:

Пример системы линейных алгебраических уравнений с двумя неизвестными

методом почленного сложения (вычитания). Здесь будет достаточно просто «избавиться» от переменной y. Для этого почленно умножим обе части первого уравнения системы на 2:

Почленно умножим обе части первого уравнения системы на 2

получим равносильную систему уравнений:

Решение системы линейных уравнений

Теперь прибавим к левой части первого уравнения левую часть второго уравнения, а к правой части первого уравнения — правую часть второго. В итоге получим уравнение вида:

Решим это уравнение относительно единственной переменной:

Получаем значение переменной x

Подставим найденное значение в первое уравнение исходной системы и найдём значение y:

Найдём значение y

Итак, пара чисел (4;3) является решением системы линейных уравнений с двумя переменными. Данное решение было получено методом сложения.

Решение системы линейных уравнений по формулам Крамера

Чтобы решить систему линейных уравнений методом Крамера, нужно познакомиться с понятием определителя.

Определение

Определителем системы называют запись чисел в квадратной таблице, в соответствие которой ставится число по некоторому правилу.

Давайте познакомимся с этим правилом. Пусть даны четыре числа a, b, c, d. Пусть они имеют следующее расположение в квадратной таблице:

Определитель системы

Значение определителя системы в этом случае находится по формуле:

Формула для нахождения определителя СЛАУ

Определитель, составленный из коэффициентов при переменных в линейной системе уравнений, называется главным определителем системы. Будем обозначать его Δ. Например, у рассмотренной выше системы уравнений:

Рассмотрим систему уравнений

главный определитель будет иметь вид:

Найдём его значение:

Значение главного определителя

Для решения системы линейных уравнений методом Крамера нам понадобятся ещё два определителя, которые называются вспомогательными:

Отметим, что в данные определители уже входят правые части каждого уравнения системы. Так, в определитель Δₓ первым столбцом записываем правые части уравнений (так называемые свободные члены уравнений), второй столбец оставляем таким же, как в главном определителе системы. В определитель Δу вторым столбцом записываем правые части уравнений, а первый столбец оставляем таким же, как в главном определителе системы.

Итак, формулы Крамера для решения системы двух линейных уравнений с двумя переменными:

Формулы Крамера для решения СЛАУ

Отметим, что данный метод решения СЛАУ можно применять лишь в тех случаях, когда Δ ≠ 0.

Убедимся в том, что данные формулы работают, подставив в них ранее найденные значения определителей:

Как решить систему линейных уравнений

Пара чисел (4;3) действительно является решением данной системы уравнений.

Обобщим алгоритм нахождения решений системы двух линейных уравнений с двумя переменными методом Крамера. Пусть дана система линейных уравнений:

Общий вид системы линейных алгебраических уравнений с двумя неизвестными

  1. Вычислить главный определитель системы

Формула для вычисления главного определителя системы

  1. Вычислить вспомогательные определители

  1. Применить формулы Крамера и найти решение системы:

Формулы Крамера для решения системы двух линейных уравнений с двумя переменными

Решение системы линейных уравнений с помощью обратной матрицы

Матрицей системы линейных уравнений называется таблица, составленная из коэффициентов при переменных. Так, для системы вида:

Система линейных уравнений в общем виде

матрицей A является:

Столбцом свободных коэффициентов будем называть

Столбец свободных коэффициентов

а столбцом переменных —

Столбец переменных

Тогда систему уравнений можно переписать в виде:

Поясним, как происходит умножение матрицы на столбец. В матрице A есть строки: (а₁₁, а₁₂) и (а₂₁, а₂₂) а также столбцы (а₁₁, а₂₁) и (а₁₂, а₂₂).

При умножении матрицы на столбец X получается столбец, а само умножение происходит по следующему правилу:

Умножение происходит по следующему правилу

Для нахождения обратной матрицы, которая обозначается как А⁻¹ , нам потребуется умение находить определитель матрицы, что подробно описано в разделе «Решение системы линейных уравнений по формулам Крамера», и умение находить транспонированную матрицу T. Для того чтобы записать матрицу, транспонированную к данной, нужно лишь поменять столбцы и строки местами. Например, для матрицы A транспонированной будет матрица:

Транспонированная матрица

Рассмотрим алгоритм поиска обратной матрицы:

1) вычислить определитель матрицы A:

Решение системы линейных уравнений по формулам Крамера

2) записать матрицу миноров M. Для этого нужно просто переставить числа в матрице A следующим образом:

Матрица для решения линейных уравнений

3) записать матрицу алгебраических дополнений А ͙. Для этого необходимо лишь поменять знаки коэффициентов а₁₂ и а₂₁ в матрице миноров M, в результате чего получим:

Матрица алгебраических дополнений

записать матрицу, транспонированную к матрице алгебраических дополнений:

Решение системы линейных уравнений с помощью обратной матрицы

найти обратную матрицу А⁻¹, разделив каждый элемент матрицы Аᵀ ͙ на значение определителя матрицы A, то есть

Обратная матрица

Для нахождения неизвестных нужно полученную обратную матрицу А⁻¹ умножить на столбец свободных коэффициентов:

Нахождение неизвестных

Поясним всё на примере решения системы линейных уравнений с двумя переменными:

Пример решения системы линейных уравнений с двумя переменными

Матрица системы

столбец свободных коэффициентов:

Столбец свободных коэффициентов

Следуя алгоритму решения СЛАУ, найдём обратную матрицу А⁻¹:

1) определитель матрицы A равен

Определитель матрицы A

2) матрица миноров:

Матрица миноров

3) матрица алгебраических дополнений:

Матрица алгебраических дополнений

4) матрица, транспонированная к матрице алгебраических дополнений:

Матрица, транспонированная к матрице алгебраических дополнений

5) обратная матрица:

Обратная матрица

Теперь умножим найденную обратную матрицу на столбец свободных коэффициентов:

Решение данной системы уравнений

Пара чисел (1;2) является решением данной системы уравнений.

Решение системы линейных уравнений методом Гаусса

Этот метод позволяет достаточно легко находить решения систем линейных уравнений, в которых более двух уравнений и неизвестных. По сути, этот метод является обобщением метода подстановки. Итак, как можно решить систему линейных уравнений? Рассмотрим этот способ на примере системы трёх уравнений с тремя неизвестными.

На первом этапе решения систему уравнений необходимо привести к трапециевидной форме, которая выглядит следующим образом:

Общий вид СЛАУ для решения методом Гаусса

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

Применим данный метод к системе линейных уравнений с тремя переменными:

Расширенная матрица A данной системы принимает вид:

Расширенная матрица A

Проводя преобразования строк, нужно добиться того, чтобы в третьей строке расширенной матрицы на первом и втором местах были нули, а во второй строке — нуль на первом месте (возможно, при этом во второй строке будет ещё нуль и на третьем месте).

Вначале вычтем из второй строки матрицы первую строку, умноженную на два, в результате во второй строке окажется два нуля. Затем вычтем из третьей строки первую строку, умноженную на три, в результате чего в третьей строке окажется только один ноль:

Преобразование строк расширенной матрицы

С одной стороны, можно остановиться на данном этапе, поменять вторую и третью строку местами, решить систему уравнений, соответствующую полученной расширенной матрице:

С другой стороны, следуя алгоритму решения системы уравнений, необходимо вычесть из третьей строки расширенной матрицы вторую строку и получить два нуля в последней строке матрицы:

Дальнейшее преобразование матрицы

Это позволит перейти к решению ещё более простой системы линейных уравнений:

Теперь реализуем обратный ход метода Гаусса: из третьего уравнения системы определим z = 3 , из второго — y = 2. Далее используем метод подстановки и определим значение x:

Определяем значение x методом подстановки

Итак, решение системы линейных уравнений методом Гаусса: x = 1, y = 2, z = 3.

Заключение

В этой статье мы разобрали следующие основные способы решения систем линейных уравнений:

  • метод подстановки, или «школьный метод»,
  • метод почленного сложения или вычитания,
  • метод Крамера,
  • решение с помощью обратной матрицы,
  • метод Гаусса.

Надеемся, что теперь вы сможете без труда справиться с любым линейным уравнением.

Скоро перезвоним!

Или напишем на почту, если не получится дозвониться

Oops! Something went wrong while submitting the form.
Поделиться:

Отправили гайд вам на почту
Вы можете начать читать в браузере и вернуться в любой момент — гайд всегда будет у вас на почте
Открыть гайд
Oops! Something went wrong while submitting the form.
Бесплатный доступ к занятиям в Домашней школе

Вы получите записи уроков по нескольким предметам, познакомитесь с учителями и попробуете решить домашнее задание

Как решить систему уравнений в c

Вычисление системы уравнений с условиями

#include #include #include #include #include #include using namespace std; int main() < SetConsoleCP(1251); SetConsoleOutputCP(1251); setlocale(LC_ALL, "Russian"); float w,a,b,c,x; cout > x; cout > a; cout > b; cout > c; if (x < 1.2) < w = a*pow(x,2)+b*x+c; cout else if (x > 1.2) < w = (a+b*x)/sqrt(pow(x,2)+1); cout else if (x == 1.2) < w = a/(x+sqrt(pow(x,2)+1)); cout system("Pause"); return 0; >

Последний раз редактировалось Аватар; 06.11.2018 в 22:37 .

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Matlab Решение системы дифференциальных уравнений с граничными условиями IRENN_Ka Помощь студентам 0 02.11.2014 21:22
Решение системы линейных уравнений методом Холецкого. Размер системы n параметр, n

ProjectVenom Помощь студентам 1 08.03.2014 15:57
Системы уравнений korolariya Общие вопросы C/C++ 1 12.02.2011 23:06
Системы нелинейных уравнений Anarki Общие вопросы C/C++ 1 26.09.2009 23:49

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *