Как изменить точность с которой функция root ищет корень в mathcad

REDMOND

Решение уравнение используя функцию root

Найдите решение одного уравнения с одним неизвестным используя функцию root
Для полинома g (х) выполните следующие действия: 1) с помощью команды символы — коэффициенты.

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

Развязать уравнение: 1) root 2)polyroots. Создать график
Уравнение: x^4-5x^3+7x-0.5=-1 на промежутке x є (-2;4) Помогите пожалуйста решить.

Найти корни используя функции root и polyroots
Найти корни заданного уравнения, используя функции root и polyroots. При поиске корней уравнения.

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

Для простейших уравнений вида f (x) =0 решение в MathCad находится с помощью функции root.

root (f (х1, x2, …), х1), где

f (х1, x2, …) — функция описывающая левую часть выражения вида f (x) =0. Выражение должно возвращать скалярные значения;

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

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

Приближенные значения корней (начальные приближения) могут быть:

Известны из физического смысла задачи;

Известны из решения аналогичной задачи при других исходных данных;

Найдены графическим способом.

Наиболее распространен графический способ определения начальных приближений. В этом случае достаточно построить график функции f (x) и отметить точки пересечения f (x) с осью Ох, или отметить на оси Ох отрезки, содержащие по одному корню. Построение графиков часто удается сильно упростить, заменив уравнение f (x) = 0 равносильным ему уравнением , где функции f1 (x) и f2 (x) — более простые, чем функция f (x). Тогда, построив графики функций у = f1 (x) и у = f2 (x), искомые корни получим как абсциссы точек пересечения этих графиков. Для решения уравнений вида его необходимо привести к виду .

Часто возникает необходимость многократного решения уравнения при изменении одного из параметров.

Отсутствие сходимости функции root

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

Уравнение не имеет корней.

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

Выражение имеет локальные max и min между начальным приближением и корнями.

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

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

Чтобы установить причину ошибки, исследуйте график f (x). Он поможет выяснить наличие корней уравнения f (x) = 0 и, если они есть, то определить приблизительно их значения. Чем точнее выбрано начальное приближение корня, тем быстрее будет root сходиться.

Рекомендации по использованию функции root

Для изменения точности, с которой функция root ищет корень, нужно изменить значение системной переменной TOL. Если значение TOL увеличивается, функция root будет сходиться быстрее, но ответ будет менее точен. Если значение TOL уменьшается, то функция root будет сходиться медленнее, но ответ будет более точен. Значение TOL можно определить непосредственно в рабочем документе, либо в меню Math — Option. Если два корня расположены близко друг от друга, следует уменьшить TOL, чтобы различить их.

Если функция f (x) имеет малый наклон около искомого корня, функция root (f (x), x) может сходиться к значению, отстоящему от корня достаточно далеко. В таких случаях для нахождения более точного значения корня необходимо уменьшить значение TOL. Другой вариант заключается в замене уравнения f (x) = 0 на g (x) = 0 где .

Для выражения f (x) с известным корнем (а) нахождение дополнительных корней f (x) эквивалентно поиску корней уравнения h (x) =f (x) / (x_a). Подобный прием полезен для нахождения корней, расположенных близко друг к другу. Проще искать корень выражения h (x), чем пробовать искать другой корень уравнения f (x) = 0, выбирая различные начальные приближения.

Нахождение корней полинома

Для нахождения корней выражения, вида используется функция polyroots. В отличие от функции root, polyroots не требует начального приближения и возвращает сразу все корни, как вещественные, так и комплексные. Общий вид polyroots (v), где v — вектор коэффициентов полинома длины , n — степень полинома. Возвращает вектор длины n, состоящий из корней полинома. Вектор v удобно создавать использую команду меню Symbolics — Polynomial Cofficients.

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

MathCAD дает возможность решать также и системы уравнений. Максимальное число уравнений и переменных равно 50. Результатом решения системы будет численное значение искомого корня.

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

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

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

Введите уравнения и неравенства в любом порядке. Используйте [Ctrl] + = либо палитру, для печати символа =. Между левыми и правыми частями неравенств может стоять любой из символов <, >, и ;

Введите любое выражение, которое включает функцию Find, например: .

Mathcad возвращает точное решение системы уравнений. Число аргументов должно быть равно числу неизвестных. Решающим блоком — называется часть документа, расположенная между ключевыми словами Given и Find. Внутри блока недопустимы следующие символы: , дискретные переменные или выражения, содержащие дискретный аргумент в любой форме, неравенства вида a<b<c, вложенные блоки решения уравнений.

Функция, Find может возвращать результат следующими способами:

a: = Find (x) — скаляр, var: = Find (var1, var2,…) — вектор. Удобно при использовании решения системы в другом месте рабочего документа.

f (a, b, c, …): = Find (x, y, z, …). Определить другую функцию с помощью Find. Эта конструкция удобна для многократного решения системы уравнений для различных значений некоторых параметров a, b, c,…, непосредственно входящих в систему уравнений;

f (x, y, z, …): = Find (x, y, z, …). Если необходимо найти решение при различных начальных приближениях, имеет смысл определить новую функцию.

Последние два способа можно комбинировать.

Отсутствие сходимости решения

Сообщение об ошибке (Решение не найдено) при решении уравнений появляется, когда:

система не имеет решения;

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

в процессе поиска решения последовательность приближений попала в точку локального минимума невязки. Для поиска искомого решения нужно задать различные начальные приближения;

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

Функция Minerr очень похожа на функцию Find (использует тот же алгоритм). Если в результате поиска не может быть получено дальнейшее уточнение текущего приближения к решению, Minerr возвращает это приближение. Функция Find в этом случае возвращает сообщение об ошибке. Правила использования функции Minerr такие же, как и функции Find. Общий вид Minerr Minerr (z1, z2,.). Число аргументов должно быть равно числу неизвестных. При использовании Minerr используется в блоке решения уравнений, необходимо всегда включать дополнительную проверку достоверности результатов.

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

Система n линейных алгебраических уравнений относительно n неизвестных х1, х2, …, хn может быть записана в матричном виде ах=b где:

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

Системы линейных уравнений удобно решать с помощью функции lsolve (а, b) — где а — матрица коэффициентов (не сингулярная), b — вектор свободных членов.

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

Для решения дифференциальных однородных дифференциальных уравнений (ОДУ) — с начальными условиями пакет Mathcad имеет ряд встроенных функций:

rkfixed — функция решения ОДУ и систем ОДУ методом Рунге-Кутта четвертого порядка с постоянным шагом;

Rkadapt — функция решения ОДУ и систем ОДУ методом Рунге-Кутта с переменным шагом;

Bulstoer — функция решения ОДУ и систем ОДУ методом — метод Булирша-Штёра если заранее известно, что решением является гладкая функция.

Рассмотрим подробнее каждую из этих функций:

rkfixed (y, x1, x2, p, D) — возвращает матрицу первый столбец которой содержит точки, в которых получено решение, а остальные столбцы — решения, первые n-1 производные. Функция возвращает матрицу, состоящую из 1+n строк. Аргументы функции: y — вектор начальных условий (k элементов); x1 и x2 — границы интервала, на котором ищется решение ОДУ; p — число точек внутри интервала (x1, x2), в которых ищется решение; D — вектор, состоящий из k элементов, который содержит первые производные искомой функции.

Rkadapt (y, x1, x2, p, D) — назначение параметров то же, что и для функции rkfixed. Существует несколько модифицированная функция rkadapt (y,x1,x2, acc,p,D,k,s) — где добавлены параметры k — максимальное число промежуточных точек решения; s — минимально допустимый интервал между точками; acc — погрешность решения (рекомендуется порядка 0.001).

Bulstoer (y, x1, x2, p, D) — назначение параметров то же, что и для функции rkfixed.

Рекомендации по использованию

REDMOND

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

Примеры решения дифференциальных уравнений

1.1. Задаем вектор начальных условий:

1.2. Задаем вектор — функцию первой производной неизвестной функции:

1.3. Для решения воспользуемся функцией rkfixed:

2. Решим дифференциальное уравнение второго порядка:

Преобразуем уравнение в систему ОДУ первого порядка, решенных относительно первой производной:

3. Решим систему линейных уравнений первого порядка:

4. Решим систему двух линейных уравнений второго порядка:

с начальными условиями .

5. Программирование в пакете Mathcad

Система Mathcad позволяет задавать функции пользователя используя встроенный язык программирования, что позволяет значительно расширить область применения пакета. Перед тем как использовать программу-функцию нужно ее задать — выполнить описание.

Порядок описания программы-функции Mathcad:

1. ввести имя программы-функции и список формальных параметров.

имя_программы (формальные параметры: =);

2. в панели Programming, выбрать Add line. На экране появится вертикальная черта и вертикальный столбец с двумя полями ввода для ввода операторов, образующих тело программы-функции;

3. в поле 1 (щелкнув на нем мышью или нажав клавишу [Tab]) ввести первый оператор тела программы-функции. Для вставки дополнительных полей ввода нажать на кнопке Add line;

4. в последнем поле (поле 2), определить возвращаемое через имя программы-функции значение (см. рис.).

Структура программы-функции

Рис. Структура программы-функции

В качестве примера определим функцию перевода из радиан в градусы:

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

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

Основные программные операторы

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

Создание и расширение программного модуля;

Внутреннее локальное присваивание.

Оператор условного выражения. Общий вид: выражение if условие. В случаи выполнения условия возвращается значение выражения. Совместно с этим оператором часто используются break и otherwise.

Циклов с заданным числом повторений. Общий вид: for Var Nmin. Nmax. Цикл можно задать диапазоном, множеством, вектором, возможна их комбинация. Переменную цикла Var можно использовать в программе.

Цикл с предусловием, действующий пока условие истинно. Общий вид: while условие. Тело цикла записывается на месте шаблона.

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

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

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

Прерывает выполнение программы и возвращает значение своего операнда.

Оператор обработки ошибок. Общий вид: выражение1 on error выражение2. Если при выполнении выражения1 возникла ошибка, то выполняется выражение2. Для обработки ошибок полезна функция error (S), которая выдает текстовое сообщение (S) и прерывает работу программного блока.

Численное решение уравнений в MathCAD

Все задачи, с которыми вам приходилось сталкиваться в школе или изучать в университете, решались символьно. То есть вы тем или иным образом преобразовывали и упрощали выражения, использовали какие-то стандартные формулы и методы, умножали, делили, сокращали — и в результате приходили к какому-то аналитически несложному результату. Так, например, при решении квадратного уравнения вы использовали формулы Виета; пытаясь найти корни кубического уравнения, вы разлагали выражение на линейные множители (или, в крайнем случае, использовали формулу Кардано), для бикубических уравнений прибегали к замене. В общем, для того, чтобы решить даже очень несложное нелинейное уравнение, от вас требовалось знание великого множества разнообразных формул и подходов. Но, увы, как бы вы хорошо ни ориентировались во всех этих методах и подходах, зачастую это мало вам помогало, так как использование большинства из них крайне трудоемко и подходит для решения очень немногих (специально подобранных) уравнений. На практике же, как правило, приходится работать с уравнениями, включающими разнородные функции (что, как правило, автоматически означает невозможность символьного решения) или с очень неудобными коэффициентами. Справиться со многими из них привычным преобразованием или заменами никак не получится. Что же делать?

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

Но если у вас есть компьютер с системой MathCAD, то никаких проблем с поиском решения не будет вне зависимости от сложности уравнения. Конечно, аналитическое решение компьютер вряд ли найдет даже для очень простых уравнений (в этом пока человек значительно превосходит машину), но зато ввиду колоссальной по сравнению с человеческой скоростью обработки данных очень эффективными становятся так называемые численные методы.

В основе всех численных методов решения уравнений лежит принцип подбора. Но, в отличие от подбора возможных корней человеком, в численных методах этот процесс является строго направленным. Основным понятием численных методов является итерация. Итерация — это буквально повторение, то есть все численные методы построены на принципе повторения одного и того же действия или последовательности действий, результатом которых является большее или меньшее приближение некоторого рабочего значения переменной к корню. Поэтому численные методы решения уравнений называются еще итерационными. Число необходимых итераций определяется скоростью сходимости алгоритма (эффективностью). Эффективность различных численных алгоритмов может различаться весьма значительно, но это не значит, что всегда стоит избирать из них наиболее быстрый: чем выше скорость сходимости к решению, тем, как правило, чувствительность алгоритма к различного рода трудностям (многочисленным экстремумам, разрывам или недифференцируемости в некоторых точках) выше. Поэтому очень важно иметь представление (хотя бы самое поверхностное) о том, какие принципы лежат в основе работы той или иной функции: это поможет выбрать наиболее подходящий в рамках данной задачи алгоритм и тем самым избежать лишних ошибок и проблем.

Немного о выборе типа алгоритма. В общем случае, конечно, гораздо лучше получить решение в результате символьных преобразований, так как при этом можно найти сразу все корни (при использовании встроенных функций MathCAD — только один), причем без какой-либо погрешности. Но, увы, аналитическое решение имеет относительно небольшое количество задач, а символьный процессор MathCAD сможет справиться вообще с мизерным процентом уравнений. Так что применение численных методов — это печальная необходимость. Но особо огорчаться по этому поводу не стоит: все недостатки численных алгоритмов MathCAD можно легко преодолеть.

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

Если необходимо найти корень некоторого уравнения, причем известен интервал, в котором находится корень, проще всего использовать функцию root с 4 аргументами: root(f(x), x, a, b), где f ( x ) — функция, определяющая уравнение, x — переменная, a и b — границы интервала локализации. Обязательным условием является то, что значения функции на концах интервала должны быть противоположных знаков.

Попробуем протестировать функцию root и для этого найдем корни какого-нибудь уравнения, точное решение которого очевидно. К примеру, возьмем уравнение

все корни которого имеют вид p × N/4 (N=1, 2, . ). Попробуем найти первое положительное решение. Очевидно, что таковым будет x=p /4 (что очень хорошо видно на графике).

Посмотрим, однако, найдет ли этот корень функция root. Интервал локализации определим от 0 до p /3:

MathCAD не подвел на этот раз: решение найдено в точности. Попробуем решить это уравнение с другим интервалом локализации:

Полученный результат отличается от первого решения, хотя корень х =0.25 (находится в данном интервале. Все дело в том, что в этом же промежутке находится еще 4 корня, и заранее предсказать, какой именно из них будет выдан в качестве ответа, совершенно невозможно. Поэтому следует ввести еще одно ограничение для применения функции root в рассматриваемой интерпретации: на промежутке должен быть локализован только один корень. В тех случаях, когда определить границы такой локализации невозможно, следует применять функцию root с одной точкой приближения (то есть перейти от метода Больцано к методу секущих). Хотя практически всегда определить нужный промежуток можно и чисто визуально, предварительно задав график. Вообще, строить график всегда желательно, когда вы используете численные методы: это самый надежный способ избежать ошибок и не потерять корни. Другой вопрос, что в случае систем уравнений это может помочь очень мало (так как сделать какие-то более или менее точные выводы по двум пересекающимся поверхностям совершенно невозможно).

Очень важной характеристикой решения является его точность. В MathCAD можно регулировать величину погрешности решения, изменяя значение специальной системной переменной TOL (от английского tolerance — точность). Строго говоря, TOL — это параметр, определяющий условие прекращения итераций. То есть цикл численного алгоритма остановит свою работу и выдаст последнее значение x, если f ( x ) примет значение, меньшее, чем TOL. Изменить величину этой встроенной переменной можно либо при помощи команды Math/Options/Built-in variables/TOL (Математические/Опции/Системные переменные/TOL), либо выполнив соответствующее присваивание непосредственно слева или сверху функции численного решения. Посмотрим, как влияет изменение величины TOL (по умолчанию равной 10 -3 ) на точность поиска корня. Пусть дана следующая функция:

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

Один корень вполне очевиден — это 0. Посмотрим, однако, сможет ли найти его функция root. Попробуем провести такой расчет при различных значениях TOL:

Для такой невысокой точности результат получился на удивление неплохим (значение функции в точке, определенной как корень, на 3 порядка меньше TOL — условия остановки цикла алгоритма). Но все равно 0.066 — это довольно далеко от настоящего значения корня. А то, что значение f ( x ) в этой точке весьма близко к нулю, совсем неудивительно: это связано с особенностью поведения функции в окрестности 0, где она буквально "скользит" по оси X .

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

Значение корня уже крайне близко к нулю. Попробуем задать высшую точность, возможную в MathCAD (TOL=10 -15 ):

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

Более 30 раз пришлось повторить операцию с этим инструментом, пока наконец кривая перестала сливаться с осью X ! В результате получился следующий график:

Теперь совсем несложно понять причину возникших трудностей: просто кривая в окрестности 0 слишком близко подходит к оси X . А, как вы помните, корень считается найденным, когда значение функции в некоторой точке меньше TOL. В случае же рассматриваемой функции для стандартной точности (10 -3 ) такие точки появятся на относительно большом расстоянии от точки решения. Поэтому результат получается неверным. Но, с другой стороны, утверждать, что решение в рассмотренных выше случаях находилось ошибочное, совершенно некорректно. Ведь по условию в точке корня значение функции должно быть меньше TOL. Для большинства численных методов это основное, а в случае метода бисекции (схожий с ним алгоритм лежит в основе работы функции root с четырьмя аргументами) — единственное условие определения некоторой точки x как корня. Условие же это при всех значениях точности было выполнено, причем TOL и f ( x ) отличались на несколько порядков. Просто, строго говоря, получаемые значения корней следует округлять до порядка, равного порядку продекларированной точности (ведь значение функции не может быть точнее входных данных). Если бы мы это сделали, то во всех случаях, в том числе и при TOL=10 -1 , ответ получился бы верным (хотя, надо признать, в случае TOL=10 -1 это было бы, скорее, счастливое совпадение).

Из всего вышесказанного можно сделать вывод: нахождение корня функцией root совсем не означает его действительного существования. Очень даже возможна такая ситуация, когда кривая функции очень близко подходит к оси Х, но при этом не пересекает ее. Если же установленный уровень точности окажется больше того расстояния, на которое она приближается к оси, то точку, в которой это сближение происходит, MathCAD определит как корень.

Что же делать, чтобы избежать таких ошибок? Во-первых, всегда строить график. В системе MathCAD это делается предельно быстро и просто, а неприятностей позволяет избежать очень многих. Во-вторых, если вы видите, что график как бы скользит по оси Х (очень неясная ситуация: возможно и пересечение в 2-х точках, и касание в одной, и отсутствие общих точек вообще), попробуйте увеличить точность по максимуму: в большинстве случаев этого бывает вполне достаточно. И в-третьих, если сомнения все равно остаются, используйте инструмент ZOOM в области предполагаемого расположения корня. Пожалуй, способ этот самый надежный: ведь увеличение можно производить практически до бесконечности.

Найти решение уравнения в MathCAD можно применяя другую форму встроенной функции root, имеющую только 2 аргумента (имя функции и переменной). При использовании этого варианта выше или правее самой функции root следует задать начальное приближение для x:

Определить величину начального приближения можно либо чисто интуитивно, либо (лучше) построив график.

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

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

Дмитрий Гурский, Юрий Стрельченко, dot&#64;omen.ru

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

REDMOND

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

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