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

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

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

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

Файлы: 1 файл

Курсовая.doc

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

matr[idx(1,1)]:=rod+1;   //коэф при первой степени х  (для 1 рода=1, для второго рода=2)

//заполнение матрицы в циклах

for i:=2 to n do

  for j:=(i mod 2) to n do

    if ((i+j) mod 2)=1 then continue

    else begin     //рассчет коэффициента в i-строке и j-столбце

             matr[idx(i,j)]:= - matr[idx(i-2,j)];

             if j>0 then  matr[idx(i,j)]:=matr[idx(i,j)]+2*matr[idx(i-1,j-1)];

         end;

ShowPolynomial;

end;

 

 

//======================  Вывод многочлена  в окно  ================================

 

function TCPoly.st(gr:integer):string;      //вывод степени, если нужно

var res:string;

begin

  if gr<>1 then

      res:='^'+IntToStr(gr);

  Result:=res;

end;

 

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

function TCPoly.xst(gr:integer):string;      //вывод Х в степени, если нужно

var res:string;

begin

  if not(gr=1) then res:=#183;  //точка, знак  умножения

  if gr>0 then res:=res+'x'+st(gr);

  Result:=res;

end;

 

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

function TCPoly.koef(gr:integer):string;    //функция  которая допишет остаток данного  слагаемого многочлена

var res:string;

begin

  if gr=0 then begin res := FloatToStr(matr[idx(n,gr)]); matr_for_table[idx(n,gr)] := matr[idx(n,gr)] end

  else //gr>0

    begin

      if matr[idx(n,gr)]=-1 then res:='-'

      else if not(matr[idx(n,gr)]=1) then

              begin

                matr_for_table[idx(n,gr)] := matr[idx(n,gr)];

                res:=FloatToStr(matr[idx(n,gr)])+xst(gr);

              end

           else {=1} res:=xst(gr);

    end;

    Result:=res;

end;

 

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

 

procedure TCPoly.ShowPolynomial;//вывод результата в  виде строки многочлена

var s:string;

    gr:integer;   //степень члена многочлена (или номер столбца)

begin

          for gr:=n downto 0 do

            begin

              if matr[idx(n,gr)]=0 then continue;

              if (gr=n) or (matr[idx(n,gr)]<0) then

                  s:=s + ' '//коэф без знака "+"

              else if matr[idx(n,gr)]>0 then

                s:=s + ' +';//остальные положительные члены знака "+"

 

              s:=s +koef(gr);  //функция которая допишет остаток данного слагаемого многочлена

            end;

v_str:=s;

end;

 

procedure TCPoly.Get_Table(SG : TStringGrid);

var row, _count: integer;

begin

  SG.ColCount := 2;

  SG.RowCount := count+1;

  sg.FixedRows := 1;

  SG.FixedCols := 0;

  SG.Cells[1, 0] := 'коэфф.';

  SG.Cells[0, 0] := 'x^';

  _count := n;

 

  for row := count - 1 downto 0 do

  begin

    SG.Cells[1, row+1] := FloatToStr(matr_for_table[row]);

    SG.Cells[0, row+1] := IntToStr(_count);

    _count := _count - 2;

  end;

 

end;

 

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

var st: integer;

    _x: Extended;

begin

  _x:=X;

  for st := 2 to stepen do

    X:=X*_x;

  Result:= X;

end;

 

procedure TCPoly.Get_Chart(Ch: TChart);

var

  x,y: Extended;

  _count, i: integer;

begin

  x := -1;

  _count := n;

  y := 0;

  CH.Series[0].Clear;

 

 

  while x<=1 do

  begin

 

    for i := count - 1 downto 0 do

    begin

        y:=y+stepX(x,_count)*matr_for_table[i];

        _count := _count - 2;

    end;

 

 

    CH.Series[0].AddXY(x,y);

 

    x:=x+0.001;

    y := 0;

    _count := n;

 

  end;

Ch.SaveToBitmapFile(GetCurrentDir+'\PictureChart.bmp');

end;

 

procedure TCPoly.Import_To_Excel(rod, por:integer);

var row, _count: integer;

excel: variant;

begin

try

 

// создаем обьект EXCEL

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

 

// Чтоб не задавал вопрос о  сохранении документа

  excel.DisplayAlerts := false;

 

// создаем новый документ рабочую  книгу

  excel.WorkBooks.Add;

//присваиваем диапазону значения

  excel.WorkBooks[1].WorkSheets[1].Cells[1, 1] := 'Полином Чебышева '

                                                    + IntToStr(rod+1)+'-го рода '

                                                    + IntToStr(por)+' степени';

 

  excel.WorkBooks[1].WorkSheets[1].Cells[2, 1] := v_str;

 

  excel.WorkBooks[1].WorkSheets[1].Cells[4, 2] := 'коэфф.';

  excel.WorkBooks[1].WorkSheets[1].Cells[4, 1] := 'x^';

  _count := n;

 

  for row := count - 1 downto 0 do

  begin

    excel.WorkBooks[1].WorkSheets[1].Cells[row+5,1] := FloatToStr(matr_for_table[row]);

 

    excel.WorkBooks[1].WorkSheets[1].Cells[row+5,2] := IntToStr(_count);

    _count := _count - 2;

  end;

 

  excel.WorkBooks[1].WorkSheets[1].Shapes.AddPicture(GetCurrentDir+

                                                      '\PictureChart.bmp',

                                                      1,1,100,60,600,300);

    //где

    //100 - отступ слева

    //60 - отступ сверху

    //600 - ширина

    //400 - высота

 

 

// Делаем его видимым

  excel.Visible := true;

//освобождаем интерфейсы

  excel := Unassigned;

Except

  showmessage('Внимание! Произошла ошибка при создании MS Excel приложения');

//закрываем Excel

  excel.Application.quit;

//освобождаем интерфейсы

  excel := Unassigned;

end;

end;

 

 

procedure TCPoly.Import_To_Word(rod, por:integer);

var

  word,  wdRng: variant; // Переменная в которой создаётся объект Word

begin

try

//Отчет в Word

 

  word := CreateOleObject('Word.Application');

 

// Чтоб не задавал вопрос о  сохранении документа

  word.DisplayAlerts := false;

//Новый док

  word.Documents.Add;

  word.ActiveDocument.Paragraphs.Add;

 

  wdRng:=word.ActiveDocument.Paragraphs.Item(1).Range;

  wdRng.ParagraphFormat.Alignment := wdAlignParagraphCenter;

  wdRng.InsertBefore('Полином Чебышева ');

 

  wdRng:=word.ActiveDocument.Paragraphs.Item(2).Range;

  wdRng.InsertAfter(IntToStr(rod+1)+'-го рода ' + IntToStr(por)+ ' степени      ');

 

  wdRng.InsertAfter(v_str);

 

  word.Selection.InlineShapes.AddPicture(GetCurrentDir + '\PictureChart.bmp');

 

  word.Visible := true;

//освобождаем интерфейсы

  word := Unassigned;

Except

  showmessage('Внимание! Произошла ошибка при создании MS Word приложения');

//закрываем Word

  word.Application.quit;

//освобождаем интерфейсы

  word := Unassigned;

end;

end;

 

 

end.

 

Файл описания динамической библиотеки DllForm.pas

unit DllForm;

 

interface

 

uses

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

  Dialogs, StdCtrls;

 

type

  TfrmDllForm = class(TForm)

    Label1: TLabel;

    Label2: TLabel;

    Button1: TButton;

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  frmDllForm: TfrmDllForm;

 

implementation

 

{$R *.dfm}

 

function ShowDllFormModal: integer; stdcall;

begin

  frmDllForm:= TfrmDllForm.Create(nil);

  Result:= frmDllForm.ShowModal;

end;

 

procedure TfrmDllForm.FormClose(Sender: TObject; var Action: TCloseAction);

begin

  Action := caFree;

end;

 

Exports

    ShowDllFormModal;

procedure TfrmDllForm.Button1Click(Sender: TObject);

begin

  frmDllForm.Close;

end;

 

end.

 

Файл формы отправки письма PUnit2.pas

unit Unit2;

 

interface

 

uses

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

  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,

  IdTCPClient, IdMessageClient, IdSMTP, IdMessage,

  IdExplicitTLSClientServerBase, IdSMTPBase;

 

type

  TForm2 = class(TForm)

    GroupBox1: TGroupBox;

    Memo1: TMemo;

    Button1: TButton;

    IdSMTP1: TIdSMTP;

    IdMessage1: TIdMessage;

    procedure FormCreate(Sender: TObject);

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form2: TForm2;

 

implementation

 

{$R *.dfm}

 

procedure TForm2.FormCreate(Sender: TObject);

begin

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

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

Memo1.Lines.Text := '';

 

IdSMTP1.Port := 25;

IdSMTP1.Host := 'smtp.mail.ru';

//IdSMTP1.AuthenticationType:=atLogin;

IdSMTP1.Username:='g1_ang31';

IdSMTP1.Password:='eV3mxam7Z';

end;

 

procedure TForm2.Button1Click(Sender: TObject);

var

  Msg: TIdMessage;

begin

 

Msg := TIdMessage.Create(nil);

Msg.Subject:='Poly user';

Msg.Recipients.EMailAddresses:='g1_ang31@mail.ru';

Msg.From.Address := 'g1_ang31@mail.ru';

Msg.Body.Text := Memo1.Lines.Text;

//IdSMTP1.Connect(5000);

if IdSMTP1.Connected

then

  begin

    IdSMTP1.Send(Msg);

    ShowMessage('Сообщение отправлено! Благодарю');

  end;

IdSMTP1.Disconnect;

Msg.Free;

Form2.Close;

 

end;

 

end.

 

Файл проекта COM-сервера – Project1.dpr

library Project1;

 

uses

  ComServ,

  Project1_TLB in 'Project1_TLB.pas',

  Unit1 in 'Unit1.pas' {MyClass: CoClass},

  Unit2 in 'Unit2.pas';

 

exports

  DllGetClassObject,

  DllCanUnloadNow,

  DllRegisterServer,

  DllUnregisterServer,

  DllInstall;

 

{$R *.TLB}

 

{$R *.RES}

 

begin

end.

 

Модуль описания COM – класса – Unit1.pas

unit Unit1;

 

{$WARN SYMBOL_PLATFORM OFF}

 

interface

 

uses

  Windows, ActiveX, Classes, ComObj, Project1_TLB, StdVcl,

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

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

      ExtCtrls, Buttons, Menus, Excel_TLB, Word_TLB;

 

type

  TMyClass = class(TTypedComObject, IMyClass)

  protected

      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); stdcall;

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

    procedure ClearMatr; stdcall;

    function st(gr:integer):string; stdcall;

    function xst(gr:integer):string;  stdcall;

    function koef(gr:integer):string; stdcall;

    function get_str(): string; stdcall;

    function get_count(): integer; stdcall;

    procedure ShowPolynomial; stdcall;

    function get_el_array(i_row:integer): Extended; stdcall;

    procedure whithout_zero(); stdcall;

    procedure Get_Table(SG : TStringGrid); stdcall;

    procedure Get_Chart(Ch : TChart); stdcall;

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

    procedure Import_To_Excel(rod, por:integer); stdcall;

    procedure Import_To_Word(rod, por:integer); stdcall;

  end;

 

const

  Class_MyClass: TGUID = '{FBE41A88-03B9-4EEB-B457-E49F79457FA7}';

 

 

implementation

 

uses ComServ;

 

 

procedure TMyClass.whithout_zero();

var

  buf: array of Extended;

  el: integer;

  _count: integer;

  i: 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 TMyClass.get_count(): integer;

begin

  Result:=count;

end;

 

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

begin

    Result:=matr_for_table[i_row];

end;

 

function  TMyClass.get_str(): string;

begin

  Result:=v_str;

end;

 

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

begin

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

end;

 

procedure TMyClass.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 TMyClass.PolyCheb(_n, _rod: integer);   //Чебышева

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

begin

n:=_n; rod := _rod;

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

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

matr[idx(1,1)]:=rod+1;   //коэф при первой степени х  (для 1 рода=1, для второго рода=2)

//заполнение матрицы в циклах

for i:=2 to n do

  for j:=(i mod 2) to n do

    if ((i+j) mod 2)=1 then continue

    else begin     //рассчет коэффициента в i-строке и j-столбце

             matr[idx(i,j)]:= - matr[idx(i-2,j)];

             if j>0 then  matr[idx(i,j)]:=matr[idx(i,j)]+2*matr[idx(i-1,j-1)];

         end;

ShowPolynomial;

end;

 

 

//======================  Вывод многочлена в окно  ================================

 

function TMyClass.st(gr:integer):string;      //вывод степени, если нужно

var res:string;

begin

  if gr<>1 then

      res:='^'+IntToStr(gr);

  Result:=res;

end;

 

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

function TMyClass.xst(gr:integer):string;      //вывод Х в степени, если нужно

var res:string;

begin

  if not(gr=1) then res:=#183;  //точка, знак умножения

  if gr>0 then res:=res+'x'+st(gr);

  Result:=res;

end;

 

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

function TMyClass.koef(gr:integer):string;    //функция которая допишет остаток данного слагаемого многочлена

var res:string;

begin

  if gr=0 then begin res := FloatToStr(matr[idx(n,gr)]); matr_for_table[idx(n,gr)] := matr[idx(n,gr)] end

  else //gr>0

    begin

      if matr[idx(n,gr)]=-1 then res:='-'

      else if not(matr[idx(n,gr)]=1) then

              begin

                matr_for_table[idx(n,gr)] := matr[idx(n,gr)];

                res:=FloatToStr(matr[idx(n,gr)])+xst(gr);

              end

           else {=1} res:=xst(gr);

    end;

    Result:=res;

end;

 

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

 

procedure TMyClass.ShowPolynomial;//вывод результата в  виде строки многочлена

var s:string;

    gr:integer;   //степень члена  многочлена (или номер столбца)

begin

          for gr:=n downto 0 do

            begin

              if matr[idx(n,gr)]=0 then continue;

              if (gr=n) or (matr[idx(n,gr)]<0) then

                  s:=s + ' '//коэф без знака "+"

              else if matr[idx(n,gr)]>0 then

                s:=s + ' +';//остальные положительные члены знака "+"

 

              s:=s +koef(gr);  //функция которая допишет остаток данного слагаемого многочлена

            end;

v_str:=s;

end;

 

procedure TMyClass.Get_Table(SG : TStringGrid);

var row, _count: integer;

begin

  SG.ColCount := 2;

  SG.RowCount := count+1;

  sg.FixedRows := 1;

  SG.FixedCols := 0;

  SG.Cells[1, 0] := 'коэфф.';

  SG.Cells[0, 0] := 'x^';

  _count := n;

 

  for row := count - 1 downto 0 do

  begin

    SG.Cells[1, row+1] := FloatToStr(matr_for_table[row]);

    SG.Cells[0, row+1] := IntToStr(_count);

    _count := _count - 2;

  end;

 

end;

 

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

var st: integer;

    _x: Extended;

begin

  _x:=X;

  for st := 2 to stepen do

    X:=X*_x;

  Result:= X;

end;

 

procedure TMyClass.Get_Chart(Ch: TChart);

var

  x,y: Extended;

  _count, i: integer;

begin

  x := -1;

  _count := n;

  y := 0;

  CH.Series[0].Clear;

 

 

  while x<=1 do

  begin

 

    for i := count - 1 downto 0 do

    begin

        y:=y+stepX(x,_count)*matr_for_table[i];

        _count := _count - 2;

    end;

 

 

    CH.Series[0].AddXY(x,y);

 

    x:=x+0.001;

    y := 0;

    _count := n;

 

  end;

Ch.SaveToBitmapFile(GetCurrentDir+'\PictureChart.bmp');

end;

 

procedure TMyClass.Import_To_Excel(rod, por:integer);

var row, _count: integer;

excel: variant;

begin

try

 

// создаем обьект EXCEL

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

 

// Чтоб не задавал вопрос о  сохранении документа

  excel.DisplayAlerts := false;

 

// создаем новый документ рабочую  книгу

  excel.WorkBooks.Add;

//присваиваем диапазону значения

  excel.WorkBooks[1].WorkSheets[1].Cells[1, 1] := 'Полином Чебышева '

                                                    + IntToStr(rod+1)+'-го рода '

                                                    + IntToStr(por)+' степени';

 

  excel.WorkBooks[1].WorkSheets[1].Cells[2, 1] := v_str;

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