Как сделать систему уравнений в маткаде

Добавил пользователь Валентин П.
Обновлено: 07.09.2024

БлогNot. Основные прямые и итерационные методы решения СЛАУ в MathCAD

Основные прямые и итерационные методы решения СЛАУ в MathCAD

Как известно, решение систем линейных алгебраических уравнений (СЛАУ) - весьма распространённый на практике тип задач. Теорию можно почитать по ссылке, а здесь приведём основные расчёты как для прямых (аналитических), так и для итерационных (приближённых) методов решения СЛАУ.

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

Уже двое спросили "а как всё же найти решение методом обратной матрицы?" :)
Введя данные, как на картинке ниже, под данными написать одну из формул x:=A -1 *b или x:=lsolve(A,b)
Затем ещё ниже сделать x=

А вот метод Крамера запрограммируем. Элемент вектора решения xi в нём получается в виде дроби, знаменателем которой является определитель матрицы системы, а числителем – определитель матрицы Ai , полученной из исходной заменой i-го столбца столбцом свободных членов b . Для удобства будем во всём документе нумеровать строки и столбцы матриц с единицы, то есть, установим значение системной переменной ORIGIN:=1 . Также определим общие для всех методов матрицу и вектор правой части системы:

Условием существования и единственности решения СЛАУ во всех случаях является условие det A?0 , т.е., определитель матрицы A не равен нулю. Также имеет смысл сделать проверку полученного решения, посчитав значение невязки, равное норме разности векторов A*x ( x - найденное решение) и b . В идеале невязка должна быть равной нулю, но из-за неизбежного накопления погрешностей операций над вещественными числами она окажется равна малому числу e , соответствующему погрешности метода. В MathCAD скалярный оператор "модуль" с панели инструментов калькулятора в применении к разности векторов даст как раз значение невязки, проверим это утверждение на небольшом тесте:

С учётом всего сказанного, реализуем метод Крамера и проверку полученного решения:

В теле функции det оператор |A| - это не модуль числа с панели "Калькулятор", а похожая внешне кнопка "Определитель" с панели "Матрицы"!

Классический метод Гаусса с приведением матрицы к верхнему треугольному виду подробно изучается в базовом курсе высшей математики. Реализуем самую простую его разновидность, выбирающую ведущий элемент на главной диагонали матрицы, то есть, работающую в предположении, что значение A1,1,?0 . Так как эта подпрограмма "нулевого" уровня, назовём её Gauss0 , а более сложную Gauss напишем отдельно.

Для удобства вектор правой части b записан как (n+1) -й столбец матрицы A , такую матрицу системы называют расширенной.

Реализация более "полноценного" метода Гаусса с выбором ведущего элемента (и перестановкой при необходимости строк матрицы) выполнена в приложенном к статье документе MathCAD, по крайней мере, систему с нулями на главной диагонали матрицы подпрограмма Gauss решила. Её дополнительный параметр - погрешность e , начиная с которой значение |Ai,j| считается равным нулю. В случае ошибки (нет решения) подпрограмма возвращает вектор из n значений "бесконечность".

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

В определённой мере избежать этих недостатков позволяют итерационные методы, последовательно приближающие решение формулами вида xi (k+1) = f(xi (k) ) , где k=0,1. - номер шага, до тех пор, пока выбранная мера разности между двумя соседними векторами приближениямй |x (k+1) -x (k) | не станет меньше заданного малого значения e . В простейшем случае решение СЛАУ с матрицей размерности 2*2 методом простых итераций будет выглядеть так:

Все неизвестные значения xi присутствуют и в левой, и в правой частях новых уравнений. Выбрав некоторый вектор начального приближения x (0) , посчитаем по нему новое приближение x (1) , затем подставим его в правые части уравнений и посчитаем x (2) и т.д. до выполнения условия сходимости. А оно, кстати, довольно просто - метод Якоби сходится, если матрица системы имеет диагональное преобладание, то есть, на главной диагонали находятся наибольшие в своих строках элементы. Наша тестовая матрица уже имеет диагональное преобладание, а в большинстве других случаев этого можно добиться, выполняя преобразования над уравнениями системы, подобные тем, что делает расширенная процедура Gauss .

Выбор вектора начального приближения x (0) на практике также обычно прост, принимают x (0) =b , то есть, вектору правой части системы. Можно и просто "занулить" вектор x (0) .

Приходим к следующей процедуре решения:

Обратите внимание, что нам пришлось "схитрить" при расчёте сумм s1 и s2 - MathCAD просто не сможет вычислить сумму с нижним пределом суммирования =1 и верхним =0 (или нижним n и верхним n-1 ). По той же причине дополнительные проверки сделаны и в процедуре Gauss .

В основной "бесконечный" цикл подпрограммы имеет смысл добавить аварийный выход оператором break , например, по выполнении 10000 шагов.

Также, в этом и следующем методе в строчке с break точнее был бы критерий выхода |max(x1-x0)|<=e , где | | - значок модуля числа с панели калькулятора.

Итерационный метод Гаусса-Зейделя отличается от метода простых итераций лишь тем, что для подсчета i –й компоненты (k+1) –го приближения к искомому вектору решения используются уже вычисленные на этом, т.е., (k+1) –м шаге новые значения первых i–1 компонент. а не просто берётся вектор x0 целиком с предыдущего шага. В нашей подпрограмме достаточно заменить x0 на x1 в операторе расчёта суммы s1 :) У меня точность решения на использованном тесте выросла при этом вчетверо.

Метод Якоби является вариантом метода простых итераций, в котором используемые в итерационной процедуре матрица C и вектор v определяются по формулам

Вот расчёт методом Якоби с критерием выхода "максимальный модуль разности между проекциями x1 (k) i и x0 (k) i стал меньше либо равен заданной точности e :

Метод Якоби


Метод Якоби

При расчёте r применены операторы "Векторизовать" с панели "Матрицы" и "Модуль" с Калькулятора, а при расчёте элементов С и v деление выполнено "в строчку" для экономии места.

P.S. И ещё про прямые "гауссоподобные" методы решения СЛАУ. Если Вам нужно не пошаговое программирование, а достаточно применения стандартных функций, есть способ проще. С помощью стандартной функции augment можно получить расширенную матрицу системы (поставив "рядом" матрицу A и вектор b ), а с помощью rref привести матрицу к ступенчатому виду с единичным базисным минором. Потом останется извлечь решение с помощью метода submatrix (последний столбец матрицы, которую вернул метод rref ).

Норма вектора |A*x-b| , как и другие нормы в статье, берётся кнопкой |x| с Калькулятора, а не похожей на неё кнопкой с панели "Матрицы".

Х – имя переменной, относительно которой решается уравнение.

Функция Root Реализует алгоритм поиска корня численным методом и требует предварительного задания начального приближения искомой переменной Х. Поиск корня будет производиться вблизи этого числа. Таким образом, присвоение начального значения требует предварительной информации о примерной локализации корня.

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

Эта ошибка может быть вызвана следующими причинами:

· уравнение не имеет корней;

· корни уравнения расположены далеко от начального приближения;

· выражение F(x) имеет разрывы между начальным приближением и корнем;

· выражение имеет комплексный корень, но начальное приближение было вещественным и наоборот.

Для изменения точности, с которой функция Root ищет корень, нужно изменить значение системной переменной TOL. Например, просле задания в документе оператора TOL:=0.00001 точность вычисления корня станет равной 0.00001.

Для нахождения корней полиномиального уравнения вида

используется функция Polyroots.

В отличие от функции Root, Polyroots не требует начального приближения и вычисляет сразу все корни, как вещественные, так и комплексные.

Polyroots(v),

Где V – вектор коэффициентов полинома длины N+1, n – степень полинома. Вектор V формируется следующим образом: в первый его элемент заносится значение коэффициента полинома при х0, т. е. V0, во второй элемент - значение коэффициента полинома при х1, т. е. V1 и т. д. Таким образом, вектор заполняется коэффициентами перед степенями полинома справа налево.

Функция вычисляет вектор длины N, состоящий из корней полинома.

На рисунке 2.6.1 приведены примеры вычисления корней уравнений с помощью функций Root и Polyroots.



Рисунок 2.6.1 – Примеры решения уравнений

MathCAD дает возможность решать системы уравнений и неравенств.

Наиболее распространенным методом решения уравнений в Mathcad является блочный метод. Для решения системы этим методом необходимо выполнить следующее:

A) задать начальное приближение для всех неизвестных, входящих в систему уравнений;

Б) задать ключевое слово Given, которое указывает, что далее следует система уравнений;

Г) ввести любое выражение, которое включает функцию Find.

Решающим блоком называется часть документа, расположенная между ключевыми словами Given и Find.

После набора решающего блока Mathcad возвращает точное решение уравнения или системы уравнений.

Обратиться к функции Find можно несколькими способами:

Find(X1, X2,…) = - корень или корни уравнения вычисляются и выводятся в окно документа.

X := Find(x1, x2,…) – формируется переменная или вектор, содержащий вычисленные значения корней.

Приближенное решение уравнения или системы можно получить с помощью функции Minerr.

Примеры решения систем уравнений с помощью решающего блока приведены на рисунке 2.6.2.

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

Матричный метод решения системы линейных уравнений реализован в функции Lsolve. Общий вид функции:

Lsolve(а, B)

Где А – матрица коэффициентов перед неизвестными, B – вектор свободных членов.

Матричный метод можно реализовать и с помощью обратной матрицы. Примеры решения систем линейных уравнений с помощью матричного метода приведены на рисунке 2.6.2.



Рисунок 2.6.2 – Примеры решения систем уравнений

Из рисунка 6.2 видно, что при решении системы уравнений блочным методом можно получить численные значения корней системы уравнений, без присваивания и с присваиванием их в переменные x1 и x2. При решении системы уравнений матричным методом продемонстрированы два варианта: с использованием стандартной функции Lsolve и обратной матрицы.

Итак, мы с вами продолжаем изучать MathCAD — самую дружелюбную к пользователю математическую среду из существующих в настоящее время. Пока мы занимались тем, что изучали способы решения уравнений — трансцендентных и алгебраических, и теперь вы знаете, как их решать с помощью MathCAD'а в общем виде или численно. Как вы могли убедиться из материала третьей части, численное решение уравнений — не такая простая задача, как может показаться с первого взгляда, однако и не такая сложная, если построить график уравнения. Но просто уравнения — это, согласитесь, довольно скучно, потому что в жизни, как правило, уравнения по одиночке не встречаются. Поэтому сегодня мы перейдем к более сложной, а значит, и более интересной, теме — попробуем решать системы уравнений. Я сказал "попробуем"? Простите, пожалуйста — я, наверное, оговорился. Конечно, не попробуем, а научимся — потому что благодаря MathCAD'у можно быть уверенным в том, что подобные попытки увенчаются успехом. Готовы? Ну что же, тогда вперед.

Решение систем с помощью функции lsolve

Системы уравнений многие просто-таки ненавидят еще со школы — прямо как русскую литературу. Что ж, школа может привить отвращение ко многим вещам, которые без нее могли бы оказаться гораздо более интересными. Как и любая обязаловка, она убивает романтику изучения чего-то нового. Но теперь, когда вас никто не заставляет изучать решение систем уравнений, вы можете взглянуть на них с совершенно новой для себя стороны. И поможет в этом, конечно же, MathCAD.

Для обозначения систем линейных алгебраических уравнений у математиков есть своя аббревиатура — СЛАУ. Ее используют намного чаще, чем полное название, что, в общем-то, вполне естественно — эта аббревиатура и произносима легко, и не перекрывается с другими математическими аббревиатурами. Так что и мы с вами тоже будем ее применять. СЛАУ называется система уравнений следующего вида:
k11x1 + k12x2 + … + k1nxn + l1 = 0
k12x1 + k22x2 + … + k2nxn + l2 = 0

kn1x1 + kn2x2 + … + knnxn + ln = 0

Здесь kij и li — какие-то числовые константы, называемые, соответственно, коэффициентами и свободными членами уравнений, а xj — переменные. Такие уравнения обычно записывают также с помощью матриц:
KX + L = 0

Здесь K — матрица (kij), составленная из коэффициентов при переменных величинах, где i — номер строки матрицы, а j — номер столбца. X и L — это, соответственно, векторы, составленные из переменных и свободных членов. Собственно, при решении СЛАУ с помощью MathCAD мы будем записывать СЛАУ именно в таком виде, потому что решение СЛАУ в MathCAD реализовано именно с помощью матричных методов. Возможно, вы что-нибудь слышали о методах решения СЛАУ Гаусса и Крамера, но даже если и нет, ничего страшного в этом нет — MathCAD тем и удобен, что с его помощью можно решать уравнения, не задумываясь над тем, каким именно алгоритмом пользуется математическая система при их решении.

Итак, для начала давайте посмотрим, каким именно образом в MathCAD'е нужно задавать матрицы. Для этого на панели инструментов Matrix нажмите кнопку Matrix or Vector, а в появившемся окне задайте количество столбцов и строк в матрице. Мы с вами попробуем решать для начала СЛАУ из четырех уравнений, и, соответственно, нам нужна будет матрица размером четыре на четыре элемента. Только, поскольку мы будем присваивать значение, записанное в этой матрице, переменной, обозначающей матрицу коэффициентов, то сначала лучше записать "K_: (max-width: 440px) 100vw, 545px" src=kg81602b.jpg>

Ну, а после знака равенства MathCAD нам уже нарисует результат.

С помощью функции lsolve можно получать и аналитические решения СЛАУ. Давайте попробуем заменить одно из чисел в матрице коэффициентов на букву — например, "а". Функция lsolve сразу выдаст ошибку, но не нужно этого пугаться — нужно просто заменить знак равенства на стрелку (ее можно найти на панели инструментов Symbolic или же записать комбинацией клавиш Ctrl + .). Дело в том, что знак "равно" в MathCAD'е используется для численных вычислений, а стрелка — для символьных, то есть при решении систем уравнений в общем виде нужно применять именно стрелку.

Решение с помощью solve

В общем-то, решать такую систему можно было бы и используя уже знакомый нам с вами оператор solve. Для этого достаточно записать уравнения в виде матрицы, а затем применить к ней оператор solve точно так же, как если бы мы с вами решали не целую систему, а всего лишь одно- единственное уравнение. "Записать уравнения в виде матрицы" в данном случае означает не запись матричного уравнения KX + L = 0, а просто запись в каждой строке одностолбцовой матрицы (т.е. вектор-столбца) одного уравнения из системы. Напомню на всякий случай, что оператор solve находится на панели Symbolic, а для записи знака равенства нужно использовать не просто клавишу " (max-width: 440px) 100vw, 545px" src=kg81602d.jpg>

Решение СЛАУ с помощью solve поначалу кажется не таким уж привлекательным, однако, по сути, оно ничем не отличается от использования функции lsolve. Например, если вы замените какой-нибудь из числовых коэффициентов в одном из уравнений на букву, чтобы получить аналитическое решение, solve справится с этим точно так же быстро и хорошо, как и функция lsolve. Так что, в общем-то, выбор при решении СЛАУ в пользу функции lsolve или в пользу оператора solve — дело скорее вкуса, причем вкуса в плане записи самой системы уравнений, а не оператора или функции, у которых, в общем-то, даже названия очень и очень похожи. Пожалуй, один из немногих случаев, когда все же предпочтительнее использовать именно оператор solve — это когда уравнений у нас больше, чем неизвестных, содержащихся в них. В этом случае матрица системы будет выглядеть не так, как хотелось бы, а вот с solve все будет нормально. Даже если решение найти не удастся, solve любезно об этом сообщит. Аналогичным образом можно попытаться решить СЛАУ и в том случае, когда соотношение между уравнениями и неизвестными, напротив, не в пользу уравнений (правда, как говорится, не с разгромным счетом, а то решение заведомо найти не удастся). Но даже в случае, когда мы пытаемся решить систему с тремя уравнениями и четырьмя неизвестными, оставив после solve только две из них, у нас это далеко не всегда может получиться — в этом вы можете убедиться воочию.

Численное решение СЛАУ

Что ж, давайте теперь посмотрим, как решать СЛАУ с использованием численных методов их решения. Это тоже вовсе не так сложно, как может с самого начала показаться, поскольку MathCAD имеет в своем арсенале ряд средств и на этот случай. Как и в случае с одиночными уравнениями, сначала нужно задать начальное приближение (на то оно и начальное, чтобы задавать его сначала). Только, поскольку переменная у нас теперь не одна, а их несколько, то и начальное приближение необходимо будет задать для каждой из них. В тех случаях, когда переменных в СЛАУ много, это будет совсем не просто. После того, как вы задали начальные приближения для каждой из нужных переменных, запишите сами уравнения — только сделайте это так, чтобы их и начальные приближения разделяло специальное слово "Given" (оно, конечно же, в рабочей области MathCAD'а должно быть записано безо всяких кавычек). После того, как вы записали начальные приближения, слово "Given" и сами уравнения, можно смело воспользоваться функцией find, которая найдет точные значения решений системы. Поскольку в СЛАУ каждая из переменных в итоге будет иметь только одно значение, над подбором максимально точного начального приближения можно особо и не страдать — в конечном итоге в случае СЛАУ оно скорее просто формальность, нежели реальная необходимость, и, как вы сами имели возможность убедиться, есть методы, которые прекрасно решают СЛАУ и без него.

Теперь, когда вы знаете уже столько разных способов решения СЛАУ, вполне логично было бы задаться вопросом: а какой из них лучше при прочих равных условиях? В литературе, как правило, рекомендуется использовать функции lsolve или find, дающие точность до 15 знаков после запятой — однако на самом деле, учитывая тот факт, что такая точность бывает нужна не так уж часто, данным советом можно пренебречь, потому что точность решения системы намного больше зависит от нее самой, нежели от используемого метода ее решения в MathCAD'е. Так что используйте пока что смело тот, который показался вам наиболее удобным, а о погрешностях при решении СЛАУ мы с вами еще поговорим, но только, пожалуй, немного попозже.

SF, [email protected]

Компьютерная газета. Статья была опубликована в номере 16 за 2008 год в рубрике soft

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

Матрицей называется прямоугольная таблица, элементы которой принадлежат некоторому множеству.

Дана система уравнений:


Составляем матрицы А и В. А - матрица данной системы уравнений. В - матрица: столбец для данной системы уравнений.


По правилам матричного исчисления получаем уравнение: А * х = В. х - матрица: столбец из неизвестных.

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


Решение системы уравнений с помощью функции Given .. Find в среде MathCAD

При решении систем не линейных уравнений используется специальный вычислительный блок, открываемый служебным словом-директивой Given.

Дана система уравнений:


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


Записываем служебное слово-директиву Given и задаем уравнения системы с помощью жирного знака равенства между левой и правой частями каждого уравнения.


Записываем функцию Find. Она возвращает значение одной или ряда переменных для точного решения. Функция Find используется, если решение реально существует.

Таким образом х1 = -0.723;


Решение системы уравнений с помощью функции Given .. Minerr в среде MathCAD.

Дана система уравнений


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


Записываем служебное слово-директиву Given и задаем уравнения системы с помощью жирного знака равенства:

Записываем функцию Minerr. Она возвращает значение одной или ряда переменных для приблизительного решения. Функция Minerr пытается найти максимально приближение даже к несуществующему решению путем минимизации средней квадратичной погрешности решения.

Таким образом х1 = -0.723;


База данных -- это набор сведений, относящихся к определенной теме или задаче. БД является информационной моделью предметной области. Обращение к БД осуществляется с помощью систем управления базами данных (СУБД). СУБД Access является системой управления базами данных реляционного типа. Данные хранятся в такой базе в виде таблиц. С каждой таблицей могут быть связаны индексы (ключи), задающие нужные пользователю порядки на множестве строк. Таблицы могут иметь однотипные поля (столбцы), и это позволяет устанавливать между ними связи, выполнять операции реляционной алгебры.

Базы данных, как правило, обладают следующими признаками:

БД содержит некоторое множество данных, необходимых для решения конкретных задач многих пользователей (в том числе как реальных, так и потенциальных) или удовлетворения соответствующих информационных потребностей;

данные или информационные элементы в БД определенным образом структурированы и связаны между собой, при этом структура, состав данных и их содержание в БД не зависят от особенностей прикладных программ, используемых для управления БД;

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

Основные функции СУБД следующие:

Определение данных - определить, какая именно информация будет храниться в базе данных, задать свойства данных, их тип, а также указать, как эти данные связаны между собой.

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

Управление данными - можно указать, кому разрешено знакомиться с данными, корректировать их или добавлять новую информацию.

Проектируя базу данных "Расписание автобусов", разбиваем ее на две связные таблицы. В первой таблице содержатся следующие поля: пункт назначения; время отправления; время в пути; количество посадочных мест. А во второй: время отправления; расстояние до пункта назначения.

При создании базы данных следует соблюдать следующие принцыпы:

· В каждой таблице не должно быть повторяющихся полей;

· В каждой таблице олжен быть уникальный идентификатор - ключ;

· Каждому значению первичного ключа должна соответствоватьдостаточная информация о сущности или объекте таблицы.

Создадим таблицы в режиме конструктора:

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

Читайте также: