Методика применения таблицы
Решение путём написания программы
1. 3.1 Блок схема программы и блок-схемы алгоритма поиска Решения
Вычисление функции: Вычисление производной функции:
Определение знака:
да
Начало кнопки:
да нет нет нет
Алгоритм бисекций:
да
да нет
Метод Ньютона:
нет да
1. 3.2 Руководство пользователя Программа реализована с использование графического интерфейса вид которого представлен на рис. 1. Рис. 1. Вид окна программы Рассмотрим её поподробнее. Окно интерфейса представляет собой две части – панель управления (слева) и область вывода результатов (справа). На панели управления имеются поля ввода нижней и верхней границы поиска решения, а также позволяется указать результирующую точность, от которой зависит то, как долго будет выполняться алгоритм. Также программа через выпадающий список позволяет выбрать несколько способов решения: 1. методом бисекций; 2. методом Ньютона; 3. обоими методами одновременно; Поиск решения сразу двумя методами удобен в случае если необходимо сравнить оба метода (количество затраченных итерация, а значит трудоёмкость и время выполнения). Стандартные поля ввода чисел среды PascalABC не позволяют вводить пользователю символы не соответствующие формату вещественного числа. Таким образом реализована защита от ввода некорректных данных. Тем не менее, пользователь по-прежнему может допустить ошибку, введя в поле «нижняя граница» значение превышающее содержимое поля «верхняя граница». На данный случай предусмотрена программная проверка введённых значений и в случае ошибки в область результатов выводится сообщение об ошибке: «ОШИБКА! Левая граница больше или равна правой границе. Поиск решения невозможен.».
По нажатию на кнопку «вычислить» запускается функция поиска решения выбранным способом (способами). В ходе вычислений в область результатов выводится каждая итерация и текущее значение решения. По завершению работы алгоритма, когда решение удовлетворяет заданной точности, выводится ответ и количество затраченных итераций. 1. 3.3 Тексты программы uses FormsABC;
Var text_common:= new TextLabel('Границы поиска'); f1:= new FlowBreak(4); text_a:= new RealField('нижняя:'); text_b:= new RealField('верхняя:'); f2:= new FlowBreak(); text_e:= new RealField('точность:'); cb:= new ComboBox; but:= new Button('Вычислить'); tb: TextBox; s: string;
// F(x) = sin(x)/cos(x) - 2*x function CalcF(x: real): real; Begin CalcF:= sin(x)/cos(x)-2*x; end;
// F'(x) = 1/cos(x)^2 - 2; function CalcFDer(x: real): real; Begin CalcFDer:= 1/(cos(x)*cos(x)) - 2; end;
function Sign(x: real): boolean; Begin if x<0 then Sign:= true else Sign:= false; end;
function AlgBi(l: real; r: real; e: real): real; Var dx: real; m: real; fl: real; fr: real; fm: real; i: integer; Begin dx:= r-l; i:=0; tb.AddLine('Начало поиска решения функции "tan(x) - 2*x = 0" методом бисекций'); tb.AddLine('На интервале ['+l.ToString()+'; '+r.ToString()+'] и с точностью e = '+ e.ToString()); tb.AddLine('------------------------'); while dx > e do Begin i:= i+1; dx:= r-l; m:= l+dx/2; fl:= CalcF(l); fr:= CalcF(r); fm:= CalcF(m); if Sign(fl) <> Sign(fm) then r:= m Else l:= m; tb.AddLine('Шаг '+ i.ToString()+ ': x = '+ m.ToString()+' y = ' + fm.ToString()); end; AlgBi:= m; tb.AddLine('------------------------'); tb.AddLine('Ответ: x = '+ m.ToString()+' y = ' + fm.ToString()); tb.AddLine('Количество итераций:'+i.ToString());
end;
function AlgNuton(l: real; r: real; e: real): real; Var xn: real; yn: real; i: integer; Begin xn:= l; tb.AddLine('Начало поиска решения функции "tan(x) - 2*x = 0" методом Ньютона'); tb.AddLine('На интервале ['+l.ToString()+'; '+r.ToString()+'] и с точностью e = '+ e.ToString()); tb.AddLine('------------------------'); i:=0; yn:= CalcF(xn); while abs(yn)>e do Begin i:= i+1; xn:= xn - CalcF(xn)/CalcFDer(xn); yn:= CalcF(xn); tb.AddLine('Шаг '+ i.ToString()+ ': x = '+ xn.ToString()+' y = ' + yn.ToString()); end; tb.AddLine('------------------------'); tb.AddLine('Ответ: x = '+ xn.ToString()+' y = ' + yn.ToString()); tb.AddLine('Количество итераций:'+i.ToString()); end;
procedure MyClick; Begin tb.Text:= ''; if text_a.Value >= text_b.Value then tb.AddLine('ОШИБКА! Левая граница больше или равна правой границе. Поиск решения невозможен.') Else if cb.SelectedIndex = 0 then AlgBi(text_a.Value,text_b.Value, text_e.Value) Else if cb.SelectedIndex = 1 then AlgNuton(text_a.Value,text_b.Value, text_e.Value) Else Begin AlgBi(text_a.Value,text_b.Value, text_e.Value); tb.AddLine(' '); AlgNuton(text_a.Value,text_b.Value, text_e.Value); end; end;
Begin MainForm.Title:= 'Расчетно-графическая работа по курсу "Информатика"'; MainForm.SetSize(900,650); MainForm.SetPos(50,50); //CenterOnScreen; MainPanel.Dock:= DockStyle.Left; mainPanel.Width:= 150; text_a.Value:= -1.5; text_b.Value:= -1; text_e.Value:= 0.001; cb.Items.Add('Бисекция'); cb.Items.Add('Метод Ньютона'); cb.Items.Add('Оба метода'); cb.SelectedIndex:= 0; but.Click += MyClick; ParentControl:= MainForm; tb:= new TextBox; tb.Dock:= DockStyle.Fill; end. 1. 3.4 Тестовая задача и результаты прогона тестовой задачи Для теста рассмотрим отрезок [-7.8; -7], на котором имеется корень. Прогон задачи выполним обоими методами и сравним полученные результаты. Значение точности возьмём равным 0,00001. Результат работы программы выглядит в соответствующем окне вывода следующим образом:
Начало поиска решения функции "tan(x) - 2*x = 0" методом бисекций На интервале [-7,85; -7] и с точностью e = 1E-05 ------------------------ Шаг 1: x = -7,425 y = 12,6636773712085 Шаг 2: x = -7,6375 y = 10,7280574967418 Шаг 3: x = -7,74375 y = 6,45246766370812 Шаг 4: x = -7,796875 y = -1,89831069742299 Шаг 5: x = -7,7703125 y = 3,61668895767885 Шаг 6: x = -7,78359375 y = 1,38366736623335 Шаг 7: x = -7,790234375 y = -0,0852253981391389 Шаг 8: x = -7,7869140625 y = 0,685855067447896 Шаг 9: x = -7,78857421875 y = 0,31017073527757 Шаг 10: x = -7,789404296875 y = 0,11503165980754 Шаг 11: x = -7,7898193359375 y = 0,0155552934458996 Шаг 12: x = -7,79002685546875 y = -0,034670424595431 Шаг 13: x = -7,78992309570312 y = -0,00951660863097281 Шаг 14: x = -7,78987121582031 y = 0,00302955678566974 Шаг 15: x = -7,78989715576172 y = -0,00324096922705053 Шаг 16: x = -7,78988418579102 y = -0,000105067434823525 Шаг 17: x = -7,78987770080566 y = 0,00146240432342459 Шаг 18: x = -7,78988094329834 y = 0,00067870836246442 ------------------------ Ответ: x = -7,78988094329834 y = 0,00067870836246442 Количество итераций:18
Начало поиска решения функции "tan(x) - 2*x = 0" методом Ньютона На интервале [-7,85; -7] и с точностью e = 1E-05 ------------------------ Шаг 1: x = -7,84626718695971 y = -113,931813352194 Шаг 2: x = -7,83948612536083 y = -53,3030818286909 Шаг 3: x = -7,82828217048065 y = -23,2461869326 Шаг 4: x = -7,81291201894785 y = -8,70938578474401 Шаг 5: x = -7,79818037165071 y = -2,30577651879819 Шаг 6: x = -7,79096323920564 y = -0,265444441820055 Шаг 7: x = -7,78990205215909 y = -0,00442516094602929 Шаг 8: x = -7,78988375640581 y = -1,27179509590292E-06 ------------------------ Ответ: x = -7,78988375640581 y = -1,27179509590292E-06 Количество итераций:8 Очевидно, что метод Ньютона работает быстрее, поскольку сходится за меньшее количество итераций.
1. 4 Решение таблицей в Excel Структура таблицы Таблица в Excel выполнена с использованием автоматизирующего макроса и имеет 2 части – непосредственно таблицу с данными и таблицу с полями, в которые вводятся граничные значения и количество точек (строк в таблице данных). Таблица данных имеет следующую структуру (столбцы таблицы): · x – значения по оси oX; · tan(x) – значение функции тангенса в соответствующей точке x; · 2*x – значение функции 2*x в соответствующей точке x; · tan(x)-2*x – значение искомой функции в соответствующей точке x; Таблица ввода граничных значений и точности выглядит следующим образом:
Таблица в виде формул Поскольку заполнение таблицы Excel производится с помощью макроса, то удобнее заполнять таблицу непосредственно вычисленными значениями. Однако рассмотрим, как можно было бы заполнить таблицу в виде формул. Таблица имеет четыре столбца. Первый из них это значения x, которые меняются с определённым шагом и на определённом отрезке значений. Определим формулы Excel для остальных трёх столбцов относительно значения x, которое находится в ячейке A1: Таблица 1. Формулы для таблицы Excel
Макрос Как уже отмечалось, таблица Excel заполняется при помощи простого макроса написанного на языке VBA стандартными средствами среды MS Excel. Также данный макрос обновляет диаграммы. Рассмотрим последовательно действия макроса.
Прежде всего, макрос делает активным страницу на которой расположены все таблицы и диаграммы. Называется эта страница «List». После это в соответствующие переменные записываются значения правой и левой границы, а также точности (количества строк в таблице данных). На основе входных данных вычисляется шаг, на который меняется значение в столбце с X. После этого макрос используя цикл заполняет таблицу данных, автоматически вычисляя значения полей. Цикл выполняет ровно столько итераций, сколько указано в поле «Точность». Когда таблица сформирована можно обновлять данные в диаграммах. Для каждой диаграммы обновляется диапазон значений исходных данный, в результате чего диаграммы автоматически перестраиваются. Код макроса приведён ниже: Sub CalcPolya() Worksheets.Item("List").Activate a = Range("G1") b = Range("G2") e = Range("G3") step = (b - a) / e temp = a Range("A1").Select For i = 1 To e ActiveSheet.Cells(i + 1, 1) = temp ActiveSheet.Cells(i + 1, 2) = Tan(temp) ActiveSheet.Cells(i + 1, 3) = 2 * temp ActiveSheet.Cells(i + 1, 4) = Tan(temp) - 2 * temp
temp = temp + step Next i
' tan(x)-2*x ActiveSheet.ChartObjects(1).Activate ActiveChart.SeriesCollection(1).XValues = ActiveSheet.Range(Cells(2, 1), Cells(e, 1)) ActiveChart.SeriesCollection(1).Values = ActiveSheet.Range(Cells(2, 4), Cells(e, 4))
' tan(x) 2*x ActiveSheet.ChartObjects(2).Activate ActiveChart.SeriesCollection(1).XValues = ActiveSheet.Range(Cells(2, 1), Cells(e, 1)) ActiveChart.SeriesCollection(1).Values = ActiveSheet.Range(Cells(2, 2), Cells(e, 2)) ActiveChart.SeriesCollection(2).XValues = ActiveSheet.Range(Cells(2, 1), Cells(e, 1)) ActiveChart.SeriesCollection(2).Values = ActiveSheet.Range(Cells(2, 3), Cells(e, 3))
' tan(x) tan(x)-2*x ActiveSheet.ChartObjects(3).Activate ActiveChart.SeriesCollection(1).XValues = ActiveSheet.Range(Cells(2, 1), Cells(e, 1)) ActiveChart.SeriesCollection(1).Values = ActiveSheet.Range(Cells(2, 2), Cells(e, 2)) ActiveChart.SeriesCollection(2).XValues = ActiveSheet.Range(Cells(2, 1), Cells(e, 1)) ActiveChart.SeriesCollection(2).Values = ActiveSheet.Range(Cells(2, 4), Cells(e, 4))
End Sub Таблица результатов Рассмотрим таблицу данных сформированную макросом для диапазона [-7.8; -7] и для точности равной 10. Таблица 2. Пример таблицы данных
Стоит отметить, что 10 значений явно недостаточно для определения точного результата, который, судя по таблице, расположен в диапазоне [-7.8; -7.72].
График результатов На рис. 2-5 представлены диаграммы, которые формируются в результате заполнения таблицы данных. В данном случае диаграммы сформированы для отрезка [-7.8; -7] и для точности равной 1000 (что значительно больше 10 и выбрано для большей плавности графиков). На первой диаграмме легко увидеть место F(x) = 0. Более точно место пересечения можно рассмотреть установив границы поиска на отрезке [-7.8; -7.78]. Исходя из рис. 5 корень функции в точке x = -7.79.
Следующие две диаграммы отражают сравнение двух функций. На рис. 3 можно увидеть место пересечения двух функций, а на рис. 4 продемонстрированы диаграммы tan(x) и tan(x)-2*x. Рис. 2. Диаграмма tan(x)-2*x на отрезке [-7.8; -7] Рис. 3. Пересечение функций tan(x) и 2*x на отрезке [-7.8; -7]
Рис.4. Сравнение функций tan(x) и tan(x)-2*x на отрезке [-7.8; -7] Рис.5. Увеличенная часть диаграммы tan(x)-2*x на отрезке [-7.8; -7.78]
Методика применения таблицы Для получения результата нужно ввести значения левой границы, правой границы и задать точность. Затем нужно нажать «обновить диаграммы». После нажатия обновляются значения таблицы. Результаты можно увидеть на графиках, которые также обновляются. Выводы Сравнение результатов Рассмотрим сравнение метода Ньютона и метода бисекции. Метод Ньютона сходится быстрее, так как имеет меньшее количество шагов. Минус метода Ньютона: наличие в итерационной формуле производной – производную не каждой функции можно определить. Рассмотрим сравнение метода решения задачи через написание программы и через построение таблицы. Решение через написание программы имеет более точный результат при минимальном приложении усилий по поиску корня. При этом таблицы являются более наглядной формой представления за счёт графиков. При помощи графиков можно определить положение корней, но добиться высокой точности решения весьма затруднительно Сравнение методов решения Трудоёмкость разработки Отметим, что и при реализации программы в среде PascalABC и при реализации в Excel была написана некоторая программа, автоматизирующая процесс поиска решения. В случае программирования на PascalABC, была написана полноценная программа с интерфейсом и реализацией итерационных методов решения. В случае Excel программа представляет собой обычный макрос автоматизирующий процесс заполнения таблицы на основе введённых данных. Поскольку задача возлагаемая на макрос гораздо проще той, которая реализована в программе на Pascal, то и количество строк кода в макросе соответственно значительно меньше, чем в программе. В этом смысле можно сказать, что реализация поиска решения в таблицах Excel менее трудоёмка, чем написание программы на Pascal. Однако, это полностью справедливо лишь для разработчика имеющего опыт написания макросов в Excel на языке VBA. У человека не имеющего опыта разработки макросов могут возникнуть затруднения с поиском информации по корректной реализации определённых действий макроса. В случае данной работы были некоторые затруднения при поиске информации по автоматическому обновлению значений в диаграммах. В этом смысле программирование на PascalABC было менее затруднительным, поскольку на официальном сайте была найдена вся необходимая информация для реализации программы. Трудоёмкость применения Поскольку процесс построения таблицы в Excel был максимально автоматизирован, то и неудобство использования таблиц было сведено к минимуму. При этом метод построения таблиц по прежнему имеет некоторые недостатки: · маленькую точность решения даже при больших значения количества точек; · неудобства при поиске минимального значения в таблице, которые соответствуют наиболее точному решению. Несомненно, поиск минимального значения в таблице также может быть реализован в виде максроса, однако это выходит за рамки данной работы. Поиск результата итерационными методами в программе на языке Pascal сразу даёт пользователю точный результат, что гораздо удобнее. Также стоит отметить то, что для поиска решения таблицами необходим запуск программы MS Excel, в то время как программа на языке Pascal может быть реализована в виде исполняемого файла (*.exe). Как правило PascalABC удаляет исполняемый файл после выполнения программы в данной среде. Однако исполняемый файл можно оставить, включив определённые настройки в параметрах среды.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|