Пользователь
Регистрация: 05.04.2009
Сообщений: 78
|
Вычисление интеграла
Здравствуйте, Господа эксперты. Помогите полжалуйста переписать следующюю программу с использованием функций. Вот код:
Код:
Program task1;
uses CRT;
var a,b,c,d,R,n,j:integer;
e,I,I0,F,x,y,h:real;
Begin
CLRSCR;
repeat
write('Введите R (R>0): ');
readln(R);
until (R>0);
repeat
write('Введите c (c>0): ');
readln(c);
until (c>0);
repeat
write('Введите d (d>0): ');
readln(d);
until (d>0);
write('Введите a: ');
readln(a);
repeat
write('Введите b (b>a): ');
readln(b);
until (b>a);
repeat
write('Введите точность вычислений e (e>0): ');
readln(e);
until (e>0);
n:=1; {начальное значение n}
x:=a; {начальное значение x}
if x>=R then y:=c
else if x>-R then y:=sqrt(R*R-x*x)
else y:=d; {начальное значение y}
I:=(b-a)*y; {начальное значение интеграла}
repeat
I0:=1; {старое значение интеграла}
I:=0;
n:=n*512; {новое значение n}
h:=(b-a)/n; {длина каждого отрезка}
for j:=1 to n do {в цикле считаем интеграл при текущем значении n}
begin
x:=a+h*(j-1);
if x<>R then y:=c
else
if x>-R then y:=sqrt(R*R-x*x)
else y:=d;
I:=I+h*y;
end;
until ((I0-I)<e); {Повторять до заданной точности e}
writeln('Интеграл разбит на ',n,' отрезков. Его значение на отрезке [',a,',',b,']=',I:10:3);
readln;
end.
Вот, то что у меня получилось:
Код:
{$N+}
program task1;
uses crt;
procedure InputData(var R,c,d,a,b,Eps:extended);
begin
repeat
write('Введите R (R>0): ');
readln(R);
until (R>0);
repeat
write('Введите c (c>0): ');
readln(c);
until (c>0);
repeat
write('Введите d (d>0): ');
readln(d);
until (d>0);
write('Введите a: ');
readln(a);
repeat
write('Введите b (b>a): ');
readln(b);
until (b>a);
repeat
write('Введите точность вычислений Eps (Eps>0): ');
readln(Eps);
until (Eps>0);
end;
function F(x,R,c,d:extended):extended;
var res:extended;
begin
if x>=R then
res:=c
else if x>-R then
res:=sqrt(R*R-x*x)
else if x<>R then
res:=c
else if x>-R then
res:=sqrt(R*R-x*x) else
res:=d;
F:=res;
end;
procedure StepOfCalculation(b,a:extended; var n:longint; var h:extended);
begin
n:=n*512;
h:=(b-a)/n;
end;
function CalculationIntegral(n:longint; a,b,I1,h,Eps,c,d,R:extended; var x:extended):extended;
var i:longint;
I2:extended;
begin
n:=1;
I2:=0;
repeat
x:=a;
I1:=1;
StepOfCalculation(b,a,n,h);
I2:=0;
for i:=1 to n do
begin
x:=a+h*(i-1);
I2:=I2+h*F(x,R,c,d);
end;
until ((I1-I2)<Eps);
CalculationIntegral:=I2;
end;
procedure OutputData(n:longint; a,b,I1,h,Eps,c,d,R,x:extended);
begin
writeln('Значение интеграла равно ',CalculationIntegral(n,a,b,I1,h,Eps,c,d,R,x));
end;
var Eps,x,I1,h,a,b,c,d,R:extended;
n:longint;
begin
clrscr;
InputData(R,c,d,a,b,Eps);
OutputData(n,a,b,I1,h,Eps,c,d,R,x);
readln;
end.
Но программа почему то неправильно вычисляет значение интеграла. Помогите пожалуйста найти ошибку. Заранее огромное спасибо!!!
|