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

3.5.2 Интерполяционный многочлен Ньютона

3.5.2.1 Листинг

unit Unit1;

interface

uses

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

Dialogs, StdCtrls, Grids, ExtCtrls, jpeg;

type

TForm1 = class(TForm)

Image1: TImage;

lbl9: TLabel;

lbl10: TLabel;

lbl7: TLabel;

bvl1: TBevel;

img2: TImage;

StringGrid1: TStringGrid;

Edit1: TEdit;

Button2: TButton;

Button1: TButton;

Memo1: TMemo;

Edit2: TEdit;

Button3: TButton;

lbl8: TLabel;

lbl1: TLabel;

lbl2: TLabel;

lbl3: TLabel;

lbl4: TLabel;

lbl5: TLabel;

lbl6: TLabel;

Image2: TImage;

lbl11: 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,Fx:extended;

L,a,y:Mas;

i,j,n,k: integer;

x,yy:real;

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;

Button2.Enabled:=True;

end;

function PH(x: Extended; a,y:Mas ; var Xmax,Xmin,Ymax,Ymin:extended):Extended;

var

Sum, Mng, Pn,Pr: extended;

begin

Pn:=0;

For i:=1 to n do

begin

Fx:=1;

Sum:=0;

for k:=1 to i do

begin

for j:=1 to i do

begin

if k<>j then

Fx:=1/(a[k]-a[j])*Fx;

end;

Fx:=Fx*y[k];

Sum:=Sum+Fx;

Fx:=1;

end;

Pr:=1;

if i>1 then

for k:=1 to i-1 do

Pr:=Pr*(x-a[k]);

sum:=sum*pr;

Pn:=Pn+Sum;

end;

PH:=Pn;

Xmax:=10;

Xmin:=-10;

Ymax:=10;

Ymin:=-10;

end;

procedure TForm1.Button2Click(Sender: TObject);

var x,yy:real;

PX,PY:integer;

i,Apx,Ypx: Integer;

begin

Image1.Picture:= nil;

n:=StrToInt(Edit1.text);

Xmax:=10;

Xmin:=-10;

Ymax:=10;

Ymin:=-10;

for j:=1 to n do

begin

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

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

end;

for j:=1 to n do

begin

Apx:=trunc((a[j]-Xmin)*Image1.Width/(Xmax-Xmin));

Ypx:=trunc(Image1.Height-(y[j]-Ymin)*Image1.height/(Ymax-Ymin));

Image1.Canvas.Pixels[Apx,Ypx]:=clBlack;

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:=(PH(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:=(PH(x,a,y,Xmax,Xmin,Ymax,Ymin));

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

Image1.Canvas.Pen.Color:=clGreen;

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:=(PH(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 Edit2.Text:=FloatToStrF(xx,ffFixed,4,2);

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.