Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Методика применения таблицы

Решение путём написания программы

 

1. 3.1 Блок схема программы и блок-схемы алгоритма поиска

Решения

 

Вычисление функции: Вычисление производной функции:

begin
CalсF=tan(x)-2*x
end
begin
CalсDerF=(1/cos )-2
end


 

 

Определение знака:

begin
X<0
Sign=true
end
Sign=false

 


да

 


Начало кнопки:

begin
Left>=ridht
CelectedIndex=0
CelectedIndex=1
AlgBi
AlgNuton
end
Tb.Addline
AlgBi  
AlgNuton  


да

нет

нет

нет

 

 

Алгоритм бисекций:

begin
I=0
dx=r-1
Addline
dx>e
m=1+dx/2
dx=r-1
i=i+1
fl=CalcF(l)  
fm=CalcF(m)
fr=CalcF(r)
Sign(fl)≠sign(fm)
R=m
Addline(“Шаг”+i+”x=”+x)
L=m
end

 


да

 

да нет

 

 

Метод Ньютона:

begin
xn=(r-1)/2
Addline
i=0
yn=CalcF(xn)
abs(yn)>e
Addline
yn=CalcF(xn)
i=i+1
xn=xn-Calc(xn)/CalcFDer(xn)
end

 

 

нет

да

 

 

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;

Таблица ввода граничных значений и точности выглядит следующим образом:

Левая граница -1,5
Правая граница -1
Точность (Количество точек)  
 
 

 

Таблица в виде формул

Поскольку заполнение таблицы Excel производится с помощью макроса, то удобнее заполнять таблицу непосредственно вычисленными значениями. Однако рассмотрим, как можно было бы заполнить таблицу в виде формул.

Таблица имеет четыре столбца. Первый из них это значения x, которые меняются с определённым шагом и на определённом отрезке значений. Определим формулы Excel для остальных трёх столбцов относительно значения x, которое находится в ячейке A1:

Таблица 1. Формулы для таблицы Excel

Поле таблицы Формула Excel
tan(x) =TAN(A1)
2*x =2*A1
tan(x)-2*x =TAN(A1) – 2*A1

 


 

Макрос

Как уже отмечалось, таблица 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. Пример таблицы данных

X tan(x) 2*x F(x) = tan(x)-2*x
-7,8 -18,50682165 -15,6 -2,906821649
-7,72 -7,418995459 -15,44 8,021004541
-7,64 -4,601752376 -15,28 10,67824762
-7,56 -3,303009864 -15,12 11,81699014
-7,48 -2,548089499 -14,96 12,4119105
-7,4 -2,049284169 -14,8 12,75071583
-7,32 -1,691251626 -14,64 12,94874837
-7,24 -1,418717332 -14,48 13,06128267
-7,16 -1,201847885 -14,32 13,11815211
-7,08 -1,023097759 -14,16 13,13690224

Стоит отметить, что 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...