Раздел: Документация
0 ... 88 89 90 91 92 93 94 ... 177 Когда критерии сходимости к корню выполнятся и цикл while прекратит работу, значение последнего приближения должно быть занесено в вектор результатов геа. Затем полином должен быть разделен на соответствующий найденному корню линейный множитель. Для этого следует задействовать написанную ранее функцию pol dev. После выполнения этих действий алгоритм будет готов перейти к поиску очередного корня. reSj 4- а V4-pol dev(V,a) Когда все корпи будут найдены, вехтор res должен быть возвращен как результат работы функции. Однако перед этим корни стоит отсортировать в порядке возрастания, воспользовавшись функцией sort. воП(гев) Функция LaGuerra готова. Приведем ее полный код: UGuerra(4TOL):= P(V,x) OfV.x) Lj-oj-o 3-P(V,x>-PfV.x) dx2 dx -,H(V,x) «- OCV.jt/ - —— P(V,x) P(V.x) for ie0..1aet(V) - 1 a «- -100 + md(200),ajMt 4- 2a.k+-0 while -(P(V.a) <TOLa a-a)je, cTOL) if k> 100 a 4- -100+ rnd(200).ajet «- 2-a.k 4- 0 continue k +- k + 1 otherwise n 4- lutCVJ.Ga +- OfV.aJ.Ha 4- HTV.a) щд +- g,+Jot-o-vJ-o-t--q?) •let «-»,»«- a - in*max(m) * 0,max(m),0.1-TOL) V4-pol dev(V,a) sort (res) Проверим эффективность написанной ггрограммы, применив ее по отношению к полиному, корни которого заведомо известны. Сравним выданный ею результат с результатом работы функции polyroots. -1440 Z:-(x + ])(*-9>2 (х- 7)(х2 + 4)coefrs,x -0.99999999999998685 1-99999999999999151 LaG™nra(z,10~l3)= 161 -456 186 -24 V 1 М .00000002302521421 -2 0000000149387862] polyroots(Z} = 2.00000OOI53338786i 7.0000000388097439 8.9998382448970879 V9 0001617261872831 J 1.9999999999999849i 6.9999999999999973 8.9999998133418515 V 9.0000001866581449 Как видите, каша программа если и уступает функции polyroots, так только в скорости работы. Точность же определения ею корней полинома может даже (прн малых T0L) превосходить точность показываемую функцией polyroots. Она способна находить все виды корней: действительные, комплексные, кратные. Зная суть алгоритма Лаггера, несложно понять, отчего точность определения корней с повышением степени полинома резко падает. Это связано с тем. что нахождению очередного корня предшествует операция деления полинома на ссютветствующий определенному ранее корню линейный множитель. Так как приближение к корню имеет ограниченную точность, коэффициенты нового полинома будут найдены с ошибкой. Соответственно, ошибка при вычислении нового корня будет складываться из общей погрешности метода и погрешности, связанной с неточностью коэффициентов- Поэтому данный корень будет менее точен по сравнению с предыдущим. Таким образом по мере вычисления корней точность будет неуклонно падать. Это можно заметить даже в случае полиномов не очень высокой степени. Так если определить корпи полинома степени 8, то часть из них будет точна до 13-14 то знака мантиссы, Но два-три корня будут иметь ошибку уже в 4-5-м знаке. Учитывая описанную выше особеш tocrh метода Лаггера, его не стоит не пользовать для поиска корней полиномов высокой степени. Для этого лу ч ш с i tpi i ме» i ять фу it кии ю root, находя каждый корень индивидуально. Или же можно обратиться к методу сопровождающей матрицы, который менее устойчив, однако не склонен к такому выраженному накоплению ошибки. Метод сопровождающей матрицы мы не будем описывать так подробно, как метод Лаггера, однако изложим его основные идем. Из курса линейной алгебры известно, что любой полином может быть представлен в матричном виде как следующий опрелел итель: Р<х)= А-*1 Здесь А — так называемая сопровождающая матрица (companion matrix), х — переменная, 1 - единичная матрица, соразмерная А. Сопровождающая матрица, но сутн, хранит коэффициенты полинома. В случае полинома степени m сопровождающая матрица — это матрица размерностиmxm, имеющая следующий вид:
Можно показать, что корням полинома соответствуют собственные значения сопровождающей матрицы. Следовательно, задача определения корней сводится к задаче нахождения собственных значений. Существуют специальные численные методы, которые позволяют решать эту задачу с высокой точностью. Один иэ этих методов реализован в Mathcad в форме функции eigenvals. Мы воспользуемся данной функцией, чтобы написать гфограмму, реализующую метод сопровождающей матрицы. Код этой программы будет предельно пюст: comp matr(vector):» for i е tast( vector) - 1.. О 0, !ast( vcctor)-l-i for j e 0,. last(vcctor) 4 [vector * vector. last (vector) ) cigenvalstT) Несложно показать, что точность программы compmatr совпадает с точностью встро-енлого алгоритма сопровождающей матрицы. Это означает, что они абсолютно идентичны. comp matr(Z) 2:-(24 -50 35 ( 4.О0ООО0000ООО0338 "\ 2.9999999999999565 2,0000000000000164 09999999999999734 -10 1) po[yroots(Z) f 0.99999999999999734 2.0000000000000164 2.9999999999999565 ч. 4.0000000000000338; 8.1.4. Графическое решение уравнений Графическое решение уравнения заключается в оцделении по графику функции, соответствующей левой части уравнения, при какой величине аргумента данная функция принимает значение, равное правой части уравнения В Mathcad графический метод используется относительно редко, Однако есть случаи, в которых без него не 0 ... 88 89 90 91 92 93 94 ... 177
|