Пакет программ сглаживания функции

     КОЛОМЕНСКИЙ  ИНСТИТУТ (филиал)

     ГОСУДАРСТВЕННОГО  ОБРАЗОВАТЕЛЬНОГО УЧРЕЖДЕНИЯ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО  ОБРАЗОВАНИЯ

     _______________________________________________________________

     «МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ  ОТКРЫТЫЙ  
УНИВЕРСИТЕТ»
 

     Кафедра «Управления, информатики и вычислительной техники»

     КУРСОВАЯ  РАБОТА 

     По  курсу «Программирование на языке высокого уровня»

     по  теме: «Пакет программ сглаживания функции» 
 
 

     Выполнил: студент группы ПО-21

     Кокалич Мария

     Руководитель:

     Родионов  К.А. 
 
 

     Коломна 2011 

     ОГЛАВЛЕНИЕ 
 
 
 
 
 

ЗАДАНИЕ НА КУРСОВУЮ РАБОТУ

 

     по  дисциплине «Программирование  на языке высокого уровня»

     Вариант № 2

     Тема: «Пакет программ сглаживания функции»

  1. Разработать приложение в среде Delphi для сглаживания функции, заданной таблицей значений в равно отстоящих точках, с помощью многочлена 3- степени, построенного по последовательным точкам методом наименьших квадратов.
  2. В программе необходимо предусмотреть:
    • задание произвольной табличной функции y(x);
    • вывод табличных значений сглаженной функции;
    • графическое отображение табличной функции y(x) для контроля задания табличных значений;
    • графическое отображение сглаженной функции y(x).
 
     
  1. Предусмотреть обработку некорректного ввода исходных данных.
  2. Провести тестирование программы.
  3. Подготовить пояснительную записку (отчет), в которую необходимо включить описание применения приложения, исходные данные к программе и результаты расчетов, образцы диалоговых окон, тексты программ, полученные диаграммы результатов, а также чистый лист для рецензии преподавателя.
 
 

     Дата  выдачи: ___________   Преподаватель:___________________

     ВВЕДЕНИЕ

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

     Таким образом, целью курсовой работы является овладение и закрепление навыков  программирования на языке Object Pascal в инструментальной среде Delphi. 
 
 
 
 
 
 
 
 
 
 
 
 

     2.Математические  методы

     2.1Основные  понятия

 

     Функция

     Функция — математическое понятие, отражающее связь между элементами множеств. Можно сказать, что функция это «закон», по которому каждому элементу одного множества (называемому областью определения) ставится в соответствие некоторый элемент другого множества (называемого областью значений).

     Функция (отображениеоперацияоператор) — это закон или правило, согласно которому каждому элементу из множества ставится в соответствие единственный элемент из множества Y.

     При этом говорят, что функция f задана на множестве X, или что f отображает X в Y.

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

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

     Это и позволяет говорить о том, что  элементу   сопоставлен один и только один элемент   такой, что  .

     Таким образом, функция — это упорядоченная тройка (или кортеж) объектов (f,X,Y), где

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

     Если  задана функция f, которая определена на множестве и принимает значения в множестве Y, то есть, функция f отображает множество в Y, то

  • этот факт коротко записывают в виде   или  .
  • область определения функции (множество X) обозначается D(f), или  ;
  • область значений функции (множество Y) обозначается R(f) (E(f)), или   ( ).

     Наличие функциональной зависимости между  элементом   и элементом 

  • наиболее часто обозначается как

         f(x),

           или

          ;

  • реже используется обозначение без скобок fx,   или xf,
  • а там, где необходимо подчеркнуть двойственность, используются обозначения со скобками: = (f,x) или = (x,f);
  • так же существует и операторное обозначение xf, которое можно встретить в общей алгебре.

     Способы задания функции

     1.Аналитический. Является наиболее важным для МА (мат.анализа), поскольку методы МА (дифференциального, интегрального счисления) предполагают этот способ задания. Одна и та же функция может быть задана различными формулами: y=sin(x)y=√1−cos2(x)  Иногда в различных частях своих областей определяемая функция может быть задана различными формулами f(x)={f1(x),xDfn(x),xDn  nk=1Dk=D(f) . Часто при этом способе задания функции область определения не указывается, тогда под областью определения понимается естественная область определения, т.е. множество всех значений x при которых функция принимает действительное значение.

     Частным случаем аналитического способа  задания функции является задание  функции уравнением вида F(x,y)=0 (1) Если это уравнение обладает свойством, что xД сопоставляется единственное y, такое, что F(x,y)=0, то говорят, что уравнение (1) на Д неявно задает функцию. Еще один частный случай задания функции -- параметрический, при этом каждая пара (x,y)f  задается с помощью пары функций x=ϕ(t),y=ψ(t)  где tM .

     2.Графический. Область определения -- проекция данного графика на Ох, а множество значений -- проекция Д(f) на Оу.

     3.Словесный. Отношение f, по которому каждому х находящееся соответствие у описывается словесно. Например, y=[x] : x из R (Целой частью х из R называют любое целое число не превосходящее х).

     4.Табличный. Состоит в простом перечислении элементов функции f, т.е. при этом способе указывается значение аргумента x и соответствующе значение функции y=f(x). В работе использовался именно этот способ задания функции, так как использовалось линейное сглаживание функции по пяти точкам. Таблица позволяет без затруднений с точностью найти нужные точки.

     2.2  Математические методы

 

     Метод наименьших квадратов

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

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

     Описание  метода 

     Пусть функцияy=f(x) задана таблицей своих значений:  , i=0,1,-n. Требуется найти многочлен фиксированной степени m, для которого среднеквадратичное отклонение (СКО)  минимально.

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

     Используя необходимое условие экстремума,  , k=0,1,-получаем так называемую нормальную систему метода наименьших квадратов:  , k=0,1,-m.

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

     Запишем нормальную систему наименьших квадратов для двух простых случаев: m=0 и m=2. При m=0 многочлен примет вид:  . Для нахождения неизвестного коэффициента  имеем уравнение: . Получаем, что коэффициент   есть среднее арифметическое значений функции в заданных точках.

     Если  же используется многочлен второй степени  , то нормальная система уравнений примет вид:

       

     Линейное  сглаживание по пяти точкам

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

     Линейное  сглаживание по пяти точкам выполняется  с помощью следующих формул:

      ,

      ,

      ,

      ,

      ,

     где - номер последней точки (ординаты yi). 
 
 
 
 
 
 
 
 
 
 

     3.Описание применения пакета программ

     3.1 Основные понятия,  цели и задачи

 

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

     3.2 Описание диалоговых  окон

 

     Основное  окно программы представлено на рисунке 1. Оно содержит компоненты для ввода табличной функции, вывода расчетных данных  и поле  для построения графиков функций.

     Рисунок 1.− Основное окно программы

     Пользователь  открывает нужную функцию нажатием на кнопку «Открыть функцию». При нажатии  появляется диалоговое окно, предоставляющее выбор таблично заданной функции, записанной в текстовом файле (рисунок 2)

     

     Рисунок 2. – Окно выбора функции

     После выбора функции заполнится таблица  значений функций в основном диалоговом окне, и появится график данной функции.

     Рисунок 3.− Функция и её график

     После появления графика функции производится нажатие на кнопку «Рассчитать». В  результате данные из таблицы передаются в книгу Microsoft Office Excel поочередно по пять точек. Там производится расчет значений сглаженной функции. Эти значения автоматически записываются в таблицу в основном диалоговом окне в столбец «ур» (Рисунок 5).

     Рисунок 5. – Значения аппроксимированной функции

     После того, как в таблице появились  значения аппроксимированной функции, необходимо построить график этой функции. Для этого нажимаем на кнопку «посмотреть график сглаженной функции». В поле построения исходной функции появится график аппроксимированной функции, выделенный другим цветом, как показано на рисунке 6. 

     Рисунок 6. – График аппроксимированной функции 
 
 
 
 
 
 
 
 
 
 

     3.3 Описание исходных  данных

 

     Исходными данными являются аргументы х  и значения у таблично заданной функции.

     3.4 Описание результатов  программы

 

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

     3.5 Тестирование программы

 

     Для проверки правильности работы программы  возьмем 3 разных функции .

     Этап 1. Выберем функции, для которых удобен в применении метод наименьших квадратов для их аппроксимации.

     

     Рисунок 7. – Первая функция 
 
 
 
 
 

     

     Рисунок 8. – Вторая функция

     

     Рисунок 9. –Третья функция

     Этап 2. Записываем значения в таблицу в диалоговом окне и строим график функции

     Рисунок 10. – Значения и график функции №1

     Рисунок 11. – Значения и график  функции  №2 

     Рисунок 12. – Значения и график  функции  №3

     Этап 3. Произведем сглаживание функции и постоим график сглаженной функции.

     Рисунок 13. – Значения и график  сглаженной функции №1

     Рисунок 14. – Значения и график  сглаженной функции №2

     Рисунок 15. – Значения и график  сглаженной функции №3

     Из  рисунков видно, что сглаживание  функции было произведено удачно. Были исследованы разные функции  на различных интервалах, и как  показывает график на всех интервалах программа верно производит сглаживание функции.

    ЗАКЛЮЧЕНИЕ

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

     Таким образом, овладение и закрепление  навыков программирования на языке  Object Pascal в инструментальной среде Delphi было достигнуто. 
 
 
 
 
 
 
 
 
 

     ЛИТЕРАТУРА

  1. Бугров  Я.С., Никольский С.М. Высшая математика. Дифференциальное и интегральное исчисление: Учеб. – 3-е изд., испр. – М.: Наука. Гл. ред. Физ.-мат. лит., 1988.-432 с.
  2. Корн Г., Корн Т. Справочник по математике для научных работников и инженеров — М.: Наука, 1970. — С. 575.
  3. Бугров Я.С., Никольский С.М. Высшая математика. Дифференциальные уравнения. Кратные интегралы. Ряды. Функции комплексного переменного: Учебник для вузов. – 3-е изд., испр. – М.: Наука. Гл. ред. физ.-мат. лит., 1989. – 464 с.
  4. Максимов Ю.А. Алгоритмы линейного и дискретного программирования — М.: МИФИ, 1980.

СПИСОК ИНТЕРНЕТ-ИСТОЧНИКОВ

  1. http://ru.wikipedia.org
  2. http://solidbase.karelia.ru/edu/meth_calc/files/09.shtm
  3. http://www.delphi-manual.ru
  4. http://programmersforum.ru/

     Приложение

 

     Исходный код:

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, Grids, ExtCtrls, TeeProcs, TeEngine, Chart, Series; 

type

  TForm1 = class(TForm)

    StringGrid1: TStringGrid;

    OpenDialog1: TOpenDialog;

    Button1: TButton;

    Button2: TButton;

    Chart1: TChart;

    Series2: TLineSeries;

    Button3: TButton;

    procedure FormCreate(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject); 
 
 

  private

    { Private declarations }

  public

    { Public declarations }

  end; 

var

  Form1: TForm1;

  i,j:integer;

implementation 

{$R *.dfm}

uses comobj;

procedure TForm1.FormCreate(Sender: TObject);

begin

    StringGrid1.Cells[0,0]:='x';

    StringGrid1.Cells[1,0]:='y';

   stringgrid1.Cells[2,0]:='yp';

end;

procedure TForm1.Button1Click(Sender: TObject);

var

  TS : TStringList;

  s : string;

  x, y :real;

  i, CountRow, k : integer;

  F:textfile;

begin

  if not OpenDialog1.Execute

    then exit;

  Form1.Caption := OpenDialog1.FileName;

  TS := TStringList.Create;

  try

    TS.LoadFromFile( OpenDialog1.FileName );

  except

     FreeAndNil( TS );

     ShowMessage('Ошибка доступа/чтения файла ' + OpenDialog1.FileName);

     exit;

  end;

  StringGrid1.ColCount := 3;

  StringGrid1.RowCount := TS.Count;

  CountRow := 0;

  assignFile(f,OpenDialog1.FileName);

  reset(f);

  while not eof(f) do begin

     readln(f,s);

     s := Trim(s);

     if Pos(' ', s ) > 0 then begin

        s := StringReplace( s, '.',  DecimalSeparator,  [rfReplaceAll] );

        s := StringReplace( s, ',',  DecimalSeparator,  [rfReplaceAll] );

        Val(Trim(Copy(s, 1, Pos(' ', s )-1)), x, k);

        if k<>0 then {в начале строки идёт НЕ ЧИСЛО - игнорируем всю строчку} Continue;

        Val(Trim(Copy(s, Pos(' ', s )+1, 255)), y, k);

        if k<>0 then {в начале строки идёт НЕ ЧИСЛО - игнорируем всю строчку} Continue;

        {всё хорошо. найденные значения записываем в StringGrid}

        Inc(CountRow); {увеличиваем счётчик строк}

        StringGrid1.RowCount := CountRow+1;

        StringGrid1.Cells[0, CountRow] := FloatToStr(x);

        StringGrid1.Cells[1, CountRow] := FloatToStr(y);

       // exl(countRow,x,y);

     end;

  end;

  // подкорректируем размер грида - число строк сделаем равным счётчику

  FreeAndNil( TS ); {очистим список}

   //очищаем 3 столбец таблицы

  with stringgrid1 do for i:=1 to rowcount-1 do

  cells[2,i]:='';

  //очищаем график

  chart1.SeriesList.Series[0].Clear;

chart1.SeriesList[0].Marks.Visible:=false;

chart1.SeriesList.Series[1].Clear;

chart1.SeriesList[1].Marks.Visible:=false;

//строим график функции

  with Chart1 do begin

     Title.Text.Clear;

     Title.Text.Add('Графики функций');

     SeriesList.Series[0].Clear;

     SeriesList.Series[0].Marks.Visible:=False;

     BottomAxis.Title.Caption  := 'значения х';//подписываем X

   LeftAxis.Title.Caption    := 'значения у';//подписываем Y

   Repaint;

      with StringGrid1 do for i:=1 to Rowcount-1 do begin

     SeriesList.Series[0].AddXY(strtofloat(Cells[0,i]),StrToFloat(Cells[1,i]),'');

      end;

StringGrid1.SetFocus;

end;

end;

procedure TForm1.Button2Click(Sender: TObject);  //передача данных в excel

var  i,j,k:integer;

  exl:OleVariant;  yp:array[1..100] of real;

  WorkBook,Sheet:Variant;

  fileName:string;  n,m:integer;

begin

  //Получим имя будущего Exel- файла

  fileName:=ExtractFilePath(Application.ExeName)+'function1.xls'; 

  //Создаем объект интерфейса для доступа к серверу COM

  //Создаем OLE сервер MS Excel

  exl:= CreateOleObject('Excel.Application');

      //Открываем книгу и активизирум раб.лист 1

  WorkBook:=exl.Application.Workbooks.Open(fileName);

   Sheet:=WorkBook.Worksheets[1];

   n:= stringgrid1.RowCount-4;

   stringgrid1.Cells[2,1]:=stringgrid1.Cells[1,1];

    stringgrid1.Cells[2,2]:=stringgrid1.Cells[1,2];

    m:=stringgrid1.RowCount-1;

    stringgrid1.Cells[2,m]:=stringgrid1.Cells[1,m];

    stringgrid1.Cells[2,m-1]:=stringgrid1.Cells[1,m-1];

  //Запись данных в ячейки Excel

    k:=0;

    for i:=1 to n-1 do begin

        inc(k);

        for j:=0 to 4 do  begin

          Sheet.cells[j+2,1]:=StringGrid1.Cells[0,j+k];

          Sheet.cells[j+2,4]:=StringGrid1.Cells[1,j+k];

        end; 

    //Чтение данных из ячеек Excel

     yp[i]:= Sheet.cells[4,11];

     stringgrid1.Cells[2,i+2]:=floattostr(yp[i]);

   end;

end; 

procedure TForm1.Button3Click(Sender: TObject);

var i:integer;

begin

   with Chart1 do begin

      with StringGrid1 do for i:=1 to Rowcount-1 do

     SeriesList.Series[1].AddXY(strtofloat(Cells[0,i]),StrToFloat(Cells[2,i]),'');

     StringGrid1.SetFocus; 

end;

end;

end.


Пакет программ сглаживания функции