Доброго времени суток!
В институте задали написать программу, которая:
1.Численно посчитать первую и вторую производную функции, заданной таблично.
2. Вычислить с помощью формулы прямоугольников определенный интеграл, полагая n = 4.
3. Вычислить с помощью формулы трапеций определенный интеграл.
Написала код:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Grids;
type
ta=array of real;
TForm1 = class(TForm)
LabeledEdit1: TLabeledEdit;
LabeledEdit2: TLabeledEdit;
LabeledEdit3: TLabeledEdit;
Button1: TButton;
StringGrid1: TStringGrid;
LabeledEdit4: TLabeledEdit;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
procedure Button1Click(Sender: TObject);
procedure LabeledEdit3Change(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
New2:real;
a,b,xn:real;
n:integer;
x,y:ta;
implementation
{$R *.dfm}
function f(x:real):real;
begin
result:=(sqr(x)+0.5)/sqrt(sqr(x)+1);
end;
procedure TForm1.Button1Click(Sender: TObject);
var h:real; i,j:integer;
begin
a:=StrTofloat(labelededit1.Text);
b:=StrTofloat(labelededit2.Text);
x[0]:=a;
x[n]:=b;
y[0]:=f(x[0]);
h:=(b-a)/(n-1);
for i:=1 to n do
x[i]:=x[i-1]+h;
for i:=0 to n do
begin
y[i]:=f(x[i]);
stringgrid1.Cells[i,0]:=floattostrf(x[i],fffixed,10,2);
stringgrid1.Cells[i,1]:=floattostrf(y[i],fffixed,10,2);
end;
end;
procedure TForm1.LabeledEdit3Change(Sender: TObject);
begin
n:=StrToInt(labelededit3.Text);
SetLength(x,n+1);
SetLength(y,n+1);
WITH StringGrid1 DO
begin
RowCount:=(2);
ColCount:=(n);
end;
end;
function NEW1 ({key:integer;} X,Y: ta;n:integer;h:real;Xn:REAL):REAL;
VAR I,J,k,key: INTEGER;
BEGIN
I := 2;
while i<= 5 do
begin
if xn<x[i] then
begin
k:=i;
i:=6;
end
else i:=i+1;
end;
if xn<(x[k-1]+h/4)then
begin
j:= k-1;
key:=1;
if j=1 then key:=4;
end
else
if xn>(x[k-1]+3*h/4) then
begin
j:= k;
key:=1;
if j=5 then key:=5 ;
end
else
begin
j:=k-1;
key:=3;
end;
CASE KEY OF
1: NEW1 := (1/(2*h))*(y[j+1]-y[j-1]);//Стерлинг
3: New1 := (1/h*(y[j+1]-y[j]));//бессель
4: NEW1 := (1/(2*h))*(-3*y[j]+4*y[j+1]-y[j+2]);//Ньютон1
5: NEW1 := (1/(2*h))*(3*y[j]-4*y[j-1]+y[j-2]);//Ньютон2
END;
NEW2 := (1/(h*h))*(y[j+1]-2*y[j]+y[j-1]);// 2я производная
END;
procedure TForm1.Button2Click(Sender: TObject);
var a,b,dx,x,y: real;
n,i: integer;
XX,YY:ta;
h,xn:real;
begin
try
a:=StrTofloat(labelededit1.Text);
b:=StrTofloat(labelededit2.Text);
xn:= StrToFloat(labelededit4.Text);
except
ShowMessage('Неверные данные');
exit;
end;
dx := (b-a)/n;
//Площадь по формуле левых прямоугольников:
y := 0; x := a; {x = a = X0}
For i:=1 to n do {x < Xn}
begin
y := y + f(x);
x := x + dx; {x = X0, X1, X2 ... Xn-1}
end;
y := y * dx;
Form1.Edit1.Text := FloatToStrF(y,ffFixed,10,3);
//Площадь по формуле правых прямоугольников:
y := 0; x := a + dx; {x = X1}
For i:=1 to n do {x <= Xn}
begin
y := y + f(x);
x := x + dx; {x = X1, X2, X3 ... Xn}
end;
y := y * dx;
Form1.Edit2.Text := FloatToStrF(y,ffFixed,10,3);
//Площадь по формуле середенных прямоугольников:
y := 0; x := a + dx/2; {x = X1}
For i:=1 to n do
begin
y := y + f(x);
x := x + dx; {x = X1, X2, X3 ... Xn}
end;
y := y * dx;
Form1.Edit3.Text := FloatToStrF(y,ffFixed,10,3);
//Площадь по формуле трапеций:
y := 0; x := a + dx; {x = X1}
while x < b do begin {x < Xn}
{ For i:=1 to n do
begin}
y := y + f(x);
x := x + dx; {x = X1, X2, X3 ... Xn-1}
end;
y := (y + (f(a)+f(b))/2) * dx;
Form1.Edit4.Text := FloatToStrF(y,ffFixed,10,3);
For i:=1 to 5 do
begin
xx[i]:=a+h*(i-1);
yy[i]:= f(xx[i]);
end;
Form1.Edit5.Text := FloatToStrF(new1(XX,YY,n,h,xn),ffFixed,7,3);
//Вторая производная
Form1.Edit6.Text := FloatToStrF(new2,ffFixed,7,3);
end;
end.
Ошибок нет. Только предупреждения. Но программа валится, вообще отказываясь что либо считать.
Помогите, пожалуйста. Очень нужно!!!