Содержание
БлогNot. Методы решения нелинейных уравнений в MathCAD
Методы решения нелинейных уравнений в MathCAD
Реализуем для некоторого уравнения 4 наиболее популярных численных метода для решения нелинейных уравнений. При этом мы стремимся именно запрограммировать методы, а не воспользоваться встроенным инструментом Given. Find или функциями root , polyroot . Об этих способах решения почитайте, например, здесь.
Определим функцию уравнения f(x)=0 как функцию пользователя, интервал поиска решения зададим переменными a и b . Найти этот интервал можно, например, табличным или графическим методом:
Начальный интервал [a,b] должен быть таким, чтобы значения f(a) и f(b) имели противоположные знаки. Если искомый корень уравнения окажется единственным на интервале, то совсем хорошо 🙂
Логика метода дихотомии (возможно, более правильные названия — метод бисекции, метод половинного деления) довольно проста: если на концах выбранного интервала [a,b] знаки функции совпадают (произведение f(a)*f(b)>0 ), то вернуть результат "недопустимый интервал" (вернём в этом случае ответ "бесконечность"), в противном случае до тех пор, пока длина интервала не станет меньше заданной погрешности ε , будем находить середину текущего интервала c=(a+b)/2 , считать в ней значение функции и проверять, какую из половин отрезка [a,c] или [c,b] нужно отбросить для выполнения следующего шага — а именно, ту, в которой знак f(c) совпадает со знаком функции на левой или правой границе интервала (в листинге — проверка f(a)*f(c)>0 ). Для большей точности вернём середину "последнего" интервала [a,b] , меньшего ε :
В методе простой итерации исходное уравнение f(x)=0 представляется в эквивалентном виде φ(x)=x (что, вообще говоря, можно сделать бесконечным числом способов), а затем шаг метода выполняется по формуле xk+1 = φ(xk) , пока не будет достигнута заданная точность |xk+1-xk| . Если выбрать φ(x)=x-c*f(x) , то константу c целесообразнее всего искать методом релаксации, для которого c=2/(M+m) , где M — максимальное из значений первой производной на концах отрезка или в находящихся на нём точках перегиба функции (точках, где f»(x)=0 ), а m — минимальное из таких значений. Вот соответствующий расчёт в MathCAD:
Если заданной сходимости нет в течение 10000 шагов, в подпрограмме предусмотрен аварийный выход.
Численный метод Ньютона решения нелинейного уравнения основан на формуле вида xk+1 = xk-f(xk)/f'(xk) , обеспечивающей наилучшую сходимость, но требующей дополнительного вычисления производной на каждом шаге. Так как производные для MathCAD — не проблема, можно всё сделать "в лоб":
Видно, что сходимость метода — на 2 порядка выше (погрешность найденного решения
Наконец, существует метод хорд, в котором кривая f(x) заменяется прямой линией (хордой), стягивающей точки (a, f(a)) и (b, f(b)) . Формула этого метода зависит от знака выражения f(a)*f»(a) , то есть, имеет два варианта:
Если f(a)*f»(a)>0 , то x=b , xk+1=a-(f(a)(xk-a))/(f(xk)-f(a))
Если f(a)*f»(a) , то x=a , xk+1=xk-(f(xk)*(b-xk))/(f(b)-f(xk))
Вот примерная реализация на MathCAD, как и в предыдущих двух случаях, контролируется максимальное число итераций, равное 10000:
Видно, что сходимость метода оказалась в нашем случае не столь высока.
Подсчитать, сколько шагов какому методу потребовалось, можете сами, немного поменяв выдачу подпрограмм.
Скачать этот пример в формате .xmcd (107 Кб)
05.09.2013, 15:07; рейтинг: 72225
Решение нелинейных уравнений
Вычисление корней численными методами включает два основных этапа:
· уточнение корней до заданной точности.
Рассмотрим эти два этапа подробно.
Отделение корней нелинейного уравнения
Учитывая легкость построения графиков функций в MathCAD , в дальнейшем будет использоваться графический метод отделения корней.
Пример. Дано алгебраическое уравнение
.
Определить интервалы локализации корней этого уравнения.
Пример. Дано алгебраическое уравнение
.
Определить интервалы локализации корней этого уравнения.
На рисунке приведен график функции , построенный в MathCAD . Видно, что в качестве интервала изоляции можно принять интервал . Однако уравнение имеет три корня. Следовательно, можно сделать вывод о наличии еще двух комплексных корней. ¨
Уточнение корней нелинейного уравнения
Для уточнения корня используются специальные вычислительные методы такие, как метод деления отрезка пополам, метод хорд, метод касательных (метод Ньютона) и многие другие.
Функция root . В MathCAD для уточнения корней любого нелинейного уравнения (не обязательно только алгебраического) введена функция root , которая может иметь два или четыре аргумента, т.е. или , где – имя функции или арифметическое выражение, соответствующее решаемому нелинейному уравнению, – скалярная переменная, относительно которой решается уравнение, – границы интервала локализации корня.
Пример. Используя функцию , найти все три корня уравнения , включая и два комплексных.
Заметим, что для вычисления всех трех корней использовался прием понижения порядка алгебраического уравнения, рассмотренный в п. 8.1.1. ¨
Функция root с двумя аргументами требует задания (до обращения к функции) переменной начального значения корня из интервала локализации.
Пример 8.1.5. Используя функцию root , вычислить изменения корня нелинейного уравнения при изменении коэффициента а от 1 до 10 с шагом 1.
Функция polyroots . Для вычисления всех корней алгебраического уравнения порядка (не выше 5) рекомендуется использовать функцию polyroots . Обращение к этой функции имеет вид polyroots (v) , где v – вектор, состоящий из n +1 проекций, равных коэффициентам алгебраического уравнения, т.е. . Эта функция не требует проведения процедуры локализации корней.
Пример. Используя функцию polyroots , найти все три корня уравнения , включая и два комплексных
Блок Given . При уточнении корня нелинейного уравнения можно использовать специальный вычислительный блок Given , имеющий следующую структуру:
Решаемое уравнение задается в виде равенства, в котором используется «жирный» знак равно, вводимый с палитры Логический .
Ограничения содержат равенства или неравенства, которым должен удовлетворять искомый корень.
Функция Find уточняет корень уравнения, вызов этой функции имеет вид Find ( x ), где x – переменная, по которой уточняется корень. Если корня уравнения на заданном интервале не существует, то следует вызвать функцию Minerr ( x ), которая возвращает приближенное значение корня.
Для выбора алгоритма уточнения корня необходимо щелкнуть правой кнопкой мыши на имени функции Find ( x ) и в появившемся контекстном меню (см. рисунок) выбрать подходящий алгоритм.
Аналогично можно задать алгоритм решения и для функции Minerr ( x ).
Использование численных методов в функциях Find ( x ), Minerr ( x ) требует перед блоком Given задать начальные значения переменным, по которым осуществляется поиск корней уравнения.
Пример. Используя блок Given , вычислите корень уравнения в интервале отделения .
Решение систем уравнений
В зависимости от того, какие функции входят в систему уравнений, можно выделить два класса систем:
· алгебраические системы уравнений;
· трансцендентные системы уравнений.
Среди алгебраических систем уравнений особое место занимают системы линейных алгебраических уравнений (СЛАУ).
Системы линейных алгебраических уравнений
Системой линейных алгебраических уравнений (СЛАУ) называется система вида:
В матричном виде систему можно записать как
,
где – матрица размерности , – вектор с проекциями.
Для вычисления решения СЛАУ следует использовать функцию lsolve , обращение к которой имеет вид: lsolve (А, b ), где А – матрица системы, – вектор правой части.
Решение систем нелинейных уравнений
MathCAD дает возможность находить решение системы уравнений численными методами, при этом максимальное число уравнений в MathCAD 2001 i доведено до 200.
Для решения системы уравнений необходимо выполнить следующие этапы.
Задание начального приближения для всех неизвестных, входящих в систему уравнений. При небольшом числе неизвестных этот этап можно выполнить графически, как показано в примере.
Пример. Дана система уравнений:
Определить начальные приближения для решений этой системы.
Видно, что система имеет два решения: для первого решения в качестве начального приближения может быть принята точка (-2, 2), а для второго решения – точка (5, 20). ¨
Вычисление решения системы уравнений с заданной точностью . Для этого используется уже известный вычислительный блок Given .
Функция Find вычисляет решение системы уравнений с заданной точностью, и вызов этой функции имеет вид Find ( x ), где x – список переменных, по которым ищется решение. Начальные значения этим переменным задаются в блоке . Число аргументов функции должно быть равно числу неизвестных.
Следующие выражения недопустимы внутри блока решения:
· ограничения со знаком ¹ ;
· дискретная переменная или выражения, содержащие дискретную переменную в любой форме;
· блоки решения уравнений не могут быть вложены друг в друга, каждый блок может иметь только одно ключевое слово Given и имя функции Find (или Minerr ).
Пример. Используя блок Given , вычислить все решения системы предыдущего примера. Выполнить проверку найденных решений.
Пример. Используя функцию , вычислите решение системы уравнений
Многие уравнения и системы из них не имеют аналитического решения. Однако они могут решаться численными методами с заданной погрешностью (не более значения, заданного системной переменной TOL). Для простых уравнений вида решение находится с помощью функции:root(Выражение Имя переменной). Функция реализует вычисления итерационным методом, причем можно задать начальное значение переменой, это полезно, если возможны несколько решений и тогда выбор решения определяется выбором начального значения переменой. На рисунке 40 приведен пример применения функции root для вычисления корня уравнения.
Рис. 40.Пример решения уравнения с использованием функцииroot
Применяя функцию root надо помнить, что корень функции – это не то значение аргумента, при котором выражение равно нулю, а то значение аргумента, при котором значение выражения не превышает значения системной переменой TOL. Чтобы функция сработал правильно, необходимо переменной TOL присвоить новое значение, например 10 -7 , заменив им предопределенное значение (10 -3 ).
Для поиска корней полинома степени MathCAD содержит функцию: polyroots(V). Она возвращает вектор корней многочлена (полинома) степени n, коэффициенты которого находятся в векторе V, имеющим длину, равную n+1. Вектор коэффициентов заполняется в обратном порядке. Включая все коэффициенты многочлена, даже если они равны нулю.
При решении систем нелинейных уравнений используется специальный вычислительный блок, открываемый служебным словом Given и имеющий следующую структуру:
Между функциями find и miner существует принципиальное различие. Функция find используется, когда решение реально существует (хотя и не является аналитическим), а функция miner пытается найти максимально приближение даже к несуществующему решению путем минимизации среднеквадратической погрешности решения.
Рассмотрим пример решения системы нелинейных уравнений с помощью функции find.
Первое решение найдем, приняв ограничение x 0 (рис. 41 б). Следует отметить, что для решения системы уравнений указали начальные значения x и y (т.е. x:=-1 y:=1 )
Рис. 41.Пример решения системы нелинейных уравнений:а – первая часть решения при условии x>0; б – вторая часть решения при условии x
Рис. 42.Пример построения графика:а – задание функции, ее аргументов и вызов шаблона для построения графика, б – иллюстрация результата
На одном графике можно построить до 16 зависимостей. Для этого через запятую в место заполнения для наименования оси ординат (ось у) вносят наименования функций (рис. 43).
Рис. 43.Пример построения нескольких зависимостей на одном рисунке