Переходим к пункту 1.
Задачу можно упростить, если определить границы корней: граница абсолютных значений корней вычисляется по формуле (8)
: (8),
(9),границу положительных корней – по формуле (9):
а границу отрицательных корней – заменив в уравнении (1) х на –х.
Таким образом, мы получаем метод, хотя и достаточно медленный (впрочем, при неудачном выборе нулевого приближения в методе итераций поиск решения может затянуться на еще более долгое время, да и к тому же неизвестно, приведет ли весь ход вычислений к ответу), но зато вполне надежный и простой метод, не требующий решения дополнительных задач, вроде вычисления производной, а рекурсивность самого алгоритма позволяет получить очень компактный и легко читаемый код. Именно поэтому метод половинного деления и был выбран для реализации на программном уровне.
2.2.4. Метод разложения на множители
Данный метод является полностью аналитическим, однако полностью зависим от других. Главным его преимуществом является то, что в данном методе не происходит потери кратных корней. Поясним на примере:
Пусть дан многочлен F(x) = 2x3-11x2+20x-12 (11)
Его можно записать в виде: F(x) = (x+2)2(2x-3) (12)
У многочлена n-степени, как известно, n корней, а из (12) следует, что корнями F(x) являются –2 и 1,5, причем корень –2 является кратным, т.е. фактически это два одинаковых корня. При отыскании же корней любым из вышеописанных методов «второй» корень –2 будет потерян, т.к. график функции будет иметь лишь две точки пересечения с осью абсцисс
Чтобы избежать этого применяется метод разложения на множители. Суть его заключается в следующем: каждый многочлен вида (1) можно представить в виде (x+h1)(x+h2)…(x+hn)*H = 0 (13) ,
или F(x) = (x+h)(bn-1xn-1+…b1)+b0 (14)
где h1…hn – корни уравнения, а Н – произведение множителей х, вынесенных за скобки ( Н никак не влияет на уравнение, т.к. от него избавляются, деля на Н обе части (13). При этом не исключено, что некоторые h могут быть взаимно равны, что и свидетельствует о наличии кратного корня.
Для вычисления значений новых коэффициентов в (14) используются формулы:
bn=an
bn-1=bnh+an-1 (15)
bn-2=bn-1h+an-2
…
Таким образом, алгоритм этого метода выглядит следующим образом:
Определить границы корней уравнения;
При помощи любого из вышеописанных методов найти один корень уравнения;
Применяя формулы (14) и (15) сформировать новый многочлен степени, на 1 меньшей предыдущего.
Вернуться к пункту 2.
Повторять до тех пор, пока степень многочлена не обнулится.
Этот метод был реализован на программном уровне и включен в курсовую работу.
ОПИСАНИЕ СТРУКТУРЫ ПРОГРАММЫ
В рамках задания на курсовую работу в среде программирования VisualBasicforApplications была разработана программа, находящая корни многочлена с указываемой точностью.
3.1. Описание программных модулей
Разработка программы велась с учетом концепции объектно-ориентированного программирования, поэтому четко определенной последовательности действий в ней нет. Однако, разбирая программу на составляющие, можно проследить «путь» алгоритма в коде.
Вся программа состоит из форм и модулей. Модулей всего два: один содержит стандартную процедуру автозапуска (его рассматривать мы не станем), а другой – все «публичные» процедуры и функции.
Public function F(x). Функция, возвращающая значение многочлена для передаваемого х.
Public function DetectBorders. Возвращает границы корней, согласно формулам ( 7 , 8, 9 ).
PublicsubGra – процедура, «ответственная» за составление графика.
3.2. Описание форм
В формах заключена основная часть программы, в том числе и собственно алгоритм метода половинного деления. Решение «упаковать» эти функции в формы было продиктовано следующими причинами:
сокращение объема занимаемой памяти и, как следствие, ускорение работы за счет сокращения времени жизни переменных;
разграничение доступа (т.е. необходимая функция или метод могут быть активированы исключительно в допустимой ситуации – это значительно снижает вероятность ошибок);
каждая форма является «вещью в себе» и не зависит от остальных (кроме «корневой»
3.2.1. Форма Form_Main
Является корневой формой программы, содержит Главное меню, позволяющее в любом порядке выполнять все необходимые действия, а также сохранять и завершать работу программы.
3.2.2. Форма Form_Koeff
В этой форме задаются коэффициенты многочлена.
Замечание. Для задания коэффициента а0 необходимо указать значение степени х равным 0.
3.2.3.Форма Form_Mnogo
3.2.4.Форма Form_WP
Эта форма по существу является панелью управления в режиме графика и позволяет его распечатать или закрыть.
3.2.5. Форма Form_Korni
«Основная форма» – именно в ней заключен сам алгоритм поиска корней (SubFindKor) методами бисекции и хорд/касательных.
В качестве свойств в объекте «форма» присутствуют три ключевые процедуры, реализующие собственно алгоритмы нахождения корней и нахождения производной.
PublicsubFF* – процедура, «ответственная» за нахождение производной.
PublicsubHorda_Kasatelnye – процедура, реализующая поиск корней по алгоритму хорд и касательных.
PublicsubFind_Kor – процедура, реализующая поиск корней по алгоритму половинного деления отрезка.
Замечание. Алгоритмы нахождения крней описаны в главе 2. Суть же алгоритма нахождения производной сводится к простому перемножению коэффициента и степени и уменьшению значения степени на единицу. Это позволяет корректно определить производную, при этом корректно «избавиться» от конечной константы.
АНАЛИЗ РЕЗУЛЬТАТОВ
В результате выполнения задания на курсовую работу была создана программа VIFunction 2.0 , находящая корни алгебраического многочлена вида (1) с указываемой точностью посредством следующих методов:
метод деления отрезка пополам;
метод хорд и касательных (комбинированный)
Также при составлении программы была учтена возможность наличия у многочлена кратных корней, и средства их обнаружения также вошли в состав программы.
Фактические результаты совпали с формальными.
Список литературы
Гутер Р.С. , Овчинский Б.В. «Элементы численного анализа и математический обработки результатов опыта». Москва, «Наука», 1979
Калиткин Н.Н. «Численные методы». Москва, «Наука», 1978
Крылов В.И., БабковВ.В., Монастырский П.И. «Вычислительные методы». Москва, «Наука», 1976
П. Санна. «Visual Basic for Applications 6.0 «вподлиннике», Киев, BHV
[1] Этот факт был доказан известными математиками Абелеи и Галуа.