Нахождение решений однородной СЛАУ

245
30 декабря 2017, 01:32

Всем привет! Пишу программу, решающую химические уравнения (на уровне школьной программы), и столкнулся с проблемой на задаче, которая сразу казалась значительно легче: расстановка коэффициентов. Как я понимаю, что бы их найти надо найти решения однородной СЛАУ, где неизвестные - коэффициенты, а в уравнениях коэффициенты - количества химического элемента в каждом веществе. Или я что то не так понимаю, или методом Гаусса можно найти только тривиальное решение системы: все неизвестные равны 0. Следовательно надо решать ее методом подстановки и выражать через какую то одну переменную все остальные? Но я без понятия как это сделать. Буду очень благодарен, если мне кто то подскажет как это реализовать

Answer 1

Ваша задача сводится к решению матричного уравнения

Ax=By

где A - квадратная матрица N x N, B - прямоугольная матрица N x M, соответственно вектор зависимых переменных x имеет размерность N, вектор независимых переменных y имеет размерность M, где 1 <= M < N. Тогда зависимость переменных X от Y в случае невырожденной матрицы A будет иметь вид

x=(1/A)By

где (1/A) обратная матрица к A. Следовательно Ваша задача расчета коэффициентов для искомой аналитической зависимости сводится к вычислению обратной матрица (1/A), что делается методом гаусса и последующим ее умножением на матрицу В.

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

Пусть у вас есть N линейных уравнений c неизвестными x1, x2, ..., xN и свободно изменяемыми параметрами y1,y2, ...yM, которые можно записать в виде:

 a11*x1+a12*x2+...a1N*xN=b11*y1+b12*y2+...b1M*yM
 a21*x1+a22*x2+...a2N*xN=b21*y1+b22*y2+...b2M*yM
 .........................
 aN1*x1+aN2*x2+...aNN*xN=bN1*y1+bN2*y2+...bNM*yM

Теперь предположим, что y1=1, все остальные y2 = y3 = yM = 0, то есть имеем систему уравнений с постоянными коэффициентами

 a11*x1+a12*x2+...a1N*xN=b11
 a21*x1+a22*x2+...a2N*xN=b21
 .........................
 aN1*x1+aN2*x2+...aNN*xN=bN1

Решим ее методом Гаусса (Мы полагаем, уравнения независимы) и запишем решение виде:

 x1=d11
 x2=d21
 .........................
 xN=dN1

Это решение было получено для y1=1, соответственно для произвольного y1, его для линейного уравнения можно записать в виде:

 x1=d11*y1
 x2=d21*y1
 .........................
 xN=dN1*y1

Теперь пусть y2=1, все остальные y1 = y3 = yM = 0, и получим уравнение

 a11*x1+a12*x2+...a1N*xN=b12
 a21*x1+a22*x2+...a2N*xN=b22
 .........................
 aN1*x1+aN2*x2+...aNN*xN=bN2

решая которое методом Гаусса получим коэффициенты d12,...,dN2. Соответственно решение для произвольных y1 и y2 может быть записано в виде суммы решений:

 x1=d11*y1+d12*y2
 x2=d21*y1+d22*y2
 .........................
 xN=dN1*y1+dN2*y2

Повторяя этот процесс, мы в конечном итоге получим решение, которое Вам нужно:

 x1=d11*y1+d12*y2+...+d1M*yM
 x2=d21*y1+d22*y2+...+d2M*yM
 .........................
 xN=dN1*y1+dN2*y2+...+dNM*yM

Здесь нужно сразу сказать, что предложенная схема не эффективна, так как требует, чтобы линейное уравнение решалось M раз. Правильный способ я описал выше (через обращение матрицы и умножения на матрицу B), но для этого Вам надо прочесть любой учебник по линейной алгебре за первый семестр. Для умного школьника, который программирует и собирается учиться дальше, это очень простая задача. Вот для начала ссылка https://ru.wikipedia.org/wiki/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86 . Ну и думаю, что не нужно говорить, что не следует писать свою версию программы решения линейных уравнений и обращения матриц (это можно делать только в учебных целях), а нужно найти уже готовые и оттестированные решения.

Answer 2

Первые ссыдки в гугле: Реализация на C# Реализация на C++

Надеюсь, поможет)

READ ALSO
Парсер json с декодированием текста

Парсер json с декодированием текста

В Json встречаются такие тексты \u0432\u043b\u0435, есть ли какой нибудь online парсер Json, который бы декодировал такой текст ?

240
Как передать в контроллер значение из списка select

Как передать в контроллер значение из списка select

Не ожидал наткнуться на проблему в таком вопросе и тем не менееВот мое представление :

228
C# наследование контрола

C# наследование контрола

Надо добавить к GroupBox ещё одну property как сделать клас со всем что есть у groupbox и добавить собственое свойство?

246
Подключение к БД (C#)

Подключение к БД (C#)

Правильно ли я подключаюсь к БД?

239