Реферат: НАХОЖДЕНИЕ ВСЕХ ДЕЙСТВИТЕЛЬНЫХ КОРНЕЙ АЛГЕБРАИЧЕСКОГО МНОГОЧЛЕНА МЕТОДОМ ДЕЛЕНИЯ ОТРЕЗКА ПОПОЛАМ (БИСЕКЦИИ) И МЕТОДОМ ХОРД И КАСАТЕЛЬНЫХ С УКАЗАННОЙ ТОЧНОСТЬЮ И УЧЕТОМ ВОЗМОЖНОЙ КРАТНОСТИ КОРНЕЙ
ФедеральнаяАвиационная Служба России
МОСКОВСКИЙГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ
Кафедраприкладной математики
Курсовая работа защищена
с оценкой _________________.
.__________________________.
Руководитель
доцент, к.т.н. Лукина О. П.
.__________________________.
подпись
КУРСОВАЯ РАБОТАпо теме
НАХОЖДЕНИЕ ВСЕХ ДЕЙСТВИТЕЛЬНЫХКОРНЕЙ АЛГЕБРАИЧЕСКОГО МНОГОЧЛЕНА МЕТОДОМ ДЕЛЕНИЯ ОТРЕЗКА ПОПОЛАМ (БИСЕКЦИИ) ИМЕТОДОМ ХОРД И КАСАТЕЛЬНЫХ С УКАЗАННОЙ ТОЧНОСТЬЮ И УЧЕТОМ ВОЗМОЖНОЙ КРАТНОСТИКОРНЕЙ
(Пояснительная записка ккурсовой работе по дисциплине «Численные методы»)
Работу выполнили
студенты5-го курса
специальности01.02
КозловСергей Александрович
/КозловС.А./------------------------.
СеменчихинВладимир Владимирович
/СеменчихинВ.В./------------------------.
28.X/1999года.
МОСКВА — 1999
АННОТАЦИЯ
В данной курсовой работе рассмотренпринцип нахождения корней алгебраического многочлена следующими численными методами: метод бисекции,метод хорд и касательных, метод разложения на множители с учетом определяемойточности и проверки кратности корней, а также в среде Visual Basic for Applications 6.0 была разработана программа, реализующаяэтот поиск и проверку. В пояснительной записке приводится описание как самихчисленных методов, так и программы, включая примеры и «экранные копии».
1. ТЕХНИЧЕСКОЕ ЗАДАНИЕ
Разработать программу для вычислениякорней алгебраического многочлена следующими численными методами: методомполовинного деления, методом хорд и касательных, методом разложения намножители, а также обеспечить вычисление значений корней с указываемойточностью и проверку кратности корней. Среда разработки программы – произвольная.
2. ПРЕДМЕТНАЯОБЛАСТЬ
2.1. Описание численных методов
Численные методы позволяют найти решенияопределенных задач, заранее зная, что полученные результаты будут вычислены сопределенной погрешностью, поэтому для многих численных методов необходимо заранеезнать «уровень точности», которому будет соответствовать полученное решение.
В этой связи задача нахождения корнеймногочлена вида (1)
F(x)=a0+a1x+a2x2+…+anxn (1)
представляет особый интерес, т.к. формулы нахождения корнейдаже кубического уравнения достаточно сложны, а если необходимо отыскать корнимногочлена, степень которого равна, например, 5 – то без помощи численныхметодов не обойтись, тем боле, что вероятность наличия у такого многочленанатуральных (или целых, или точных корней с с «короткой» дробной частью)довольно мала, а формул для нахождения корней уравнения степени, превышающей 4,не существует.[1]Де-факто все дальнейшие операции будут сводиться лишь к уточнению корней,интервалы которых приблизительно известны заранее. Проще всего эти «приблизительные»корни находить, используя графические методы.
Для нахождения корней многочленасуществует несколько численных методов, но мы остановимся на тех из них: методеитераций, методе хорд и касательных и методе половинного деления.
2.2.1. Метод хорд и касательных(комбинированный)
Данный метод основан на построениисхематического графика функции, определении интервалов его пересечения с осьюабсцисс и последующим «сжатием» этого интервала при помощи строимых хорд и касательныхк графику этой функции.
Надо отметить, что существуют такжеотдельно метод хорд (дает значение корня с недостатком) и метод касательных (сизбытком). Однако преимущество комбинированного метода заключается в«двустороннем сжатии» рассматриваемого отрезка.
Рассмотрим следующий случай:
- дана функция F(x) и построен ее график;
- определенадопустимая погрешность Q
-
/> <td/> />на основании графика определенотрезок [a,b], на котром график функции пересекаетось абсцисс, следовательно, на этом отрезке
рис.1
- существует кореньрассматриваемого многочлена. (обозначим его через A)
Дальнейший алгоритм сводится к следующимдействиям:
1. строим касательную к графику функциив точке F(b)
2. вычисляем координату х пересечениякасательной с осью абсцисс по формуле (3) и обозначаем ее через b’
3. строим к графикуфункции хорду, проходящую через точки F(a) и F(b).
4. Вычисляем точкупересечения хорды с осью абсцисс по формуле (2) и обозначаем ее через a'.
a’=a-Da , где /> (2)
/>
b’=b-Db , где (3)
Таким образом мы получаем новыйотрезок [a’,b’], котроый (по определениямхорды и касательной) по-прежнему содержи решение уравнения A.
5. Теперь принимаемотрезок[a’,b’] за новый отрезок[a,b] и повторяем шаги 1-4 до тех пор,пока разность F(b)-F(a) не станет меньше первоначальнозаложенной погрешности Q.Отметим также, что после этого рекомендуется в качестве искомого решения взятьсреднее арифметическое F(a) иF(b).
Замечание к методу хорд икасательных. Врассмотренном случае производная F’(x)>0, т.е. график «выпуклый» и b>a.При работе с каждым отдельным случаем необходимо находить производные функциипервого и второго порядков и, сообразуясь с ее знаком, определять a и b.
Возможны четыре случая:
/> /> /> /> /> /> <td/> />y y
/> /> /> /> /> /> /> <td/> />F(x) F(x)
/> /> /> /> /> /> <td/> />x x
а) б)
/> /> /> /> /> /> <td/> />y y
/>/>
F(x) F(x)
/> /> /> /> /> /> /> /> /> />x x в) г)
а) F’(x) < 0
F’’(x) > 0б) F’(x) > 0
F’’(x) > 0
в) F’(x) < 0
F’’(x) < 0
г) F’(x) > 0
F’’(x) < 0
Способ хорд
Способ касательных
F’(x)F’’(x) > 0
С недостатком С избыткомF’(x)F’’(x) < 0
С ибытком С недостаткомТаким образом, если хорда (касательная) даетзначение корня с избытком, то этот корень берется с качестве новой правойграницы, а если с недостатком – то левой. В обоих случаях точный корень лежитмежду точками пересечения хорды и касательной с осью абсцисс.
Замечание 2 к методу хорд икасательных. Таккак для решения поставленной задачи требуется отыскание производной функции F(x), метод хорд и касательных достаточнотрудно реализуем на программном уровне, т.к. правила вычисления производных вобщем виде довольно громоздки для «понимания» ЭВМ; при непосредственном указаниипроизводной для каждой степени многочлена память компьютера серьезно загружается,что очень замедляет работу, а задание функции и, соответственно, ее производнойнепосредственно в программном коде – недопустимо. Однако, используя данныйметод, сходимость интервала к корню происходит наиболее быстро, особенно еслисовместить метод хорд и касательных с методом бисекции, т.к. середина новогоотрезка зачастую дает вполне удовлетворительное решение.
2.2.2. Метод итераций
Пятый шаг алгоритма хорд икасательных определял возврат к первому шагу и последующую цикличность хода, т.е.метод хорд и касательных являлся итерационным. Другой метод, также основанныйна повторах так и был назван – «метод итераций». Суть его заключается в следующем:
- дана функция F(x);
- определенадопустимая погрешность Q;
- определеннекоторый интервал [ a, b ], точно содержащий решение уравнения.
- Определенонекоторое число z, принадлежащее [ a, b ] (назовем z «нулевым приближением»)
Для получения следующего приближенияподставим в формулу (1) вместо X Z, получим:
/>x1=F(z) (4)
и, продолжая аналогично,
/> x2=F(x1)
/>x3=F(x2) (5)
…
xn=F(xn-1)
Таким образом, получаем некоторуюпоследовательность, и, если ее предел (6)
limxn=A, n®v (6)
то А является искомым корнем.
Данный метод является исключительноаналитическим, что упрощает его машинную реализацию, однако содержит следующиенедостатки:
- необходимостьвыбора нулевого приближения (ведь то, что интуитивно для человека, для ЭВМможет стать довольно сложной задачей)
- наконец,полученная последовательность просто может не сходиться, и тогда решениенайдено не будет.
Эти контраргументы стали основанием для отклонения методаитераций при выборе алгоритмизируемого метода.
2.2.3. Метод половинного деления (методбисекции)
/> <td/> />рис.2
Метод половинного деления (известныйеще и как «метод деления отрезка пополам») также является рекурсивным, т.е.предусматривает повторение с учетом полученных результатов.
Суть метода половинного делениязаключается в следующем:
- дана функция F(x);
- определенадопустимая погрешность Q;
- определеннекоторый интервал [ a, b ], точно содержащий решение уравнения.
1. Вычисляем значение координаты Е, берясередину отрезка [a, b], т.е. Е= (a + b ) / 2 (7)
2. Вычисляем значения F(a), F(b), F(E), и осуществляем следующую проверку:Если F(E)>Q, то корень с указанной точностьюнайден. Если F(E)<Q, т.е. необходимая точность еще недостигнута, то формируем два интервала: [a, E] и [E, b] проверяем знаки F(a), F(b), F(E). На концах одного из этих интерваловзнаки функции будут одинаковы, а на друго различны (иначе Е — искомый корень).И именно то интервал, на концах которого знаки различны, мы берем за основупри следующей итерации, т.е. приравниваем к Е либо a, либо b.
3. Переходим кпункту 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
…
Таким образом, алгоритм этого метода выглядит следующим образом:
1. Определитьграницы корней уравнения;
2. При помощи любогоиз вышеописанных методов найти один корень уравнения;
3. Применяя формулы(14) и (15) сформировать новый многочлен степени, на 1 меньшей предыдущего.
4. Вернуться кпункту 2.
5. Повторять до техпор, пока степень многочлена не обнулится.
Этот метод был реализован на программном уровне и включен вкурсовую работу.
3. ОПИСАНИЕ СТРУКТУРЫ ПРОГРАММЫ
В рамках задания на курсовую работу всреде программирования Visual Basic for Applications была разработана программа, находящая корни многочленас указываемой точностью.
3.1. Описание программных модулей
Разработка программы велась с учетомконцепции объектно-ориентированного программирования, поэтому четкоопределенной последовательности действий в ней нет. Однако, разбирая программуна составляющие, можно проследить «путь» алгоритма в коде.
Вся программа состоит из форм имодулей. Модулей всего два: один содержит стандартную процедуру автозапуска(его рассматривать мы не станем), а другой – все «публичные» процедуры ифункции.
Publicfunction F(x). Функция, возвращающая значение многочлена для передаваемогох.
Publicfunction DetectBorders. Возвращает границы корней, согласно формулам ( 7, 8, 9 ).
Publicsub Gra – процедура, «ответственная» засоставление графика.
3.2. Описание форм
В формах заключена основная частьпрограммы, в том числе и собственно алгоритм метода половинного деления.Решение «упаковать» эти функции в формы было продиктовано следующими причинами:
- сокращение объемазанимаемой памяти и, как следствие, ускорение работы за счет сокращения временижизни переменных;
- разграничениедоступа (т.е. необходимая функция или метод могут быть активированыисключительно в допустимой ситуации – это значительно снижает вероятность ошибок);
- каждая формаявляется «вещью в себе» и не зависит от остальных (кроме «корневой»
3.2.1. ФормаForm_Main
Является корневой формой программы, содержит Главное меню,позволяющее в любом порядке выполнять все необходимые действия, а такжесохранять и завершать работу программы.
/>
3.2.2. Форма Form_Koeff
В этой форме задаются коэффициенты многочлена.
Замечание. Для задания коэффициента а0необходимо указать значение степени х равным 0.
/>
3.2.3.Форма Form_Mnogo
/> <td/> />Выводит на экран общий видзаданного многочлена, а также производных первого и второго порядков
3.2.4.Форма Form_WP
Эта форма по существу является панелью управления в режимеграфика и позволяет его распечатать или закрыть.
/>
3.2.5. ФормаForm_Korni
«Основная форма» – именно в ней заключен сам алгоритм поискакорней (SubFindKor) методами бисекции и хорд/касательных.
/>
В качестве свойств в объекте «форма» присутствуюттри ключевые процедуры, реализующие собственно алгоритмы нахождения корней и нахожденияпроизводной.
Publicsub FF* – процедура, «ответственная» занахождение производной.
Publicsub Horda_Kasatelnye –процедура, реализующая поиск корней по алгоритму хорд и касательных.
Publicsub Find_Kor – процедура,реализующая поиск корней по алгоритму половинного деления отрезка.
Замечание. Алгоритмы нахождения крней описаны вглаве 2. Суть же алгоритма нахождения производной сводится к простому перемножениюкоэффициента и степени и уменьшению значения степени на единицу. Это позволяеткорректно определить производную, при этом корректно «избавиться» от конечнойконстанты.
4. АНАЛИЗ РЕЗУЛЬТАТОВ
В результате выполнения задания накурсовую работу была создана программа VI Function 2.0 , находящая корни алгебраическогомногочлена вида (1) с указываемой точностью посредством следующих методов:
· метод деленияотрезка пополам;
· метод хорд икасательных (комбинированный)
Также при составлении программы былаучтена возможность наличия у многочлена кратных корней, и средства ихобнаружения также вошли в состав программы.
Фактические результаты совпали сформальными.
5. СПИСОК ЛИТЕРАТУРЫ
1. Гутер Р.С.,Овчинский Б.В. «Элементы численного анализа и математический обработкирезультатов опыта». Москва, «Наука», 1979
2. Калиткин Н.Н.«Численные методы». Москва, «Наука», 1978
3. Крылов В.И.,БабковВ.В., Монастырский П.И. «Вычислительные методы». Москва, «Наука», 1976
4. П. Санна. «Visual Basic forApplications 6.0 «вподлиннике», Киев, BHV
6. ПРИЛОЖЕНИЯ
6.1. Пример алгебраического многочлена и нахождения его
корней
Многочлен F(x) = 3x2+5x-8
График представлен на рис. 6.1/>Точность Q = 0,0001
Найденные корни x = -2,66666669921875 метод
/> x=0,99991015625 бисекции
Найденные корни x = -2,66667654214111 метод
x= 0,99981915025 хорди касательных
/>
рис.6.1
6.2. Блок-схема алгоритма половинногоделения
A = левая граница
В = правая граница
C – середина
F(x) — функция
/>
6.3. Блок-схема алгоритма поиска корнейметодом хорд и касательных
A = левая граница
В = правая граница
F(x) — функция
/>
6.4 Руководство пользователя.
После запуска программы перед Вами появится Главное меню,включающее в себя следующие пиктограммы:
СОХРАНИТЬ Сохраняет файл со всеми сделанными изменениямиПРОСМОТР ФУНКЦИИ
Выводит на экран окно, в котором отображается вид многочлена, а также вид производных первого и второго порядков (Выбор осужествляется нажатием кнопок F’(X), F”(X), F(X)ВВОД КОЭФФИЦИЕНТОВ
Выводит на экран окно ввода коэффициентовГРАФИК
Выводит график функцииПОИСК КОРНЕЙ
Отображает окно, управляющее поиском корнейО ПРОГРАММЕ
Выводит окно «О программе»ВЫХОД
Завершает работу програмы, предварительнозадавая вопрос о сохранении измененийВвод коэффициентов осуществляется следующим образом: впоявившемся окне имеются 2 поля – одно для указания степени, другое для вводасобственно коэффициента. Если Вы уже вводили некоторую функцию, то для ееудаления нажмите кнопку “очистить”, для запоминания коэффициента нажмите “Ок”,для завершеня ввода – “завершить”.
Поиск корней упрощен до предела. Вам достаточноуказать неоюходимую точность и выбрать метод поиска: бисекционый иликомбинированный.
6.5. Исходный текст программы
UNIT1
Dimcurcell As Range
Dim ma AsDouble
Dim Ao AsDouble
PublicFunction F(x As Variant)
F = (x ^20 * Range(«a20»).Value) + (x ^ 19 * Range(«a19»).Value) +(x ^ 18 * Range(«a18»).Value) + (x ^ 17 *Range(«a17»).Value) + (x ^ 16 * Range(«a16»).Value) + (x ^15 * Range(«a15»).Value) + (x ^ 14 * Range(«a14»).Value) +(x ^ 13 * Range(«a13»).Value) + (x ^ 12 *Range(«a12»).Value) + (x ^ 11 * Range(«a11»).Value) + (x ^10 * Range(«a10»).Value) + (x ^ 9 * Range(«a9»).Value) + (x^ 8 * Range(«a8»).Value) + (x ^ 7 * Range(«a7»).Value) + (x^ 6 * Range(«a6»).Value) + (x ^ 5 * Range(«a5»).Value) + (x^ 4 * Range(«a4»).Value) + (x ^ 3 * Range(«a3»).Value) + (x^ 2 * Range(«a2»).Value) + (x * Range(«a1»).Value) +Range(«a21»).Value
EndFunction
PublicFunction F1(x As Variant)
F1 = (x ^20 * Range(«j20»).Value) + (x ^ 19 * Range(«j19»).Value) +(x ^ 18 * Range(«j18»).Value) + (x ^ 17 *Range(«j17»).Value) + (x ^ 16 * Range(«j16»).Value) + (x ^15 * Range(«j15»).Value) + (x ^ 14 * Range(«j14»).Value) +(x ^ 13 * Range(«j13»).Value) + (x ^ 12 * Range(«j12»).Value)+ (x ^ 11 * Range(«j11»).Value) + (x ^ 10 *Range(«j10»).Value) + (x ^ 9 * Range(«j9»).Value) + (x ^ 8* Range(«j8»).Value) + (x ^ 7 * Range(«j7»).Value) + (x ^ 6* Range(«j6»).Value) + (x ^ 5 * Range(«j5»).Value) + (x ^ 4* Range(«j4»).Value) + (x ^ 3 * Range(«j3»).Value) + (x ^ 2* Range(«j2»).Value) + (x * Range(«j1»).Value) +Range(«j21»).Value
EndFunction
PublicFunction F2(x As Variant)
F2 = (x ^20 * Range(«m20»).Value) + (x ^ 19 * Range(«m19»).Value) +(x ^ 18 * Range(«m18»).Value) + (x ^ 17 *Range(«m17»).Value) + (x ^ 16 * Range(«m16»).Value) + (x ^15 * Range(«m15»).Value) + (x ^ 14 * Range(«m14»).Value) +(x ^ 13 * Range(«m13»).Value) + (x ^ 12 *Range(«m12»).Value) + (x ^ 11 * Range(«m11»).Value) + (x ^10 * Range(«m10»).Value) + (x ^ 9 * Range(«m9»).Value) + (x^ 8 * Range(«m8»).Value) + (x ^ 7 * Range(«m7»).Value) + (x^ 6 * Range(«m6»).Value) + (x ^ 5 * Range(«m5»).Value) + (x^ 4 * Range(«m4»).Value) + (x ^ 3 * Range(«m3»).Value) + (x^ 2 * Range(«m2»).Value) + (x * Range(«m1»).Value) +Range(«m21»).Value
EndFunction
PublicSub Gra()
Sheets(«Лист1»).Select
Range(«e1»).Select
For i =-10 To 10
ActiveCell.Value= F(i)
ActiveCell.Cells(2).Select
Next i
End Sub
PublicFunction DetectBorders()
' Функцияопределения границ действительных корней
ma = 0
For Eachcurcell In Range(«Koeffs»)
Ifcurcell.Value > ma Then ma = curcell.Value
Ifcurcell.Value <> 0 Then Ao = curcell.Value
Nextcurcell
DetectBorders= 1 + (ma * Ao)
EndFunction
UNIT2
Subauto_open()
Sheets(«Лист1»).Select
Form_Main.Show
End Sub
FORM_ABOUT
PrivateSub CommandButton1_Click()
Form_About.Hide
End Sub
FORM_KOEFF
PrivateSub CommandButton1_Click()
ko =TextBox1.Value
st =TextBox2.Value
SelectCase st
Case0
Range(«A21»).Value = ko
Case1
Range(«A1»)= ko
Case2
Range(«A2») = ko
Case3
Range(«A3») = ko
Case4
Range(«A4») = ko
Case5
Range(«A5») = ko
Case6
Range(«A6») = ko
Case7
Range(«A7») = ko
Case8
Range(«A8») = ko
Case9
Range(«A9») = ko
Case10
Range(«A10») = ko
Case11
Range(«A11») = ko
Case12
Range(«A12») = ko
Case13
Range(«A13») = ko
Case14
Range(«A14») = ko
Case15
Range(«A15»)= ko
Case16
Range(«A16») = ko
Case17
Range(«A17») = ko
Case18
Range(«A18») = ko
Case19
Range(«A19») = ko
Case20
Range(«A20») = ko
CaseElse
MsgBox («Выход за пределы допустимых значений»)
st = st — 1
EndSelect
TextBox1.Value= 0
TextBox2.Value= st + 1
End Sub
PrivateSub CommandButton2_Click()
Form_Koeff.Hide
End Sub
PrivateSub CommandButton3_Click()
Range(«a1»).Value= 0
Range(«a2»).Value= 0
Range(«a3»).Value= 0
Range(«a4»).Value= 0
Range(«a5»).Value= 0
Range(«a6»).Value= 0
Range(«a7»).Value= 0
Range(«a8»).Value= 0
Range(«a9»).Value= 0
Range(«a10»).Value= 0
Range(«a11»).Value= 0
Range(«a12»).Value= 0
Range(«a13»).Value= 0
Range(«a14»).Value= 0
Range(«a15»).Value= 0
Range(«a16»).Value= 0
Range(«a17»).Value= 0
Range(«a18»).Value= 0
Range(«a19»).Value= 0
Range(«a20»).Value= 0
Range(«a21»).Value= 0
End Sub
PrivateSub UserForm_initialize()
st = 0
ko = 0
TextBox1.Value= ko
TextBox2.Value= st
End Sub
FORM_KORNI
PrivateSub CommandButton1_Click()
ListBox1.Clear
TextBox1.Value= 0
Form_Korni.Hide
End Sub
PrivateSub CommandButton2_Click()
Range(«Toc»).Value= TextBox1.Value
CallFindKor
'CallPerenos
End Sub
SubFindKor()
Range(«Curright»)= Range(«Right»).Value
Range(«Curleft»)= -Range(«Right»).Value — 0.333
'Range(«right»).Value= DetectBorders
Range(«Stepleft»).Value= Range(«right»).Value * (-1) — 0.333
Do
nashli =False
CallMoveLe
IfSgn(F(Range(«curleft»).Value)) =Sgn(F(Range(«curright»).Value)) Then
End If
IfSgn(F(Range(«curleft»).Value)) <>Sgn(F(Range(«curright»).Value)) Then
Do
' nashli = True
Range(«Curcenter»).Value = ((Range(«curleft»).Value) +(Range(«curright»).Value)) / 2
IfAbs(F(Range(«Curcenter»).Value)) > Range(«toc»).ValueThen If Sgn(F(Range(«curleft»).Value)) <>Sgn(F(Range(«curcenter»).Value)) ThenRange(«curright»).Value = Range(«curcenter»).Value Else:Range(«curleft»).Value = Range(«curcenter»).Value
If Abs(F(Range(«Curcenter»).Value))<= Range(«toc»).Value Then ListBox1.AddItem(Range(«Curcenter»).Value)
Range(«Koren»).Value = Range(«Curcenter»).Value
LoopUntil Abs(F(Range(«Curcenter»).Value)) <=Range(«toc»).Value
End If
LoopUntil Range(«Stepleft»).Value > Range(«right»).Value Ornashli = True
End Sub
SubHorda_Kas()
'SubFindKor()
Range(«Curright»)= Range(«Right»).Value
Range(«Curleft»)= -Range(«Right»).Value — 0.333
'Range(«right»).Value= DetectBorders
Range(«Stepleft»).Value= Range(«right»).Value * (-1) — 0.333
Do
MoveLe
IfSgn(F(Range(«curleft»).Value)) <>Sgn(F(Range(«curright»).Value)) Then
Do
' nashli = True
IfF1(Range(«curleft»).Value) * F2(Range(«curleft»).Value)> 0 Then
Range(«curleft»).Value = Range(«curleft»).Value — ((Range(«curright»).Value — Range(«curleft»).Value) *(F(Range(«Curleft»).Value) / (F(Range(«Curright»).Value — F(Range(«Curleft»).Value)))))
Range(«Curright»).Value = Range(«curright»).Value — F(Range(«curright»).Value) / F1(Range(«curright»).Value)
End If
IfF1(Range(«curleft»).Value) * F2(Range(«curleft»).Value)< 0 Then
Range(«curright»).Value = Range(«curleft»).Value — ((Range(«curright»).Value — Range(«curleft»).Value) *(F(Range(«Curleft»).Value) / (F(Range(«Curright»).Value — F(Range(«Curleft»).Value)))))
Range(«Curleft»).Value = Range(«curright»).Value — F(Range(«curright»).Value) / F1(Range(«curright»).Value)
End If
IfAbs(Abs(F(Range(«Curright»).Value))) — Abs(F(Range(«Curleft»).Value)) <= Range(«toc»).Value Then
'MsgBox (Range(«curleft»).Value)
ListBox1.AddItem (Range(«Curright»).Value)
'If ((Range(«Curleft»).Value) + (Range(«Curright»).Value))> 0 Then ListBox1.AddItem (((Range(«Curleft»).Value) +(Range(«Curright»).Value)) / 2)
'If ((Range(«Curleft»).Value) + (Range(«Curright»).Value))< 0 Then ListBox1.AddItem (((Range(«Curleft»).Value) +(Range(«Curright»).Value)) / 2)
Range(«Koren»).Value = Range(«Curleft»).Value
EndIf
LoopUntil Abs(F(Range(«Curright»).Value)) — Abs(F(Range(«Curleft»).Value))<= Range(«toc»).Value
End If
LoopUntil Range(«Stepleft»).Value > Range(«right»).Value Ornashli = True
End Sub
SubMoveLe()
Range(«stepleft»).Value = Range(«stepleft»).Value + 0.333
Range(«curLeft»).Value = Range(«stepleft»).Value
Range(«Curright»).Value = Range(«Curleft»).Value + 0.333
Range(«Curcenter»).Value = ((Range(«curleft»).Value) +(Range(«curright»).Value)) / 2
End Sub
PrivateSub CommandButton3_Click()
Horda_Kas
End Sub
PrivateSub UserForm_Deactivate()
ListBox1.Clear
TextBox1.Value= 0
End Sub
SubPerenos()
Range(«a1»).Value= Range(«L1»).Value
Range(«a2»).Value= Range(«L2»).Value
Range(«a3»).Value= Range(«L3»).Value
Range(«a4»).Value= Range(«L4»).Value
Range(«a5»).Value= Range(«L5»).Value
Range(«a6»).Value= Range(«L6»).Value
Range(«a7»).Value= Range(«L7»).Value
Range(«a8»).Value= Range(«L8»).Value
Range(«a9»).Value= Range(«L9»).Value
Range(«a10»).Value= Range(«L10»).Value
Range(«a11»).Value= Range(«L11»).Value
Range(«a12»).Value= Range(«L12»).Value
Range(«a13»).Value= Range(«L13»).Value
Range(«a14»).Value= Range(«L14»).Value
Range(«a15»).Value= Range(«L15»).Value
Range(«a16»).Value= Range(«L16»).Value
Range(«a17»).Value= Range(«L17»).Value
Range(«a18»).Value= Range(«L18»).Value
Range(«a19»).Value= Range(«L19»).Value
End Sub
FORM_MAIN
PrivateSub CommandButton1_Click()
Form_Koeff.Show
End Sub
PrivateSub CommandButton2_Click()
Form_Mnogo.Show
End Sub
PrivateSub CommandButton3_Click()
Gra
Form_Main.Height= 84
Sheets(«D1»).Select
Form_WP.Show
Form_Main.Height= 360
Sheets(«Лист1»).Select
End Sub
PrivateSub CommandButton4_Click()
Form_Korni.Show
End Sub
PrivateSub CommandButton5_Click()
Application.Quit
End Sub
PrivateSub CommandButton7_Click()
Form_About.Show
End Sub
PrivateSub CommandButton8_Click()
ActiveWorkbook.Save
End Sub
PrivateSub UserForm_initialize()
Sheets(«Лист1»).Select
Form_Main.Height= 360
End Sub
FORM_MNOGO
Dim mn AsString
PrivateSub CommandButton1_Click()
Form_Mnogo.Hide
End Sub
PrivateSub UserForm_activate()
mn =«F(x)=»
If Range(«a20»)> 0 Then mn = mn + Range(«a20»).Text + «X^20»
IfRange(«a20») < 0 Then mn = mn + Range(«a20»).Text +«X^20»
IfRange(«a19») > 0 Then mn = mn + " + " +Range(«a19»).Text + «X^19»
IfRange(«a19») < 0 Then mn = mn + Range(«a19»).Text +«X^19»
If Range(«a18»)> 0 Then mn = mn + " + " + Range(«a18»).Text +«X^18»
IfRange(«a18») < 0 Then mn = mn + Range(«a18»).Text +«X^18»
IfRange(«a17») > 0 Then mn = mn + " + " +Range(«a17»).Text + «X^17»
IfRange(«a17») < 0 Then mn = mn + Range(«a17»).Text +«X^17»
IfRange(«a16») > 0 Then mn = mn + " + " +Range(«a16»).Text + «X^16»
IfRange(«a16») < 0 Then mn = mn + Range(«a16»).Text +«X^16»
IfRange(«a15») > 0 Then mn = mn + " + " +Range(«a15»).Text + «X^15»
IfRange(«a15») < 0 Then mn = mn + Range(«a15»).Text +«X^15»
IfRange(«a14») > 0 Then mn = mn + " + " +Range(«a14»).Text + «X^14»
IfRange(«a14») < 0 Then mn = mn + Range(«a14»).Text +«X^14»
IfRange(«a13») > 0 Then mn = mn + " + " +Range(«a13»).Text + «X^13»
IfRange(«a13») < 0 Then mn = mn + Range(«a13»).Text +«X^13»
IfRange(«a12») > 0 Then mn = mn + " + " +Range(«a12»).Text + «X^12»
IfRange(«a12») < 0 Then mn = mn + Range(«a12»).Text +«X^12»
IfRange(«a11») > 0 Then mn = mn + " + " +Range(«a11»).Text + «X^11»
IfRange(«a11») < 0 Then mn = mn + Range(«a11»).Text +«X^11»
IfRange(«a10») > 0 Then mn = mn + " + " +Range(«a10»).Text + «X^10»
IfRange(«a10») < 0 Then mn = mn + Range(«a10»).Text +«X^10»
IfRange(«a9») > 0 Then mn = mn + " + " +Range(«a9»).Text + «X^9»
IfRange(«a9») < 0 Then mn = mn + Range(«a9»).Text +«X^9»
IfRange(«a8») > 0 Then mn = mn + " + " +Range(«a8»).Text + «X^8»
IfRange(«a8») < 0 Then mn = mn + Range(«a8»).Text +«X^8»
IfRange(«a7») > 0 Then mn = mn + " + " +Range(«a7»).Text + «X^7»
IfRange(«a7») < 0 Then mn = mn + Range(«a7»).Text +«X^7»
IfRange(«a6») > 0 Then mn = mn + " + " +Range(«a6»).Text + «X^6»
IfRange(«a6») < 0 Then mn = mn + Range(«a6»).Text +«X^6»
IfRange(«a5») > 0 Then mn = mn + " + " +Range(«a5»).Text + «X^5»
IfRange(«a5») < 0 Then mn = mn + Range(«a5»).Text +«X^5»
IfRange(«a4») > 0 Then mn = mn + " + " +Range(«a4»).Text + «X^4»
IfRange(«a4») < 0 Then mn = mn + Range(«a4»).Text +«X^4»
IfRange(«a3») > 0 Then mn = mn + " + " +Range(«a3»).Text + «X^3»
IfRange(«a3») < 0 Then mn = mn + Range(«a3»).Text +«X^3»
IfRange(«a2») > 0 Then mn = mn + " + " +Range(«a2»).Text + «X^2»
IfRange(«a2») < 0 Then mn = mn + Range(«a2»).Text +«X^2»
IfRange(«a1») > 0 Then mn = mn + " + " +Range(«a1»).Text + «X»
IfRange(«a1») < 0 Then mn = mn + Range(«a8»).Text +«X»
IfRange(«a21») > 0 Then mn = mn + " + " +Range(«a21»).Text
IfRange(«a21») < 0 Then mn = mn + Range(«a21»).Text
TextBox1.Value= mn
End Sub
FORM_WP
PrivateSub Label1_Click()
Call Gra
End Sub
PrivateSub CommandButton1_Click()
Sheets(«D1»).Print
End Sub
PrivateSub CommandButton2_Click()
Form_WP.Hide
Call Gra
End Sub
PrivateSub UserForm_Click()
Form_WP.Hide
End Sub
____________________________
VoID InVaSiON HG ©
VI Function 2.0 beta