Проблема с интегрированием!
Добрый день, у меня такая проблема при вводе границ интеграла от -2.5 до 4,5 всё зависает и не работает, мной было посчитан интеграл и ответ получился отрицательным, -1,288. при положительных границах всё считает! Где ошибка?
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, jpeg, TeEngine, Series, TeeProcs, Chart;
type
TForm1 = class(TForm)
edt1: TEdit;
lbl1: TLabel;
edt2: TEdit;
lbl2: TLabel;
lbl4: TLabel;
lbl5: TLabel;
Button1: TButton;
edt4: TEdit;
edt5: TEdit;
lbl6: TLabel;
lbl7: TLabel;
lbl8: TLabel;
edt6: TEdit;
edt7: TEdit;
edt8: TEdit;
img1: TImage;
Chart1: TChart;
Grafiks: TButton;
Series1: TFastLineSeries;
procedure Button1Click(Sender: TObject);
procedure GrafiksClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
a,b:Real;
implementation
{$R *.dfm}
function f(x:real):real;
begin
f:=(3*x+4)/((x+1)*sqr(x-2));
end;
function Trapeces(a,b:real;n:integer):real;
var
i:integer;
x1,x2,p,S:real;
begin
p:=abs((b-a))/n;
S:=0;
for i:=0 to n-1 do
begin
x1:=a+i*p;
x2:=a+(i+1)*p;
S:=S+((f(x1)+f(x2))/2)*p;
end;
Trapeces:=S;
end;
function Simpson(a,b:real;n:integer):real;
var
i:integer;
x1,x2,p,S:real;
begin
p:=(abs(b-a))/n;
S:=0;
for i:=0 to n-1 do
begin
x1:=a+i*p;
x2:=a+(i+1)*p;
S:=S+((x2-x1)/6)*(f(x1)+4*f((x1+x2)/2)+f(x2));
end;
Simpson:=S;
end;
function LabaisTaisnstruri(a,b:real;n:integer):real;
var
i:integer;
x,p,S:real;
begin
p:=(abs(b-a))/n;
S:=0;
for i:=1 to n do
begin
x:=a+i*p;
S:=S+p*f(x);
end;
LabaisTaisnstruri:=S;
end;
function KreisaisTaisnstruri(a,b:real;n:integer):real;
var
i:integer;
x,p,S:real;
begin
p:=(abs(b-a))/n;
S:=0;
for i:=0 to n-1 do
begin
x:=a+(i+1)*p;
S:=S+p*f(x);
end;
KreisaisTaisnstruri:=S;
end;
function VidejaisTaisnstruri(a,b:real;n:integer):real;
var
i:integer;
x,p,S:real;
begin
p:=(abs(b-a))/n;
S:=0;
for i:=0 to n-1 do
begin
x:=a+i*p+p/2;
S:=S+p*f(x);
end;
VidejaisTaisnstruri:=S;
end;
function int1(a,b,e:real):real;
var
n:integer;
I1,I2:real;
begin
n:=1;
repeat
I1:=Trapeces(a,b,n);
I2:=Trapeces(a,b,2*n);
n:=2*n;
until (abs(I2-I1)<=0.002);
int1:=I2;
end;
function int2(a,b,e:real):real;
var
n:integer;
I1,I2:real;
begin
n:=1;
repeat
I1:=Simpson(a,b,n);
I2:=Simpson(a,b,2*n);
n:=2*n;
until (abs(I2-I1)<=0.002);
int2:=I2;
end;
function int3(a,b,e:real):real;
var
n:integer;
I1,I2:real;
begin
n:=1;
repeat
I1:=LabaisTaisnstruri(a,b,n);
I2:=LabaisTaisnstruri(a,b,2*n);
n:=2*n;
until (abs(I2-I1)<=0.002);
int3:=I2;
end;
function int4(a,b,e:real):real;
var
n:integer;
I1,I2:real;
begin
n:=1;
repeat
I1:=KreisaisTaisnstruri(a,b,n);
I2:=KreisaisTaisnstruri(a,b,2*n);
n:=2*n;
until (abs(I2-I1)<=0.002);
int4:=I2;
end;
function int5(a,b,e:real):real;
var
n:integer;
I1,I2:real;
begin
n:=1;
repeat
I1:=VidejaisTaisnstruri(a,b,n);
I2:=VidejaisTaisnstruri(a,b,2*n);
n:=2*n;
until (abs(I2-I1)<=0.002);
int5:=I2;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
a:=StrToFloat(edt1.Text);
b:=StrToFloat(edt2.Text);
edt4.Text:=FloatToStr(int1(a,b,0.002));
edt5.Text:=FloatToStr(int2(a,b,0.002));
edt6.Text:=FloatToStr(int3(a,b,0.002));
edt7.Text:=FloatToStr(int4(a,b,0.002));
edt8.Text:=FloatToStr(int5(a,b,0.002));
end;
procedure TForm1.GrafiksClick(Sender: TObject);
var
i:integer;
x,y:real;
begin
Series1.Clear;
for i:=0 to 2500 do
begin
x:=a+i*0.001;
y:=f(x);
Series1.AddXY(x,y);
end;
end;
end.
|