Ортогональные полиномы Чебышева

Автор работы: Пользователь скрыл имя, 19 Мая 2015 в 21:37, курсовая работа

Описание работы

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

Файлы: 1 файл

Курсовая.doc

— 967.00 Кб (Скачать файл)

Рисунок 3.1 – Заставка программы

После заставки появится главное окно программы (см. рисунок 3.2).

Рисунок 3.2 – Главное окно программы

Как видно, данное окно состоит из следующих частей:

    • Главного меню; 
    • Области вывода информации; 
    • Управляющие кнопоки.

Пункты главного меню показаны на рисунке 3.3.

Рисунок 3.3 – Главное меню программы

В свою очередь пункты главного меню содержит ряд подпунктов, приведенных на рисунке 3.4.

Рисунок 3.4 - Пункт меню «Файл»

При выборе пункта «Выход» происходит завершение работы приложения.

Пункт меню «Сохранить» сохраняет полином в файл, а пункт меню «Сохранить как» сохраняет полином в файл с указанием адреса:

Рисунок 3.5 – Выбор адреса

Подпункты пункта меню «Вид» «Отключить заставку» и «Сменить скин» отключают заставку и меняют «скин» по желанию пользователя соответсвенно(см. рисунок 3.6).

Рисунок 3.7 - Пункт меню «Вид»

На рисунке 3.8 приведены команды, вызываемые пунктом главного меню «Справка». 

Рисунок 3.8 – Пункт меню «Справка»

 

Выбор пункта главного меню «Справка» позволяет получить на экране краткие сведения о программе в виде, показанном на рисунке 3.9, а также отправить короткое сообщеник разработчику (см. рисунок 3.10).

Рисунок 3.9 – Форма «О программе»

Рисунок 3.10 – Форма «Письмо разработчику»

Также имеется качель изменения степени многочлена, переключатель рода многочлена.

Кнопка «Вывести многочлен» выводит многочлен по заданным ранее кретериям (рисунок 3.11).

Рисунок 3.11 – Выведенный многочлен

Для отображения таблицы коэффициентов и графика необходимо нажать кнопку «Показать таблицу и график» (см. рисунок 3.12).

Рисунок 3.11 – Таблица коэффициентов и график

Для возвращения к предыдущему состоянию необходимо нажать кнопку «Показать полином в общем виде»

 

4. Методика испытаний

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

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

Для демонстрации работоспособности программы необходимо провести ряд испытаний с различными начальными условиями. Для обеспечения нормальной работы программы требуется наличие соответствующих DLL.

Тестовые примеры выполнялись в среде операционной системы Windows XP Profesional при использовании процессора Intel Pentium 4 2.4 GHz и разрешении экрана 1024*768. Для работы с программой необходимо также наличие клавиатуры и манипулятора типа «мышь».

Испытание проведем с произвольными данными.

Произврольные данные: при степени равной 31 и первому роду.

Результаты этого вычислительного эксперимента приведены на рисунке 4.1.

Рисунок 4.1 – Тест №1

Произведем также испытание при других значениях исходных данных, при степени равной 31 и второму роду

Полученные результаты на рисунке 4.2.

Рисунок 4.2 – Тест №2

Так же можно провести тест экспорта данных в MS Excel и MSWord, полученные результаты на рисунке 4.3 и рисунке 4.4 соответственно.

Рисунок 4.3 – Тест №3

Рисунок 4.4 – Тест №4

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

 

Заключение

В ходе выполнения курсовой работы:

  • были закреплены знания по курсу «Разработка приложений в визуальных средах»;
  • приобретен опыт при разработке объектно-ориентированных программ;
  • изучены принципы создания динамических библиотек;
  • освоены методы передачи данных между приложениями;

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

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

 

Литература

  1. Фаронов В.В. Delphi 6. Учебный курс.-М.: Издатель Молгачева С.В., 2001.-672с.
  2. Елмакова Н., Трепалин С., Тенцер А. Delphi 6 и технология COM.-СПб.: Питер, 2002. – 640 с.
  3. Федоров А.. Delphi 5.0 для всех. -М.: Тоо фирма “КомпьютерПресс”, 1998. - 464 с.
  4. Марко Кэнту. Delphi 5 для профессионалов.-СПб.: Питер. 2001. – 944 с.
  5. Бобровский С. Delphi 5: учебный курс- СПб: Издательство «Питер», 2000.- 640с.
  6. А.М.Епанешников, В.А.Епанешников Программирование в среде Delphi.-М.:»Диалог МИФИ», 1998.

 

Приложение

Файл проекта Polynomials.dpr

program Polynomials;

uses

  Forms,

  UnitMain in 'UnitMain.pas' {FormMain},

  PUnit1 in 'PUnit1.pas' {Form1},

  PUnit2 in 'PUnit2.pas' {Form2},

  UPoly in 'UPoly.pas';

{$R *.res}

begin

  Application.Initialize;

  Application.CreateForm(TFormMain, FormMain);

  Application.CreateForm(TForm1, Form1);

  Application.CreateForm(TForm2, Form2);

  Application.Run;

end.

Файл головного модуля UnitMain.pas

unit UnitMain;

 

interface

 

uses

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

  Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons, Menus, Vcl.Grids,

  VCLTee.TeEngine, VCLTee.TeeProcs, VCLTee.Chart, Math, VCLTee.Series, ComObj;

 

type

  TFormMain = class(TForm)

    GroupBox1: TGroupBox;

    GroupBox2: TGroupBox;

    RadioGroup1: TRadioGroup;

    Button1: TButton;

    GroupBox6: TGroupBox;

    RichEdit1: TRichEdit;

    UpDown1: TUpDown;

    Label1: TLabel;

    Image2: TImage;

    MainMenu1: TMainMenu;

    N1: TMenuItem;

    N2: TMenuItem;

    N3: TMenuItem;

    N4: TMenuItem;

    N5: TMenuItem;

    N6: TMenuItem;

    N7: TMenuItem;

    N8: TMenuItem;

    N11: TMenuItem;

    N12: TMenuItem;

    X1: TMenuItem;

    OpenDialog1: TOpenDialog;

    GroupBox3: TGroupBox;

    Label2: TLabel;

    SaveDialog1: TSaveDialog;

    N13: TMenuItem;

    SpeedButton1: TSpeedButton;

    SpeedButton2: TSpeedButton;

    Button2: TButton;

    StringGrid1: TStringGrid;

   Chart1: TChart;

    Label3: TLabel;

    Series1: TLineSeries;

    procedure UpDown1Click(Sender: TObject; Button: TUDBtnType);

    procedure FormCreate(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure FormShow(Sender: TObject);

    procedure BitBtn1Click(Sender: TObject);

    procedure BitBtn2Click(Sender: TObject);

    procedure FormDestroy(Sender: TObject);

    procedure N12Click(Sender: TObject);

    procedure X1Click(Sender: TObject);

    procedure N5Click(Sender: TObject);

    procedure N3Click(Sender: TObject);

    procedure N6Click(Sender: TObject);

    procedure N2Click(Sender: TObject);

    procedure N13Click(Sender: TObject);

    procedure N11Click(Sender: TObject);

    procedure N8Click(Sender: TObject);

    procedure SpeedButton1Click(Sender: TObject);

    procedure SpeedButton2Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

    n :integer;

  end;

 

var

  FormMain: TFormMain;

 

function ShowFormModal:integer;stdcall;

    external 'DllFormpr.dll' name 'ShowDllFormModal';

 

implementation

 

uses PUnit1, IniFiles, PUnit2, UWord, UPoly, Unit2;

 

{$R *.dfm}

 

const maxn=333;    // константа, ограничение степени полиномов

 

var ch: integer;

 

procedure TFormMain.FormCreate(Sender: TObject);

var

  Ini: Tinifile;

  m: integer;  //временная переменная

begin

Ini:=TiniFile.Create(extractfilepath(paramstr(0))+'param.ini');

RadioGroup1.ItemIndex := Ini.ReadInteger('Pol','Rod',100);

n := Ini.ReadInteger('Pol','Step',100);//инициализация начальным значением

m := Ini.ReadInteger('Show', 'Start', 100);

if m = 1

then

  N5.Checked:=false

else

  N5.Checked:=true;

Ini.Free; //чтение из ini

ch:=0;

UpDown1.Max:=maxn;  //установка ограничения

UpDown1.Position:=n;     //это же значение в счетчик

Label1.Caption:=IntToStr(n);   //это же значение на экран

FormMain.Top := Screen.Height div 2 - FormMain.Height div 2; //центрирование под экран

FormMain.Left := Screen.Width div 2 - FormMain.Width div 2;

end;

 

procedure TFormMain.UpDown1Click(Sender: TObject; Button: TUDBtnType);

begin

if Button=btNext

then

  inc(n)

else

  dec(n); //если правая кнопка увеличиваем n, иначе уменьшаем

Label1.Caption:=IntToStr(n);   //значение n на экран

end;

 

procedure TFormMain.Button1Click(Sender: TObject);   //Чебышева

Var objp: TCPoly;

    rod: integer;

    obj_com: IMyClass;

begin

  rod := RadioGroup1.ItemIndex;

  FormMain.RichEdit1.Clear;

  FormMain.RichEdit1.Lines.Add('Многочлен Чебышева '

                                +IntToStr(rod+1)+'-го рода при n='

                                +IntToStr(n)+#13#10);

//Использование com сервера

  obj_com := CreateComObject(Class_MyClass) as IMyClass;

  obj_com.PolyCheb(n, rod);

  obj_com.whithout_zero;

  FormMain.RichEdit1.Lines.Add(obj_com.get_str());

  obj_com.Get_Table(StringGrid1);

  obj_com.Get_Chart(Chart1);

end;

 

procedure TFormMain.Button2Click(Sender: TObject);

begin

if ch = 0

then

  begin

    RichEdit1.Visible := false;

    ch := 1;

    Label3.visible := true;

    Chart1.visible := true;

    StringGrid1.visible := true;

    Button2.Caption := 'Показать полином  в общем виде'

  end

else

  begin

    RichEdit1.Visible := true;

    ch := 0;

    Label3.visible := false;

    Chart1.visible := false;

    StringGrid1.visible := false;

    Button2.Caption := 'Показать таблицу  и график';

  end;

end;

 

procedure TFormMain.FormShow(Sender: TObject);

var

  Ini: Tinifile;

  tumb: integer;

begin

  Ini := TiniFile.Create(extractfilepath(paramstr(0))+'param.ini');

  tumb := Ini.ReadInteger('Show', 'Start', 100);

  Ini.Free;

  Label3.visible := false;

  Chart1.visible := false;

  StringGrid1.visible := false;

 

  if tumb = 1

  then

    Form1.ShowModal;

end;

 

procedure TFormMain.BitBtn1Click(Sender: TObject);

begin

Application.Terminate;

end;

 

procedure TFormMain.BitBtn2Click(Sender: TObject);

begin

Application.Minimize;

end;

 

procedure TFormMain.FormDestroy(Sender: TObject);

var

  Ini: Tinifile; //ini объект

begin

Ini:=TiniFile.Create(extractfilepath(paramstr(0))+'param.ini');

Ini.WriteInteger('Pol', 'Rod', RadioGroup1.ItemIndex);

Ini.WriteInteger('Pol', 'Step', n);

Ini.Free; //запись в ini

end;

 

procedure TFormMain.N12Click(Sender: TObject);

begin

Application.Minimize;

end;

 

procedure TFormMain.X1Click(Sender: TObject);

begin

Application.Terminate;

end;

 

procedure TFormMain.N5Click(Sender: TObject);

var

  Ini: Tinifile;

begin

Ini:=TiniFile.Create(extractfilepath(paramstr(0))+'param.ini');

if N5.Checked = true

then

  begin

    Ini.WriteInteger('Show', 'Start', 1);

    N5.Checked := false;

  end

else

  begin

    Ini.WriteInteger('Show', 'Start', 0);

    N5.Checked := true;

  end;

Ini.Free;

end;

 

procedure TFormMain.N3Click(Sender: TObject);

begin

  Application.Terminate;

end;

 

procedure TFormMain.N6Click(Sender: TObject);

begin

if OpenDialog1.Execute

then

  Image2.Picture.LoadFromFile(OpenDialog1.FileName);

end;

 

procedure TFormMain.N2Click(Sender: TObject);

begin

  If SaveDialog1.Execute

  then

    RichEdit1.Lines.SaveToFile(SaveDialog1.FileName+'.txt');

end;

 

procedure TFormMain.N13Click(Sender: TObject);

begin

  RichEdit1.Lines.SaveToFile(SaveDialog1.FileName+'.txt');

end;

 

procedure TFormMain.N11Click(Sender: TObject);

begin

  Form2.ShowModal();

end;

 

procedure TFormMain.N8Click(Sender: TObject);

begin

  ShowFormModal;

end;

 

//Excel

procedure TFormMain.SpeedButton1Click(Sender: TObject);

Var objx: TCPoly;

    rod: integer;

begin

  rod := RadioGroup1.ItemIndex;

  objx := TCPoly.Create;

  objx.PolyCheb(n, rod);

  objx.whithout_zero;

  objx.Get_Chart(Chart1);

  objx.Import_To_Excel(rod, n);

  objx.Free;

end;

 

procedure TFormMain.SpeedButton2Click(Sender: TObject);

Var objw: TCPoly;

    rod: integer;

begin

  rod := RadioGroup1.ItemIndex;

  objw := TCPoly.Create;

  objw.PolyCheb(n, rod);

  objw.whithout_zero;

  objw.Get_Chart(Chart1);

  objw.Import_To_Word(rod, n);

  objw.Free;

end;

 

end.

Файл класса TCPoly UPoly.pas

unit UPoly;

 

interface

 

uses VCLTee.TeeProcs, VCLTee.Chart, VCLTee.Series, Math, Grids, SysUtils, Types, Graphics,  IniFiles,

      Messages, Dialogs, StdCtrls, Variants, Classes, Controls, Forms,

      ExtCtrls, Buttons, Menus, comobj, Excel_TLB, Word_TLB;

 

  type

  TCPoly = class(TObject)

  private

    n: integer;

    rod: integer;

    v_str: string;

    matr: array of Extended;

    matr_for_table: array of Extended;

    count: integer;

 

  public

    procedure PolyCheb(_n, _rod: integer);

    function  idx(i,j:integer):integer;

    procedure ClearMatr;

    function st(gr:integer):string;

    function xst(gr:integer):string;

    function koef(gr:integer):string;

    function get_str(): string;

    function get_count(): integer;

    procedure ShowPolynomial;

    function get_el_array(i_row:integer): Extended;

    procedure whithout_zero();

    procedure Get_Table(SG : TStringGrid);

    procedure Get_Chart(Ch : TChart);

    function stepX(X: Extended; stepen: integer): Extended;

    procedure Import_To_Excel(rod, por:integer);

    procedure Import_To_Word(rod, por:integer);

end;

 

var

  i,j: integer;

 

implementation

 

 

procedure TCPoly.whithout_zero();

var

  buf: array of Extended;

  el: integer;

  _count: integer;

begin

    _count := 0;

    for i := 0 to (n+1)*(n+1)-1 do

    if matr_for_table[i] = 0

    then

      inc(_count);

    _count:=(n+1)*(n+1)-_count;

    SetLength(buf, _count);

 

    el:=0;

 

    for i := 0 to (n+1)*(n+1)-1 do

    if matr_for_table[i] <> 0

    then

      begin

        buf[el] := matr_for_table[i];

        inc(el);

      end;

 

    matr_for_table := nil;

    SetLength(matr_for_table, _count);

 

    for i := 0 to _count-1 do

      matr_for_table[i] := buf[i];

 

    count := _count;

end;

 

 

function TCPoly.get_count(): integer;

begin

  Result:=count;

end;

 

function TCPoly.get_el_array(i_row:integer): Extended;

begin

    Result:=matr_for_table[i_row];

end;

 

function  TCPoly.get_str(): string;

begin

  Result:=v_str;

end;

 

function  TCPoly.idx(i,j:integer):integer;   //   функция возвращающая индект одномерного массива по значениям строки и столбца матрицы

begin

Result:=i*(n+1)+j;

end;

 

procedure TCPoly.ClearMatr;

var i:integer;

begin

  //установка размера и очистка  матрицы

  SetLength(matr,(n+1)*(n+1));

  for i:=0 to (n+1)*(n+1)-1 do matr[i]:=0;

 

  SetLength(matr_for_table,(n+1)*(n+1));

  for i:=0 to (n+1)*(n+1)-1 do matr_for_table[i]:=0;

end;

 

 

//--------------------------------------------------------------------------

procedure TCPoly.PolyCheb(_n, _rod: integer);   //Чебышева

var i,j:integer;   //счетчики для циклов  (i номер строки, j номер столбца)

begin

n:=_n; rod := _rod;

ClearMatr;  //  создание чистой матрицы нужного размера

matr[idx(0,0)]:=1;     //коэф при нулевой степени х

Информация о работе Ортогональные полиномы Чебышева