Elettracompany.com

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Метод простой итерации matlab

Программная реализация метода простой итерации для решения СЛАУ в пакете MATLAB

Входные параметры: U – расширенная матрица коэффициентов, eps – требуемая точность решения.

Function res = Jakobi(U,eps);

error (‘Неверно задана система’);

%приведение системы к диагонально доминирующему виду

error(‘Система не совместна’);

%сумма по строкам

%первая норма по строкам

%сумма по столбцам

if k 1) && (max_norm2>1) && (max_norm3>1))

error(‘Введенная матрица не является диагонально преобладающей’)

%нахождение суммы для Х1(i)

sum = sum + ( A(i,j) * X0(j) );

while ( abs( X0(i) — X1(i) ) > eps )

%нахождение суммы для Х1(i)

sum = sum + ( A(i,j) * X0(j) );

%вывод вектора решений

%вывод числа итераций для выполненияусловия точности

ВСТРОЕННЫЕ ФУНКЦИИ ПАКЕТОВ MATHCAD И MATLAB

ДЛЯ ПРИБЛИЖЕННОГО РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ

АЛГЕБРАИЧЕСКИХ УРАВНЕНИЙ

Пакет MATHCAD

Решение систем линейных уравнений – довольно распространенная задача. Для системы линейных уравнений, заданной в матричном виде AX=B, вектор решения можно получить из очевидного выражения X=A-1B, или, например, из решения системы уравнений с проверкой на невырожденность матрицы:X:=if(|A|,A -1 B,0).

Следует обратить внимание на то, что пакет содержит и встроенную функцию решения линейных систем lsolve(A,B), где А– матрица коэффициентов, а В – вектор свободных членов. Пример использования предложенных методов показан на рис. 5.1.

Рис. 5.1. Примеры решения системы

Для решения систем уравнений, систем неравенств, смешанных систем служат решающие блоки. Структура решающего блока:

начало | Given

тело | несколько конструкций вида АВ1 оп АВ2

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

конец | FIND (список) или MINERR (список).

Список – это перечень переменных, которые необходимо найти.

С помощью FIND ищут точное решение; если оно отсутствует, то возникает ошибка. Посредством MINERR всегда будет найдено решение, минимизирующее невязку ограничений. Переменная ERR– величина ошибки.

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

Given

find (x,y) =

Для последующего использования результатов необходимо так организовать конец:

В теле решающего блока нельзя строить графики, выполнять вычисления.

Итерации производятся до тех пор, пока ôERRô£ TOL. Если встречается седловая точка и не известно, куда направлен градиент, то выдается сообщение not converging (не решаемо). Количество итераций ограничено. Возможно сообщение об ошибке вида did not find solution (не найдено решение).

При возникновении таких ошибок можно:

– изменить точность – TOL;

– заменить начальные условия;

– заменить find на minerr и получить приближенное решение.

Однако при использовании функций findи minerrнужно проявлять осторожность и обязательно предусматривать проверку решений, т.к. нередки случаи, когда решение может оказаться ошибочным.

Для получения другого решения можно поменять начальные условия, для уточнения – уменьшить TOL.

Пакет MATLAB

Рассмотрим две системы линейных уравнений: АХ=В и ХА=В. В MATLAB такие системы решаются без вычисления обратной матрицы. Два типа матричного деления / и используются для этих двух ситуаций, когда неизвестная матрица стоит слева или справа от матрицы коэффициентов:

Х=АВ соответствует решению АХ=В;

Х=В/А соответствует решению ХА = В.

При этом должны выполняться условия соответствия размерностей матриц X, А, В. Напомним, что для варианта Х=АВ матрица X должна иметь то же количество столбцов, что и матрица В, и то же число строк, сколько столбцов у матрицы А. Для Х=В/А эти условия обратны.

Алгебраические свойства оператора / можно вывести из соотношения(В/А)’ = (А’В’).

Матрица не обязательно должна быть квадратной, она может быть размером mхn. При этом существуют следующие варианты:

· m = n – квадратная система, возможно нахождение точного решения;

· m > n – переопределенная система, решение ищется с помощью метода наименьших квадратов;

· m n и ранг матрицы равен n, то каждое из трех следующих выражений вычисляет X по методу наименьших квадратов:

Х=АВ

Х=рinv(А)*В

Х=inv(А’*А)*А’*В

В противном случае решение Xпо методу наименьших квадратов не единственно и существует множество векторов, минимизирующих norm(A*X-B).Решение, вычисленное с помощью Х=АВ,– базовое решение, имеющее не больше r ненулевых компонент: r=rank(A). Решение, вычисленное с помощью Х=рinv(А)*В,– это решение с минимальной нормой X.

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

Технология решения систем нелинейных уравнений в среде MS Excel рассматривалась в статье. В ней рассмотрена методы приближенного решения графическим методом и уточненного решения с помощью инструмента Поиск решения. Рассмотрим эти методы решения в Matlab.

Приближенное решение систем нелинейных уравнений графическим методом в Matlab

Пример . Найти графически приближенное решение системы

в диапазоне значений х [0,2:3].
Решение.

— обозначим х 2 =у;
— теперь представим приведенные уравнения в виде системы функций

Читать еще:  Matlab график по точкам

Для решения задачи воспользуемся возможностью Matlab для построения в одном окне графиков нескольких функций. Для этой цели используем функцию plot со следующей синтаксической конструкцией:

где xl, x2, xЗ,.„ — векторы аргументов функций (в нашем случае все они — х), a f1, f2, f3. —векторы значений функций, графики которых строятся в одном окне (в нашем случае они f1 и f2).
Заметим, что в отличие от Excel мы можем взять очень маленький шаг для вычисления узловых точек, так как для построения графика нам не надо создавать таблицу соответствия значения функции и аргумента.
Для построения графиков указанных функций нужно записать командном окне код инструкции:

>> x=0.2:0.01:3; f1=1-2.*x;f2=log(x);plot(x,f1,x,f2);grid on .

В результате выполнения инструкции будут построены графики (рис.1).

Значение аргумента x при котором линии полученных графиков функций пересекаются примерно равно значению 0,7, а значение функций примерно равно -0,4. Таким образом примерное решение системы получено.

Уточнение корней системы нелинейных уравнений в системе Matlab

В Matlab есть оператор fsolve , который позволяет решить систему нелинейных уравнений. Эта функция принимает вектор приближений и возвращает вектор значений функции.

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

с помощью fsolve .

Решение .
Создадим М-файл с именем funsist.m и создадим функцию введя код (рис. 2):

В качестве значений вектора приближений, ориентируясь на ранее полученное графическое решение, возьмем вектор [0.7, -0.4],
В командном окне Matlab введем инструкцию
>> [xr, fr, ex] = fsolve(@funsist,[0.7, -0.4],optimset(‘TolX’,1.0e-2))

В этой инструкции выходными возвращаемыми значениями являются:
xr — вектор решений;
fr — это значения функций, указывающие на сколько значения функций близки к нулю, при найденном решении (т.е. точность решения);
ex- параметр сходимости, если он равен 1, то решение сошлось.

В результате выполнения инструкции получим результат решения (рис.3):
xr = 0,6874 -0,3748;
fr = 1.0e-008 — точность до минус восьмого порядка;
ex=1 — сходимость есть

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

Технология решения нелинейных уравнений в среде MatLab

В математическом пакете MatLab имеются как программные средства для реализации алгоритмов уточнения корней уравнений, приведенных в п.6.2.2, так и встроенные функции для численного и аналитического вычисления корней уравнений.

Рассмотрим программные средства MatLabна примерах.

Пример 6.2.4-10. Локализовать корни уравнения f(x)=x 3 –cos(x)+1 средствами пакета MatLab.

Решение алгебраических и трансцендентных уравнений в среде MatLAB проще реализовать с помощью встроенных функций: solve(), fzero(), roors().

Для нахождения вещественных корней уравнений вида f(х)=0 используется функция fzero(). Алго­ритм, реализованный этой функцией, представляет собой комбинацию хорошо известного метода дихотомии (деления пополам), метода секущих и метода обрат­ной квадратичной интерполяции. В простейшем варианте обращения кроме указателя на функцию, корень которой ищется, задается окрестность х0, с которой начинается поиск: х = fzero(f, x0).

Аргументf может быть задан одним из способов:

· как формула с неизвестным х, заключенная в апострофы;

· как имя m-файла (в апострофах и без расширения m);

· как указатель на функцию (например, @f_name);

· как указатель на анонимную функцию (например, f_handie).

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

Аргумент х0 может быть задан одним из двух способов:

· как вектор [a;b], представляющий интервал (а — x + sin(x) для локализации корня.

Из графика видно, что один из корней находится на интервале [3;4]. И этой информацией естественно воспользоваться при обращении к функ­ции fzero( ):

Вместо явного задания формулы для функции f мы могли бы объявить соответствующую функцию, запомнив ее в виде автономного m-файла или включив ее в качестве подфункции в файл нашей программы.

Если мы хотим получить не только значение корня, но и узнать значение функции в найденной точке, то к функции fzero( ) можно обратиться с двумя выходными параметрами.

В ряде задач такая точность может оказаться излишней. MatLab предо­ставляет пользователю возможность формировать различные условия прекращения итерационного процесса — по точности вычисления координаты х, по модулю значения функции f(), по количеству обращений к функции f( ) и т. д.

В некоторых случаях применение функции fzero() может дать парадоксаль­ные результаты.

Пример 6.2.4-12. Найти решения tg(x) = 0 на интервале [1;2].

Якобы «корень», соответствующий приближенному значению /2, на самом деле является точкой разрыва, при переходе через которую функция меняет знак. Выведенное значение функции в найденной точке убеждает нас в том, что найден не корень.

Функцияfzero() может возвратить еще два выходных параметра.

Положительное значение e_fiag (обычно, это 1) означает, что удалось най­ти интервал, на концах которого функция f( ) меняет знак (пример с tg(x) не должен притупить вашу бдительность). Если такой интервал не обнару­жен, то e_fiag=-1. Структура inform содержит три поля с именами iterations, funcCount и algorithm. В первом из них находится количество итераций, выполненных при поиске корня, во втором – количество обра­щений к функции f( ), в третьем – наименование алгоритма, использован­ного для нахождения корня.

Читать еще:  Аспекты защиты информации

Решение СЛАУ методом простой итерации

Назначение сервиса . Онлайн-калькулятор предназначен для решения СЛАУ методом простой итерации в онлайн режиме (см. пример решения). Для проверки решения генерируется шаблон в Excel .

  • Решение онлайн
  • Видеоинструкция

Рассмотрим достаточные условия сходимости итерационной последовательности n>.
Практически, для применения метода итерации систему линейных уравнений удобно «погрузить» в одну из трёх следующих метрик:
(3.4)
Для того, чтобы отображение F, заданное в метрическом пространстве соотношениями (3.2), было сжимающим, достаточно выполнение одного из следующих условий:
а) в пространстве с метрикой ρ1: , т. е. максимальная из сумм модулей коэффициентов в правой части системы (3.2), взятых по строкам, должна быть меньше единицы.
б) в пространстве с метрикой ρ2: , т. е. максимальная из сумм модулей коэффициентов в правой части системы (3.2), взятых по столбцам, должна быть меньше единицы.
в) в пространстве с метрикой ρ3: , т. е. сумма квадратов при неизвестных в правой части системы (3.2) должна быть меньше единицы

Пример . Вычислить два приближения методом простой итерации. Оценить погрешность второго приближения. В качестве начального приближения выбрать x 0 =(0; 0; 0).

Так как диагональные элементы системы являются преобладающими, то приведем систему к нормальному виду:

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

Получаем:
x 1 =(-1.9022; 0.4889; 2.1456), x 2 =(-1.1720; 0.6315; 1.2389).
Для оценки погрешности в метрике ρ1 вычисляем коэффициент μ
.
Вычисляем погрешность:

При большом числе неизвестных схема метода Гаусса, дающая точное решение, становится весьма сложной. В этом случае для решения СЛАУ иногда удобнее пользоваться методом простой итерации.

Метод итераций для системы уравнений в Excel

Для вычисления точности epsilon .
Итерация №1: =ABS(B7)-ABS(B6);=ABS(C7)-ABS(C6);=ABS(D7)-ABS(D6)
Итерация №2: =ABS(B8)-ABS(B7);=ABS(C8)-ABS(C7);=ABS(D8)-ABS(D7)
Скачать шаблон решения.

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

Восстановление простых линейных и итерационных функций средствами MATLAB

Рубрика: Технические науки

Дата публикации: 03.02.2017 2017-02-03

Статья просмотрена: 104 раза

Библиографическое описание:

Петров Е. Н., Петрова А. Ф. Восстановление простых линейных и итерационных функций средствами MATLAB // Молодой ученый. — 2017. — №5. — С. 52-55. — URL https://moluch.ru/archive/139/39180/ (дата обращения: 06.04.2020).

В данной статье рассматривается метод восстановления простых функций, сохраненных в виде p-файлов, средствами MATLAB. В качестве основного инструмента используется встроенный отладчик и функция dbstop. Применение описанных в статье методов позволяет восстановить утраченные исходные коды простых линейных и итерационных функций.

MATLAB позволяет сохранить откомпилированные М-функции в виде p-кода [1]. В таком случае в дальнейшем функция будет представлять собой “чёрный ящик”: пользователь будет иметь дело только с введёнными им данными и с возвращаемым результатом. Однако в ряде случаев может потребоваться обращение к исходному коду функции. Например, исходный код, необходимый для работы, может быть утерян, а производить какие-либо изменения в коде функции, сохранённой в виде p-файла, не представляется возможным. В статье будет рассмотрен способ восстановления исходного кода функции по p-коду средствами MATLAB, не подразумевающими попытки вскрыть шифр либо алгоритм кодирования, используемые в данной среде для хранения откомпилированных функций. Описанный в данной работе метод основан на анализе данных, получаемых в результате работы с p-файлом в среде MATLAB, подборе значений, выявлении зависимостей.

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

Прежде всего, необходимо выяснить, какие аргументы принимает функция, если это заранее не известно. Будем подавать аргументы разных типов, в т. ч. вектора, и наблюдать, как это влияет на результат [2].

Далее приступим собственно к восстановлению функции. Для решения поставленной задачи нам потребуется функция dbstop [3], позволяющая пошагово отлаживать функции. Использовать её можно следующим образом:

Как видно в примере, dbstop может иметь два аргумента, однако второй не является обязательным. Если не указать номер строки кода для точки останова, функция остановится на второй строке.

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

Error using dbstop

You cannot set a breakpoint past the start of the last expression in the file.

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

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

Читать еще:  Архитектура приложения php

Переход к следующей строке кода осуществляется нажатием на клавишу F10. В окне Workspace появляются имена и значения переменных, пример такого окна представлен на Рис. 1. Некоторые закономерности можно выявить уже на этом этапе, обратив внимание на имена переменных, порядок их появления и изменения. Так, например, можно выяснить, где в функции присутствует цикл, значения каких переменных в его теле изменяются. Также можно выявить переменные-флаги и участки кода, выполнение которых зависит от значений этих флагов. Таким образом, отладка при помощи dbstop позволит найти циклические и условные конструкции, если они есть. Целесообразно пробовать подавать на вход разные наборы аргументов, чтобы охватить как можно больше предусмотренных в целевой функции вариантов их обработки. Кроме того, на последнем шаге обнаруживается переменная, в которую записывается результат, возвращаемый функцией.

Выход из режима отладки либо переход к следующей точке останова осуществляется нажатием на клавишу F5.

Рис. 1. Вид окна MATLAB во время отладки

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

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

Проще всего обнаружить, какие переменные входят в искомую формулу в качестве слагаемых. Очевидно, изменение их значений влечёт за собой эквивалентное изменение значения целевой переменной. Аналогично находятся и свободные множители. Также несложно найти переменные, чья разность входит в формулу как множитель: если задать значения этих переменных равными, то целевая переменная всегда будет обращаться в ноль либо сохранит лишь часть, являющуюся свободным слагаемым. На этом же этапе выявляются и делители, если таковые имеются: деление на ноль даёт бесконечность (в MATLAB обозначается как Inf).

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

Целесообразно записывать значения искомого коэффициента от итерации к итерации. Чтобы найти такое значение, нужно результирующую переменную разделить на все известные сомножители (значения известных сомножителей должны быть актуальны для данного шага цикла, если это переменные). Далее будем искать зависимость между значениями искомого коэффициента. Если разность или отношение этих значений постоянны, то задача практически решена: остаётся выяснить, входят ли эти разности или отношения в формулу как значение некоторой переменной или представляют собой постоянное число. Проанализировать число можно при помощи вопросно-ответной системы WolframAlpha [4, 5], дающей возможность узнать, является ли данное число некоторой правильной дробью или степенью числа, результатом тригонометрической функции и т. д. Поэтому для большей точности необходимо использовать для вычислений формат записи чисел с большим количеством знаков — format long [6].

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

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

Подведём итог, представив описанный алгоритм в виде схемы на Рис. 2.

Рис. 2. Алгоритм восстановления функции

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

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector
×
×