Содержание
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.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.
Рис 1. />
2.
/>
Ввод значений производится следующимобразом:
Рис 2. Ввод функции f(x) – в данное окно производится ввод формулы предназначеннойдля вычисления значения интеграла. Для просмотра используемых арифметическихдействий при вводе необходимо нажать левой кнопкой мышки на />, после чего на экранвыводится следующее окно (см. рис. 3).
Рис 3. />
Ввод отрезка [a,b] производится путем ввода /> - точка а (начальная точка), /> - точка b (конечная точка отрезка).
Шаг h или dx – ввод в />.
3. После ввода всехзначений интеграла необходимо нажать кнопку /> (см. рис.4).
Рис 4. />/>
где – таблица значений Xi b F(xi);/>
Рис 5.
/>
- приближенноезначение интеграла.
-
4. Для выводсправочной информации о пользовании программой необходимо нажать кнопку />, после чего наэкран выводится следующее окно (см. рис.7)
Рис 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.