| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- Uses CRT,GRAPH;
- Const
- MinX : real = 1;
- MaxX : real = 10;
- MinY : real = MaxInt;
- MaxY : real = -MaxInt;
- {---------------------}
- LagrTable = 20;
- {---------------------}
- CStep = 1000;
- TVer = 0.01;
- Left = 30;
- Right = 400;
- Top = 20;
- Bottom = 400;
- {-----------------------------}
- Type
- LD = array [0..LagrTable] of record
- x,y : real;
- end;
- TB = array [0..LagrTable] of boolean;
- var
- Thresh : real;
- Pts : LD;
- BegiP,
- EndiP : TB;
- Function Func(x: real): real;
- Begin
- { Func := ln(abs(x));}
- Func := Sin(x)*x;
- { Func := 1.4*x+2;}
- { Func := X*X/10 * sin (x/2)}
- End;
- {-----------------------------}
- Function Lagr(X:real; var T : TB):real;
- var
- i,j,n : word;
- c,ret : real;
- begin
- n := LagrTable;
- ret:=0;
- for i := 0 to n do if T[i] then
- begin
- c:=1;
- for j := 0 to n do
- if (j <> i) AND T[j] then
- C := C * (X-Pts[j].X) / (Pts[i].X-Pts[j].X);
- ret := ret + Pts[i].Y*C;
- end;
- Lagr := ret;
- end;
- {-----------------------------}
- Procedure SetMinMax(var T:tb);
- var
- c:real;
- i:word;
- begin
- if MaxX < MinX then
- begin
- C := MaxX;MaxX := MinX;MinX := C;
- end;
- for i := 0 to Cstep do
- begin
- C := Lagr(MinX+i/CStep*(MaxX-MinX),T);
- if C > MaxY then MaxY:=C;
- if C < MinY then MinY:=C;
- end;
- end;
- {-----------------------------}
- Procedure InitG;
- Var
- grDriver: Integer;
- grMode: Integer;
- i : integer;
- Begin
- grDriver := Detect;
- InitGraph(grDriver, grMode,'');
- if GraphResult <> grOk then
- begin
- WriteLn('Graph error!');
- Halt(255);
- end;
- End;{InitG}
- {---------------------------------}
- Procedure DrawAxis;
- var
- i : integer;
- s : string;
- begin
- SetColor(White);
- Line(Left,Bottom,Right+10,Bottom);
- Line(Right-5,Bottom-5,Right+10,Bottom);
- Line(Right-5,Bottom+5,Right+10,Bottom);
- Line(Left,Top-10,Left,Bottom);
- Line(Left,Top-10,Left-5,Top+5);
- Line(Left,Top-10,Left+5,Top+5);
- OutTextXY(Left-15,Top,'Y');
- OutTextXY(Right,Bottom+10,'X');
- Str(MaxX:0:2,S);
- OutTextXY(Right,Bottom-10,S);
- Str(MinX:0:2,S);
- OutTextXY(Left,Bottom-10,S);
- Str(MaxY:0:2,S);
- OutTextXY(Left+10,Top,S);
- Str(MinY:0:2,S);
- OutTextXY(Left+10,Bottom,S);
- end;
- {--------------------}
- Procedure LoadData;
- var
- i : longint;
- begin
- for i := 0 to LagrTable do
- begin
- Pts[i].x := MinX + sqrt(i)/Sqrt(LagrTable)*(MaxX-MinX);
- { Pts[i].x := MinX + i/LagrTable*(MaxX-MinX);}
- Pts[i].y := Func(Pts[i].x);
- BegiP[i] := true;
- EndiP[i] := true;
- end;
- end;
- {--------------------}
- Procedure FillTable(var T : TB);
- var
- i,j:word;
- ax,ay : string;
- begin
- SetFillStyle(SolidFill,Black);
- Bar(440,30,630,380);
- SetColor(Cyan);
- Rectangle(440,30,630,380);
- SetColor(Blue);
- j := 0;
- for i := 0 to LagrTable do if T[i] then
- begin
- Str(Pts[i].x:0:2,aX); aX:='X'+Chr(j+$30)+'='+aX;
- Str(Pts[i].y:0:2,aY); aY:='Y'+Chr(j+$30)+'='+aY;
- SetTextJustify(LeftText,CenterText);
- OutTextXY(450,round(50 + i/LagrTable*300),aX);
- OutTextXY(550,round(50 + i/LagrTable*300),aY);
- inc(j);
- end;
- end;
- {-----------------------------}
- Procedure DrawLagr(var T : TB);
- Var
- Cx,Cy : real;
- i : word;
- x, y : real;
- Begin
- Cx := (Right-Left) / (MaxX-MinX);
- Cy := (Bottom-Top) / (MaxY-MinY);
- MoveTo(Left,round(Bottom-(Lagr(MinX,T)-MinY)*Cy));
- for i := 0 to CStep do
- begin
- x:=MinX + i/CStep*(MaxX-MinX);
- y:=Lagr(X,T);
- LineTo(round(Left+(X-MinX)*Cx),round(Bottom-(Y-MinY)*Cy));
- end;
- SetColor(Red);
- for i:=0 to Lagrtable do if T[i] then
- Circle(round(Left+(Pts[i].X-MinX)*Cx),round(Bottom-(Pts[i].y-MinY)*Cy),2);
- End;{DrawLagr}
- {-------------}
- Function Check(var T1, T2 : TB):boolean;
- var
- i : word;
- x, y1, y2 : real;
- Step : word;
- Begin
- Check := true;
- Step := CStep div 10;
- for i := 0 to Step do
- begin
- x:=MinX + i/Step*(MaxX-MinX);
- y1:=Lagr(X,T1);
- y2:=Lagr(X,T2);
- if abs(y1-y2) >= Thresh then
- begin
- Check := false;
- Exit;
- end;
- end;
- end;
- var
- CKick : word;
- ifDel : boolean;
- cS : word;
- Begin
- LoadData;
- InitG;
- SetMinMax(BegIp);
- Thresh := TVer * (MaxY-MinY);
- DrawAxis;
- { WriteGraph(CStep);}
- FillTable(BegIp);
- SetColor(Green);
- DrawLagr(BegIp);
- CKick :=0;
- for cS := 1 to LagrTable-1 do
- begin
- EndiP[cS] := false;
- if Check(BegiP,EndiP) then
- { if abs(Lagr(Pts[cS].X,BegIP)-Lagr(Pts[cS].X,EndIP)) < Thresh then}
- inc(CKick)
- else
- EndiP[cs] := true;
- end;
- ReadKey;
- FillTable(EndiP);
- SetColor(White);
- DrawLagr(EndiP);
- ReadLn;
- CloseGraph;
- WriteLn('Выкинуто точек - ',CKick);
- End.
|