Рефетека.ру / Эк.-мат. моделирование

Курсовая работа: Метод Золотого сечения на Delphi

Содержание


  1. Введение

  2. Характеристика объекта автоматизации

  3. Проектная часть

Математическое описание

Описание блок-схемы алгоритма программы

Обоснование выбора языка программирования

Тестирование

Инструкция пользователя

  1. Заключение

  2. Приложение

1 Введение


Целью курсовой работы является вычисление приближенного значения интеграла методом Симпсона, путем ввода функции, отрезка и шага dx. История появления и развития персональных компьютеров является одним из наиболее впечатляющих явлений нашего века. С момента появления первых образцов персональных компьютеров прошло меньше 25 лет, но сейчас без них уже немыслимо огромное количество областей человеческой деятельности - экономика, управление, наука, инженерное дело, издательское дело, образование, культура и т.д. Интерес к персональным компьютерам постоянно растет, а круг их пользователей непрерывно расширяется. В число пользователей ПЭВМ вовлекаются как новички в компьютерном деле, так и специалисты по другим классам ЭВМ. Благодаря новейшим технологиям в компьютерной сфере решение инженерных, математических, технических и коммерческих задач помогает быстро и точно решить ту или иную задачу. Актуальность решения задачи методом Симпсона с помощью ПЭВМ для учебных заведений – является быстрота и точность решения определенного интеграл от функции, имеющей неэлементарную первообразную.


  1. Характеристика объекта автоматизации

Объектами автоматизации являются учебные заведения, оснащенные компьютеризированной аудиторией. Автоматизация учебного процесса для решения задач по предмету – численные методы.

Темпы научно – технического прогресса, усиление роли науки в значительной степени определяются качеством и номенклатурой средств вычислительной техники и их программным обеспечением. Именно развитие этих средств обеспечивает успехи в автоматизации производственных процессов, в разработке новых технологий, в повышении эффективности труда и управления, в совершенствовании системы образования и в ускорении подготовки кадров. Использования компьютера в процессе обучения математики позволяет реализовать возможности новейших педагогических технологий личностно-ориентированного обучения. Благодаря математическому программированию появилась возможность расширить учебный план благодаря быстрому и качественному решению математических задач на компьютере.

Решая проблему использования компьютера в процессе обучения математики, следует исходить не столько из функциональных возможностей компьютера и желания использовать его в учебном процессе, сколько из методической системы обучения математики, анализ которой должен показать, какие учебные задачи могут быть решены только средствами компьютера, ибо другие дидактические средства менее эффективны или вообще не применимы.

Обучение с использование компьютерной техники носит диалоговый характер, при котором учитель в любой момент может внести коррективы. На занятиях хорошо сочетаются индивидуальная и групповая форма работы. Ученики находятся в состоянии комфорта при работе на компьютере.

Компьютер может быть использован на самых различных этапах обучения математики, и это применение основано, прежде всего, на его графических возможностях. Использование информационно-обучающей программы «Уроки алгебры и геометрии» Кирилла и Мефодия позволяют моделировать и наглядно демонстрировать содержание изучаемых тем. Табличный процессор Excel и математический пакет Mathcad являются удобным инструментом для решения различных математических задач.

Неоценим компьютер и при комплексном тестировании. Можно использовать любые обучающие программы или контролирующие упражнения. Всегда необходимо тщательно подбирать соответствующие упражнения, так как они должны соответствовать целям тестирования. Применение тестирующих программ позволяет учителю получить объективную информацию о владении учащимися определенным набором знаний, умений и навыков для продолжения образования, а также об уровне этих знаний.

Таким образом, применение новых технологий в образовании должно рассматриваться как стратегическое, управленческое решение, ориентированное на формирование и развитие новой образовательной системы, направленной на повышение качества образования, повышать мотивацию обучения, способствовать углублению межпредметных связей.

3 Проектная часть

Постановка задачи


3.1 Математическое описание. Формула Симпсона


Значение определенного интеграла находится методом Симпсона (парабол). Отрезок [a, b] разбивается на n=2m частей x=a, x=a+h, ..., x=b с шагом h=(b-a)/n. Вычисляются значения yi = F(x) функции в точках xi и находится значение интеграла по формуле Симпсона:

Затем количество точек разбиения удваивается и производится оценка точности вычислений

Если Rn > e, то количество точек разбиения удваивается. Значение суммы 2(y+y+...+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.





Ввод значений производится следующим образом:

Ввод функции f(x) – в данное окно производится ввод формулы предназначенной для вычисления значения интеграла. Для просмотра используемых арифметических действий при вводе необходимо нажать левой кнопкой мышки на , после чего на экран выводится следующее окно (см. рис. 3).



Ввод отрезка [a,b] производится путем ввода - точка а (начальная точка), - точка b (конечная точка отрезка).

Шаг h или dx – ввод в .

  1. После ввода всех значений интеграла необходимо нажать кнопку (см. рис.4).

где – таблица значений Xi b F(xi);



  • приближенное значение интеграла.


  1. Для вывод справочной информации о пользовании программой необходимо нажать кнопку , после чего на экран выводится следующее окно (см. рис.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.

Рефетека ру refoteka@gmail.com