Курсовая работа: Метод Золотого сечения на Delphi
Содержание
1. Введение
2. Характеристика объекта автоматизации
3. Проектная часть
Математическое описание
Описание блок-схемы алгоритма программы
Обоснование выбора языка программирования
Тестирование
Инструкция пользователя
4. Заключение
5. Приложение
1 Введение
Целью курсовой работы является вычисление приближенного значения интеграла методом Симпсона, путем ввода функции, отрезка и шага dx. История появления и развития персональных компьютеров является одним из наиболее впечатляющих явлений нашего века. С момента появления первых образцов персональных компьютеров прошло меньше 25 лет, но сейчас без них уже немыслимо огромное количество областей человеческой деятельности - экономика, управление, наука, инженерное дело, издательское дело, образование, культура и т.д. Интерес к персональным компьютерам постоянно растет, а круг их пользователей непрерывно расширяется. В число пользователей ПЭВМ вовлекаются как новички в компьютерном деле, так и специалисты по другим классам ЭВМ. Благодаря новейшим технологиям в компьютерной сфере решение инженерных, математических, технических и коммерческих задач помогает быстро и точно решить ту или иную задачу. Актуальность решения задачи методом Симпсона с помощью ПЭВМ для учебных заведений – является быстрота и точность решения определенного интеграл от функции, имеющей неэлементарную первообразную.
2 Характеристика объекта автоматизации
Объектами автоматизации являются учебные заведения, оснащенные компьютеризированной аудиторией. Автоматизация учебного процесса для решения задач по предмету – численные методы.
Темпы научно – технического прогресса, усиление роли науки в значительной степени определяются качеством и номенклатурой средств вычислительной техники и их программным обеспечением. Именно развитие этих средств обеспечивает успехи в автоматизации производственных процессов, в разработке новых технологий, в повышении эффективности труда и управления, в совершенствовании системы образования и в ускорении подготовки кадров. Использования компьютера в процессе обучения математики позволяет реализовать возможности новейших педагогических технологий личностно-ориентированного обучения. Благодаря математическому программированию появилась возможность расширить учебный план благодаря быстрому и качественному решению математических задач на компьютере.
Решая проблему использования компьютера в процессе обучения математики, следует исходить не столько из функциональных возможностей компьютера и желания использовать его в учебном процессе, сколько из методической системы обучения математики, анализ которой должен показать, какие учебные задачи могут быть решены только средствами компьютера, ибо другие дидактические средства менее эффективны или вообще не применимы.
Обучение с использование компьютерной техники носит диалоговый характер, при котором учитель в любой момент может внести коррективы. На занятиях хорошо сочетаются индивидуальная и групповая форма работы. Ученики находятся в состоянии комфорта при работе на компьютере.
Компьютер может быть использован на самых различных этапах обучения математики, и это применение основано, прежде всего, на его графических возможностях. Использование информационно-обучающей программы «Уроки алгебры и геометрии» Кирилла и Мефодия позволяют моделировать и наглядно демонстрировать содержание изучаемых тем. Табличный процессор Excel и математический пакет Mathcad являются удобным инструментом для решения различных математических задач.
Неоценим компьютер и при комплексном тестировании. Можно использовать любые обучающие программы или контролирующие упражнения. Всегда необходимо тщательно подбирать соответствующие упражнения, так как они должны соответствовать целям тестирования. Применение тестирующих программ позволяет учителю получить объективную информацию о владении учащимися определенным набором знаний, умений и навыков для продолжения образования, а также об уровне этих знаний.
Таким образом, применение новых технологий в образовании должно рассматриваться как стратегическое, управленческое решение, ориентированное на формирование и развитие новой образовательной системы, направленной на повышение качества образования, повышать мотивацию обучения, способствовать углублению межпредметных связей.
3 Проектная часть
Постановка задачи
3.1 Математическое описание. Формула Симпсона
Значение определенного интеграла находится методом Симпсона (парабол). Отрезок [a, b] разбивается на n=2m частей x0 =a, x1 =a+h, ..., xn =b с шагом h=(b-a)/n. Вычисляются значения yi = F(xi ) функции в точках xi и находится значение интеграла по формуле Симпсона:
Затем количество точек разбиения удваивается и производится оценка точности вычислений
Если Rn > e, то количество точек разбиения удваивается. Значение суммы 2(y1 +y2 +...+y2m-1 ) сохраняется, поэтому для вычисления интеграла при удвоении количества точек разбиения требуется вычислять значения yi лишь в новых точках разбиения.
|
|||
3.2 Описание блок-схемы алгоритма программы
1. Ввод переменных a,b,dx и функции f(x);
2. Вычисление значений Xi на отрезке a,b с шагом h. Продолжение цикла до конца отрезка а,b
3. Вывод всех значений F(xi) в массив;
4. Вычисление F(xi) и вывод в массив;
5. Проверка на значение натурального логарифма;
6. Проверка на значение косинуса;
7. Проверка на значение синуса или корня;
8. Проверка на значение цифры;
9. Взять формулу в массиве в скобки;
10. Присвоение значению х - значения xi в массиве;
11. Суммирование значений F(x2,x4..xn-1);
12. Суммирование значений F(x1,x3..xn);
13. Вычисление значения F(x);
14. Вывод результата.
3.3 Обоснование выбора языка программирования
Для создания программы курсового проекта я выбрал язык программирования – Delphi. Delphi — это язык программирования, который используется для создания разнообразных продуктов ПО. До недавнего времени он имел другое название — Object Pascal. Delphi представляет собой объектно-ориентированное программирование, которое предполагает существование определенной объектной библиотеки или так называемой библиотеки прототипов, использование которой больше не характеризует процесс программирования как громоздкое и сложное мероприятие.
Образование представленного средства программного обеспечения происходило в рамках компании Borland, которая сейчас занимается разработкой системы управления жизненным циклом приложений.
Специфической особенностью и вместе с тем недостатком Delphi являлось то, что использование подобного языка программирования на первых порах возможно было только в рамках операционной системы Microsoft Windows. Сейчас же работа с Delphi осуществляется и на таких платформах, как GNU/Linux, Mac OS X и Windows CE.
Во многом Delphi стал основой для создания такого языка программирования как С#.
Распространено также использование Delphi при разработки различных компонентов программного обеспечения. Примером категорий программных продуктов могут быть: утилиты, информационное обеспечение в Интернете, веб-проектирование, музыкальное оформление, инженерное программное обеспечение, создание баз данных и др.
Delphi имеет особенность постоянно модернизироваться, о чем свидетельствует периодическое обновление в виде появления новых версий. На сегодняшний день, последней, 12 версией программного средства является Delphi 2009, которая подразумевает некоторые совершенствования в системе языка программирования. Во-первых, модернизация элементов Delphi касается уникода, а именно, предполагается полная его поддержка. Во-вторых, наличие элементов для осуществления обобщенного программирования, которое подразумевает разработку алгоритмов, применимых к разным типам данных. В-третьих, использование безымянных функций, которые не предполагают лексического токена, а именование сущностей делает возможным ссылки на них, которые могут использоваться позже.
3.4. Тестирование
Аппаратное, программное обеспечение, на котором проводилось тестирование:
Данные компьютера:
Процессор – Celeron 1.7;
ОЗУ – 256 Мб;
Видео – 64 Мб;
HDD – 20 Gb;
Привод CD-Rw
Операционная система:
Windows Xp.
Решение задачи
Приведем пример решение задачи методом Симпсона
Вычислить значение интеграла
Решение задачи без помощи программного обеспечения:
n=10 [0,1] h=0,1 fx=xcosx |
xi | F(xi) |
0 | 0 | |
0.1 | 0.0995004 | |
0.2 | 0.196013 | |
0.3 | 0.286601 | |
0.4 | 0.368424 | |
0.5 | 0.438791 | |
0.6 | 0.495201 | |
0.7 | 0.5353895 | |
0.8 | 0.557365 | |
0.9 | 0.559449 | |
1 | 0.540302 |
Решение задачи с помощью программы Метод Симпсона.exe:
Данная программа работает корректно, т.к. ответы совпадают.
3.5 Инструкция пользователя
Данная программа состоит из 1 откомпилированного exe файла – Метод Симпсона.exe и rar-архива содержащего все компоненты программы написанных на языке программирования – Delphi 7.0.
1. Запуск программы осуществляется путем открытия файла Метод Симпсона .exe.
|
2.
Ввод значений производится следующим образом:
|
|
Ввод отрезка [a,b] производится путем ввода - точка а (начальная точка), - точка b (конечная точка отрезка).
Шаг h или dx – ввод в .
3. После ввода всех значений интеграла необходимо нажать кнопку (см. рис.4).
|
где – таблица значений Xi b F(xi);
|
- приближенное значение интеграла.
-
4. Для вывод справочной информации о пользовании программой необходимо нажать кнопку , после чего на экран выводится следующее окно (см. рис.7)
|
4. Заключение
Данная программа была написана на языке Delphi 7.0. При разработке программы были учтены все требования к программе и выполнены в полной мере.
При разработке данной программы Я закрепил знания по программированию в среде Delphi 7.0, также получил некоторые новые знания при разработке этой программы.
Приложение
Листинг программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, ExtCtrls;
type
TForm1 = class(TForm)
Edit_F: TEdit;
Button_Itogo: TButton;
Edit_A: TEdit;
Label1: TLabel;
Label4: TLabel;
Edit_B: TEdit;
SS: TStringGrid;
Edit_Int: TEdit;
Label3: TLabel;
Image1: TImage;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label5: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Button1: TButton;
procedure Button_ItogoClick(Sender: TObject);
procedure Label5Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit_help,Unit_h;
{$R *.dfm}
procedure Formula( Var Vivod:string; Var Gl_massiv: Array of string);
Var
Sk_massiv: Array [0..100] of string;
Tmp_st,st:integer; // Переменная степени
i_sk:integer; //Номер ячейки c начала массива скобки
j_sk:integer;// Переменная по перемещению по массиву скобки
z:integer; //Номер ячейки от конца гл. массива
i:integer; //Номер ячейки c начала гл. массива
j:integer; // Переменная по перемещению по гл. массиву
// Булевые типы (ложь) или (Истина) для гл. масиива и скобки
Y, Ysk:Boolean;
ch:Real; // Число
Itog:Real; //Переменная значений вычислений
begin // Начало
{---- Вычисление значений в скобках -----}
For z:=1 to 100 do //Чтение то конца гл. массива
Begin
// Если левая скобка найдена
if Gl_massiv [100-z] = '(' then
Begin
i:= 100-z; j:= 0; Y:= False;
Repeat
Begin
if Gl_massiv[i+1] <> ')' then //Найдена след.закрывающая скобка
Begin
Sk_massiv[j]:= Gl_massiv[i+1];
// Скрываем чило использованное для вычисления
Gl_massiv[i+1]:= '#';
j:=j+1;
i:=i+1;
end
else Begin Gl_massiv[i+1]:= '#'; Y:= True; end;
end;
Until Y=True;
Y:= False;
{--------- Вычисление в скобках ---------------}
For i_sk:=0 to 100 do
Begin
Ysk:= False;
{-------------- Косинус---------------}
if Sk_massiv [i_sk]= 'cos' then
Begin j_sk:=1; Ysk:= False;
repeat
if Sk_massiv[i_sk+j_sk] <> '#' then
begin
itog:= cos(Strtofloat(Sk_massiv[i_sk+j_sk]));
Sk_massiv[i_sk]:= Floattostr(itog);
Sk_massiv[i_sk+j_sk]:= '#'; Ysk:= True;
end else j_sk:= j_sk+1;
until Ysk=True;
Ysk:= False;
end;
{-------------- Синус ---------------}
if Sk_massiv[i_sk]= 'sin' then
Begin j_sk:=1; Ysk:= False;
repeat
if Sk_massiv[i_sk+j_sk] <> '#' then
begin
itog:= sin(Strtofloat(Sk_massiv[i_sk+j_sk]));
Sk_massiv[i_sk]:= Floattostr(itog);
Sk_massiv[i_sk+j_sk]:= '#'; Ysk:= True;
end else j_sk:= j_sk+1;
until Ysk=True;
Ysk:= False;
end;
end;
{-------------- ^ квадрат ---------------}
For i_sk:=0 to 100 do
Begin
Ysk:= False;
if Sk_massiv[i_sk]= '^' then
Begin j_sk:=1; Ysk:= False;
repeat
if Sk_massiv[i_sk-j_sk] <> '#' then begin
itog:= Strtofloat(Sk_massiv[i_sk-j_sk]);
Sk_massiv[i_sk-j_sk]:= '#'; Ysk:= True;
end else j_sk:= j_sk+1;
until Ysk=True;
Tmp_st:= StrToInt(Sk_massiv[i_sk+1]);
ch:=itog;
For st:=2 to Tmp_st do
begin
itog:= itog*ch;
end;
Sk_massiv[i_sk]:= Floattostr(itog);
end;
end;
{-------------- Умножение / Деление ---------------}
For i_sk:=0 to 100 do
Begin
Ysk:= False;
{-------------- Умножение---------------}
if Sk_massiv[i_sk]= '*' then
Begin j_sk:=1; Ysk:= False;
repeat
if Sk_massiv[i_sk-j_sk] <> '#' then begin
itog:= Strtofloat(Sk_massiv[i_sk-j_sk]);
Sk_massiv[i_sk-j_sk]:= '#'; Ysk:= True;
end else j_sk:= j_sk+1;
until Ysk=True;
j_sk:=1; Ysk:= False;
repeat
if Sk_massiv[i_sk+j_sk] <> '#' then begin
itog:= itog* Strtofloat(Sk_massiv[i_sk+j_sk]);
Sk_massiv[i_sk]:= Floattostr(itog);
Sk_massiv[i_sk+j_sk]:= '#'; Ysk:= True;
end else j_sk:= j_sk+1;
until Ysk=True;
end; Ysk:= False;
{--------------------- Деление ----------------}
if Sk_massiv[i_sk]= '/' then
Begin j_sk:=1; Ysk:= False;
repeat
if Sk_massiv[i_sk-j_sk] <> '#' then begin
itog:= Strtofloat(Sk_massiv[i_sk-j_sk]);
Sk_massiv[i_sk-j_sk]:= '#'; Ysk:= True;
end else j_sk:= j_sk+1;
until Ysk=True;
j_sk:=1; Ysk:= False;
repeat
if Sk_massiv[i_sk+j_sk] <> '#' then begin
itog:= itog/Strtofloat(Sk_massiv[i_sk+j_sk]);
Sk_massiv[i_sk]:= Floattostr(itog);
Sk_massiv[i_sk+j_sk]:= '#'; Ysk:= True;
end else j_sk:= j_sk+1;
until Ysk=True;
end; Ysk:= False;
end;
{-------------- cложение/вычитание -----------------}
For i_sk:= 0 to 100 do
Begin
Ysk:= False;
{-------------- сложение---------------}
if Sk_massiv[i_sk]= '+' then
Begin j_sk:=1; Ysk:= False;
repeat
if Sk_massiv[i_sk-j_sk] <> '#' then begin
itog:= Strtofloat(Sk_massiv[i_sk-j_sk]);
Sk_massiv[i_sk-j_sk]:= '#'; Ysk:= True;
end else j_sk:= j_sk+1;
until Ysk=True;
j_sk:=1; Ysk:= False;
repeat
if Sk_massiv[i_sk+j_sk] <> '#' then begin
itog:= itog+ Strtofloat(Sk_massiv[i_sk+j_sk]);
Sk_massiv[i_sk]:= Floattostr(itog);
Sk_massiv[i_sk+j_sk]:= '#'; Ysk:= True;
end else j_sk:= j_sk+1;
until Ysk=True;
end; Ysk:= False;
{------------------- Вычитание ----------------}
if Sk_massiv[i_sk]= '-' then
Begin j_sk:=1; Ysk:= False;
repeat
if Sk_massiv[i_sk-j_sk] <> '#' then begin
itog:= Strtofloat(Sk_massiv[i_sk-j_sk]);
Sk_massiv[i_sk-j_sk]:= '#'; Ysk:= True;
end else j_sk:= j_sk+1;
until Ysk=True;
j_sk:=1; Ysk:= False;
repeat
if Sk_massiv[i_sk+j_sk] <> '#' then begin
itog:= itog-Strtofloat(Sk_massiv[i_sk+j_sk]);
Sk_massiv[i_sk]:= Floattostr(itog);
Sk_massiv[i_sk+j_sk]:= '#'; Ysk:= True;
end else j_sk:= j_sk+1;
until Ysk=True;
end; Ysk:= False;
end;
For i_sk:=0 to 100 do
Begin
Ysk:= False;
{-------------- Натуральный логарифм --------------}
if Sk_massiv[i_sk]= 'ln' then
Begin j_sk:=1; Ysk:= False;
repeat
if Sk_massiv[i_sk+j_sk] <> '#' then
begin
ch:= Strtofloat(Sk_massiv[i_sk+j_sk]);
If ch > 0 then
Begin
itog:= ln(Strtofloat(Sk_massiv[i_sk+j_sk]));
Sk_massiv[i_sk]:= Floattostr(itog);
Sk_massiv[i_sk+j_sk]:= '#'; Ysk:= True;
end else Begin
Showmessage('Натуральный логарифм меньше нуля');
Sk_massiv[i_sk]:='0';
Ysk:= True;
end;
end else j_sk:= j_sk+1;
until Ysk=True;
Ysk:= False;
end;
{-------------- Корень кв.--------------}
if Sk_massiv[i_sk]= 'sqrt' then
Begin j_sk:=1; Ysk:= False;
repeat
if Sk_massiv[i_sk+j_sk] <> '#' then
begin
ch:= Strtofloat(Sk_massiv[i_sk+j_sk]);
If ch > 0 then
Begin
itog:= sqrt(Strtofloat(Sk_massiv[i_sk+j_sk]));
Sk_massiv[i_sk]:= Floattostr(itog);
Sk_massiv[i_sk+j_sk]:= '#'; Ysk:= True;
end else Begin
Showmessage('Значение квадратного корня меньше нуля');
Sk_massiv[i_sk]:='0';
Ysk:= True;
end;
end else j_sk:= j_sk+1;
until Ysk=True;
Ysk:= False;
end;
end; Ysk:= False;
j_sk:=0;
Repeat
Begin
if Sk_massiv[0+j_sk] <> '#' then Begin
// Запись в гл. массив значение скобки
Gl_massiv[100-z]:= Sk_massiv[0+j_sk];
Ysk:= true; end
else j_sk:=j_sk+1;
end;
Until Ysk = true;
end;
end;
{----- Вычиление значения в скобках закончено -----}
//showmessage(Gl_massiv[0]);
Vivod:= Gl_massiv[0];
end; // Конец процедуры
{--------------------------------------------------------}
procedure TForm1.Button_ItogoClick(Sender: TObject);
Var
a,b,h:real; //Отрезок а, b и шаг h
Fx,Fa,Fb:Real; //Результат и суммы значений F(xi)
My_vivod:string;//Значение F(xi)
mas,z,j:integer; //Номер ячейки массива
i:integer; //Номер символа в строке формул
s,st,ch:string; //Символ
// Булевый тип (ложь) или (Истина) для выхода из цикла подсчета цифр
Bool:Boolean;
//Массив символов формулы
My_massiv:Array [0..100] of string;
begin
//Присвоение к переменным значений отрезка а,b и шага h
a:= StrToFloat(Edit_A.Text);
b:= StrToFloat(Edit_B.Text);
h:=StrToFloat(Edit_Int.Text);
z:=0;
// Вычисление значений Xi на отрезке a,b с шагом h
Repeat
Begin //Начало цикла
//Вывод в массив значения Xi
SS.Cells[0,z]:= FloatToStr(a);
z:=z+1; //Переход на ячейку ниже
a:=a+h; //Шаг
end;
Until a > b; //Продолжение цикла до конца отрезка а,b
mas:=0;
//Вывод всех значений F(xi) в массив
Repeat
begin
i:=1; j:=1;
Repeat
//Вычисление F(xi) и вывод в массив
Begin
s:= Copy(Edit_F.text,i,1); //Копировать i-й символ в строке формул
//Проверка на значение натурального логарифма
if s='l' then Begin
s:='ln'; i:= i+1; end;
//Проверка на значение косинуса
if s='c' then Begin
s:='cos'; i:= i+2; end;
//Проверка на значение синуса или корня
if s='s' then Begin
i:= i+1; st:= Copy(Edit_F.text,i,1);
if st='i' then begin
s:='sin'; i:=i+1; end
else begin s:='sqrt'; i:=i+2; end; end;
//Проверка на значение цифры
if (s='0') or (s='1') or (s='2')or (s='3')or (s='4')
or (s='5')or (s='6')or (s='7')or (s='8')or (s='9') then
Begin
ch:=s; Bool:=False;
Repeat
Begin
i:=i+1; // Перемещение к след. символу
s:= Copy(Edit_F.text,i,1); //Копировать i-й символ в строке формул
//Проверка на значение цифры
if (s='0') or (s='1') or (s='2')or (s='3')or (s='4')
or (s='5')or (s='6')or (s='7')or (s='8')or (s='9')or (s=',') then
Begin //Если Да
//Обьединение нескольких цифр подрят
ch:= ch+s;
end
else Bool:=True; //Если нет Bool - Истина
end;
Until Bool=True; //Выход, если Bool - Истина
My_massiv[j]:= ch; j:=j+1 //Запись значений цифр в массив
//Если значение не цифра - запись в массив текущего символа
end else Begin My_massiv[j]:=s; j:=j+1; i:=i+1; end;
end;
//Продолжение цикла до конца количества символов в строке формул
Until i > Length(Edit_F.Text);
// Взять формулу в массиве в скобки
My_massiv[0]:='(';
My_massiv[Length(Edit_F.Text)+1]:=')';
// Присвоение значению х - значения xi в массиве
For i:= 0 to 100 do begin
if My_massiv[i]= 'x' then
My_massiv[i]:= SS.Cells[0,mas];
end;
Formula(My_vivod,My_massiv[0]);
SS.Cells[1,mas]:= My_vivod; //Вывод F(xi) в массив
mas:=mas+1; //Перемешение в массиве на строку ниже
end;
//Продолжение цикла до последнего значения xi
Until mas>z-1;
Fa:=0; i:=0; //Обнуление переменных
//Суммирование значений F(x2,x4..xn-1)
Repeat
Begin
Fa:=Fa+StrtoFloat(SS.Cells[1,i]);
i:=i+2;
end;
Until i>=z;
i:=0;
//Суммирование значений F(x1,x3..xn)
Repeat
Begin
Fb:=Fb+StrtoFloat(SS.Cells[1,i+1]);
i:=i+2;
end;
Until i>=z-1;
//Вычисление значения F(x)
Fx:=(h/3)*(StrToFloat(SS.Cells[1,0])+(4*Fb)+(2*Fa));
//Вывод результата
Label3.Caption:= FloatToStr(h)+'/3 * ('+SS.Cells[1,0]+
' * 4*('+FloattoStr(Fb)+')+ 2*('+FloattoStr(Fa)+') = ';
Label13.Caption:=FloatToStr(Fx);
end;
procedure TForm1.Label5Click(Sender: TObject);
begin
Form2.showmodal;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form_help.ShowModal;
end;
end.