Гурский Д., Турбина Е. - Вычисления в MathCad 12 (1077322), страница 65
Текст из файла (страница 65)
Это связанос тем, что вблизи экстремума кривая имеет очень малый наклон. Из-за этого малыйнаклон будет иметь и первая секущая. Соответственно точка, в которой она пересечет ось X, будет очень удалена от первого приближения.Аналогично случаю с экстремумом, решение можно не получить также, если в окрестности первого приближения функция изменяется очень медленно (см. пример 8.15).• Возможны и более сложные случаи, в которых метод секущих не сойдется.
К примеру, корень может соседствовать с бесконечным разрывом.В общем, подобрать подходящее начальное приближение для метода секущих можетбыть непросто. Поэтому его стоит использовать лишь в оговоренных выше особых случаях. В остальных случаях лучше применять глобально сходящиеся методы интервалов локализации корня.Если функции root не удается найти решение посредством метода секущих, она пытается это сделать посредством более совершенного, но и сложного метода Мюллера. Посути, данный метод является модифицированным с целью увеличения скорости сходимости методом секущих. В этом методе секущая заменяется параболой. Соответственно, для построения этой параболы используются три последних приближения.Точка, в которой парабола пересекает ось X, считается новым приближением.
МетодМюллера сходится быстрее метода секущих, давая, в среднем, по две значимые цифрына одну итерацию. Однако он более чувствителен к начальному приближению и видуфункции.•8.1.3. Определение корней полиномаОдним из основных недостатков функции root является то, что одновременно она способна найти только один корень уравнения. Чтобы найти остальные, придется проделать те же операции, но для других приближений. В случае большого количества корнейэто может быть очень утомительно. Конечно, можно написать программу, выполняющую эту работу, — однако это слишком сложно для большинства пользователей. Новсе значительно упрощается в том случае, если ваше уравнение представлено алгебраическим полиномом.
Для этого частного случая разработаны очень эффективные алгоритмы решения, и использовать для поиска корней полинома, например, метод секущих было бы не совсем рационально. Поэтому совсем не удивительно, что в Mathcadсуществует специальная функция поиска решений полинома polyroots(V), где V — вектор, составленный из коэффициентов полинома. Важной особенностью задания V2 8 0 • Глава 8. Решение уравнений и систем уравненийявляется то, что коэффициенты располагаются в векторе сверху вниз соответственноувеличению степеней членов полинома, к которым они относятся.
То есть первымсверху нужно поместить коэффициент при х° (свободный член), нижним — коэффициент при хп, где п — порядок полинома. Ответ выдается в виде вектора, содержащегокак действительные, так и комплексные корни.Пример 8.17. Поиск корней полинома посредством численного методаПусть стоит задача найти корни уравнения следующего вида:х + х + х+ 1 =1Решение: составляем вектор коэффициентов и используем функцию polyroots.-1.466koef :=polyroots(koef) =О0.233- 0.793i0.233+ 0.793УПереписывать коэффициенты из выражения в вектор не очень интересное и приятноезанятие, тем более что при этом очень легко либо допустить ошибку в самом числе,либо просто перепутать знаки. Для решения этой проблемы нужно использовать специальный оператор coeffs, расположенный'на панели Symbolic (Символьные).
Причемполином может быть представлен в неразвернутой форме: к стандартному виду оператор coeffs приведет его автоматически (см. пример 8.18).Пример 8.18. Использование оператора coeffsПусть нам необходимо решить уравнение следующего вида:V2(х2 + х+ l ) + (х- I) 3 + (х+ I) 4 = 0Решение: используем функцию polyroots, вектор коэффициентов для которой создаем с помощью оператора coeffs.'Лkoefs:=(x 2 +x+l)1)4 coeffs, x-2.981polyroots(koefs) =-0.2 +-0.2-0.119Найти корни полинома с использованием polyroots можно с помощью двух методов:Лаггера (LaGuerre) и сопровождающей матрицы (Companion matrix).
Поменять используемый метод можно в контекстном меню функции polyroots (вызывается щелчком правой кнопкой мыши). По умолчанию выбран метод Лаггера. Нетрудно проверить, что оба метода очень точны — однако точность метода сопровождающей матрицызачастую все-таки несколько выше. Однако функцией polyroots по умолчанию все жеиспользуется метод Лаггера, так как он более стабилен.Точность работы функции polyroots не зависит от TOL — она всегда максимальна.8.1. Решение уравнений•2 8 1Пример 8.19. Проверка точности функции polyrootsПопробуем применить функцию polyroots к полиному, корни которого известны.
Это даст возможность оценить величину погрешности.'-360360^622262koefs:=(x- l ) ( x - 4 ) ( x + 4 5 ) - ( x - 2 ) - ( x + 1001)expand,хcoeffs,x377371039f-ioof*polyroots(koefs)-100,-H-453.243x101-4.483x102.-12-1.595x10, 4Companion MatrixLaGuerra/.-12-1.478x10,-12polyroots(koefs)--2.002x 10 *-45.-14-1.421x 101.-15-3.109X 1024.-152.665x 100V-2.479xlOФункция polyroots способна находить корни полиномов от 2 до 99 степени. В общемслучае, чем выше степень полинома, тем с меньшей точностью будут найдены корни.Объективно говоря, чаще всего использовать функцию polyroots для поиска корнейполинома не совсем технично.
На практике лучше всегда применять оператор solve, таккак при этом для полиномов невысокой степени ответ может быть получен в болееинформативном и точном символьном виде. Если же символьный ответ будет слишком громоздок, его всегда можно пересчитать в числа с плавающей точкой посредствомоператора float с той точностью, с которой необходимо. Однако важно понимать, чтоесли степень полинома превышает четыре, то для поиска его корней оператор solve также будет использовать приближенный метод (скорее всего, тот же, что применяет функция polyroots).
При этом заметное различие между использованием оператора solve и функции polyroots исчезнет (но в случае solve ответ будет на пять порядков точнее, так каксимвольный процессор использует не связанную с аппаратным уровнем арифметикудлинных мантисс).Численные методы, используемые функцией polyroots, очень своеобразны.
Поэтомустоит с ними познакомиться. Начнем мы с метода Лаггера.Метод Лаггера — это самый стабильный из известных методов определения корнейполинома. Наверное, единственный его недостаток, это то, что он требует использования арифметики комплексных чисел, даже если все корни полинома действительны.Впрочем, так как Mathcad поддерживает комплексные числа, даже этот недостатокисчезает. Метод Лаггера требует начальное приближение к корню, однако в подавляющем большинстве случаев не имеет значения, что это будет за приближение (именно поэтому функция polyroots принимает только один параметр). В случае действительных корней метод сходится к решению, какое бы число ни было взято в качествеприближения. Крайне редко проблемы со сходимостью возникают, если у полинома2 8 2 • Глава 8. Решение уравнений и систем уравненийесть комплексные корни. В этом случае нужно просто сменить неудачное приближение.Скорость сходимости метода Лаггера к корню весьма высока.
Так, она почти в два разавыше скорости сходимости метода секущих и в полтора раза выше скорости сходимости метода Мюллера.Метод Лаггера основывается на нескольких фактах. Основной из них — любой полином можно представить в виде произведения линейных множителей. Этот факт вытекает из фундаментальной теоремы алгебры, утверждающей, что у полинома степени Nбудет N корней.Логарифмируя разложенный на множители полином, а затем дифференцируя полученную функцию, обнаружим следующие важные связи:d т,G= —dxЧ Р п«)| =11, ч1xjx-x2х-хпРп(х)Взятие второй производной от логарифмированного полинома дает следующие соотношения:Н=—dxЧ Р п«)| =(x-Xl)2ад(x-x 2 ) 2Базируясь на данных формулах, Лаггер сделал предположение, которое на первыйвзгляд может показаться просто безумным. Тем не менее оно работает.
Лаггер предложил считать, что первый корень располагается на расстоянии а от текущего приближения х, в то время как все остальные корни располагаются от него на одинаковом расстоянии Ь. С учетом этих допущений выражения для G и Н существенно упростятся:G= — +aН= — +2 , 2abДанную систему уравнений довольно просто решить относительно а:а =bпПолученное уравнение является основным уравнением метода Лаггера. Выбор знакаперед дискриминантом должен быть осуществлен таким образом, чтобы величина знаменателя была максимальной.Поиск корня исходя из уравнения Лаггера — это итеративный процесс. То есть на основании начального приближения х0 находится поправка а0. Следующее приближениеопределяется как х,=хо -а о .
Подстановка х( в уравнение Лаггера дает вторую поправкуа,, на основании которой находится третье приближение х2. Этот процесс продолжается до тех пор, пока не выполнятся условия сходимости к корню. Эти условия те же, чтои для других численных методов решения уравнений: | f(xn)| <TOL и (или) I xn—xn_,l <TOL.8.1. Решение уравнений• 283В случае функции poLyroots TOL имеет всегда одно и то же значение — порядка 10~12. Мыже напишем реализующую метод Лаггера программу так, что значение TOL можно будет задавать произвольно.Формула Лаггера дает возможность найти только один корень полинома исходя изданного приближения. Чтобы найти другие корни, необходимо повторять процесс прииных значениях приближений. Однако на практике этот путь, ввиду его неэффективности, не используют.
Действительно, так как заведомо неизвестно, какое приближение какой корень даст, можно многие тысячи раз впустую прокрутить алгоритм, получаяодин и тот же корень. Более технично, найдя корень, разделить полином на соответствующий ему линейный множитель. При этом будет получен полином на единицуменьшей степени, чем исходный полином. К этому полиному нужно повторно применить алгоритм Лаггера (начальное приближение менять не обязательно).
Получив второй корень, делим полином на соответствующий ему линейный множитель. И так дотех пор, пока все корни не будут найдены.Итак, прежде чем реализовывать непосредственно алгоритм Лаггера, нужно создатьфункцию, посредством которой можно будет делить полиномы на соответствующиенайденным корням линейные множители. Чтобы это сделать, необходимо вспомнить,как производится деление полинома на полином «столбиком». В общем, полином делится на полином по тем же правилам, что и число на число.
Покажем это на примеределения полинома четвертой степени на его линейный множитель:432х -10х +35х -50х+24 х-4~х4-4х3 _х 3 -6х 2 +Пх-632-6х +35х - •50х+3432~-6х +24х2_11х -50х+2411х2-44х-6х+24~ -6х+24ОКак видите, поделить полином на его линейный множитель очень просто. Соответственно, несложно написать и выполняющую эту операцию"программу. Представлять полиномдля этой функции наиболее удобно в той же форме, что и для функции polyroots: вектора коэффициентов. Вторым параметром данной функции будет корень полинома а, на соответствующий которому линейный множитель необходимо разделить полином.pol_dev(V,a):=<- last(V)r<- VnV:=(-126 -31 77 -17 1)V<- submatrix(V,O,n - 1,0,0)pol_dev(V,7)T = (18 7 -10for i e n - 1..
0s <r- V.x 4 - 17-x377-x 2 -31-x-126x-7s + r-asimplify->x -10-X+7-X+18\284 •Глава 8. Решение уравнений и систем уравненийПрограмма, реализующая метод Лаггера, будет довольно сложна. Поэтому имеетсмысл описать ее создание поэтапно.Назовем мы нашу программу LaGuerra. В качестве параметров она будет приниматьвектор коэффициентов полинома V и уровень необходимой точности TOL:LaGuerra(V,TOL):=|.В первую очередь на основании вектора коэффициентов V нужно задать функцию полинома Р. Затем необходимо объявить использующиеся в формуле Лаггера функцииG и Н. Так как в выражениях функций G и Н функция Р присутствует в знаменателяхдробей, то крайне важно предусмотреть возможность возникновения ошибки деленияна нуль.