Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет Расчетка ВЫЧМАТ.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
3.19 Mб
Скачать

3.5. Интерполяционный многочлен

3.5.1 Интерполяционный многочлен Лагранжа

3.5.1.1 Листинг

// кнопка найти после графика

unit Unit1;

interface

uses

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

Dialogs, StdCtrls, Grids, ExtCtrls, jpeg;

type

TForm1 = class(TForm)

StringGrid1: TStringGrid;

Edit1: TEdit;

Image1: TImage;

Button2: TButton;

Button1: TButton;

Label1: TLabel;

Memo1: TMemo;

Label2: TLabel;

Edit2: TEdit;

Button3: TButton;

lbl7: TLabel;

bvl1: TBevel;

img2: TImage;

lbl8: TLabel;

lbl1: TLabel;

lbl2: TLabel;

lbl3: TLabel;

lbl4: TLabel;

lbl5: TLabel;

lbl6: TLabel;

Image2: TImage;

lbl9: TLabel;

procedure Button2Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Image1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

type

Mas=array[1..100] of Extended;

var

Form1: TForm1;

Xmax,Xmin,Ymax,Ymin:extended;

L,a,y:Mas;

i,j,n: integer;

x,yy:real;

PX,PY:integer;

koord: Boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

n:=StrToInt(Edit1.text);

StringGrid1.ColCount:=n;

StringGrid1.Width:=(n)*67;

StringGrid1.Visible:=true;

end;

function Ln(x: Extended; a,y:Mas ; {передаём масштаб}var Xmax,Xmin,Ymax,Ymin:extended):Extended;

var

Sum, Mng: extended;

begin

// формула Лагранжа

Sum:=0;

for i:=1 to n do

begin

Mng:=1;

for j:=1 to n do

if i<>j then

begin

Mng:=((x-a[j])/(a[i]-a[j]))*Mng;

end;

Sum:=Mng*y[i]+Sum;

end;

Ln:=Sum;

Xmax:=10;

Xmin:=-10;

Ymax:=10;

Ymin:=-10;

end;

procedure TForm1.Button2Click(Sender: TObject);

{

var x,yy:real;

PX,PY:integer; }

begin

Image1.Picture:= nil;

n:=StrToInt(Edit1.text);

for j:=1 to n do

begin

a[j]:=StrToFloat(StringGrid1.Cells[j-1,0]);

y[j]:=StrToFloat(StringGrid1.Cells[j-1,1])

end;

//оси

image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height);

// масштаб

x:=Xmin+0*(Xmax-Xmin)/Image1.Width;

yy:=(Ln(x,a,y,Xmax,Xmin,Ymax,Ymin));

image1.Canvas.MoveTo(0,trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin)));

//построение граффика

for PX:=0 to Image1.Width do

begin

x:=Xmin+PX*(Xmax-Xmin)/Image1.Width;

yy:=(Ln(x,a,y,Xmax,Xmin,Ymax,Ymin));

PY:=trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin));

Image1.Canvas.Pen.Color:=clNavy;

Image1.Canvas.LineTo(PX,PY);

end;

Button1.Enabled:=False;

//Button2.Enabled:=False;

Button3.Enabled:=True;

koord:=True;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

x:=StrToFloat(Edit2.text);

yy:=(Ln(x,a,y,Xmax,Xmin,Ymax,Ymin));

Memo1.Lines.Add('Значение функции в точке '+FloatToStr(x)+' = '+FloatToStr(yy));

end;

procedure TForm1.Image1Click(Sender: TObject);

var

MyMouse: TMouse;

px,py:integer;

yy,xx: Extended;

begin

if Button2.Enabled=False then Exit;

if Edit1.Text='' then

n:=0

else

n:=StrToInt(Edit1.text);

if koord=False then

n:=n+1;

StringGrid1.ColCount:=n;

StringGrid1.Width:=(n)*67;

StringGrid1.Visible:=true;

Edit1.text:=IntToStr(n);

Xmax:=10;

Xmin:=-10;

Ymax:=10;

Ymin:=-10;

//захват координат точек в пикселях

px:=ScreenToClient(MyMouse.CursorPos).x-image1.Left;

py:=(ScreenToClient(MyMouse.CursorPos).y-image1.top);

{ Memo1.Lines.add(inttostr(px) + 'Х ' + inttostr(py)); }

//перевод координат в декарт

yy:=(Ymax-(py*((Ymax-Ymin)/image1.height)));

xx:=(Xmin+px*(Ymax-Ymin)/image1.width);

if koord=False then begin

StringGrid1.Cells[n-1,0]:=FloatToStrF(xx,ffFixed,4,2);

StringGrid1.Cells[n-1,1]:=FloatToStrF(yy,ffFixed,4,2); end;

if koord=True then begin

Edit2.Text:=FloatToStrF(xx,ffFixed,4,2);

end;

if koord=False then

Memo1.Lines.add('x: '+FloatToStrF(xx,ffFixed,4,2)+' y:'+FloatToStrF(yy,ffFixed,4,2));

//рисуем точки

Image1.Canvas.Ellipse(px-2,py-2,px+2,py+2);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height);

koord:=False;

end;

end.