Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на вычисление интеграла
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
garry_m
И снова привет! Тут мне задали решить задачку, но в итоге, решая ее, я запутался напрочь...

Поставленная задача:
Нажмите для просмотра прикрепленного файла

Я пытался ее решить, но ничего не выходит увы...
Код:
uses crt;

type tFunct=function(x:real):real;
var sum:real;{peremennaja summi}
x,y,z,e,{-peremennije po usloviju}
a1,a2,b1,b2{intervali dlja functij},
Integ1,Integ2 {-Rezultati rascheta integralov}: real;
{Functija (x^2-1)*10^-2*x}
function f1(x:real):real;far;
var tmp:real;
i:integer;
begin
tmp:=1;
for i:=1 to 3 do tmp:=tmp*((x^2-1)*10^-2*x);
f1:=tmp;
end;
{Functija 1/(ln(x))^2}
function f2(x:real):real;far;
var tmp:real;
i:integer;
begin
tmp:=1;
for i:=1 to 3 do tmp:=tmp*x;
f2:=tmp*1/(x*ln(x)^2);
end;
{Integral}
function integr (x,y,e:real;F:tFunct):real;
var di,dx,sum1,sum2:real;
n:longint;
zf1,zf2,min,max:real;
dd:integer;
begin
di:=y-x; {Dlina intervala}
n:=10; {Nachalnoje znachenije kol-va intervalov}
repeat
dx:=di/n;
sum1:=0; sum2:=0;
z:=x;
while z<y do
begin
zf1:=F(z);zf2:=F(z+dx);
if zf1<zf2 then begin min:=zf1;max:=zf2;end
else begin min:=zf2;max:=zf1;end;
sum1:=sum1+dx*min;
sum2:=sum2+dx*max;
z:=z+dx;
{----v processe.... dlja polzovatelja}
dd:=dd+1;
case dd of
1:write('\');
2:write('|');
3:write('/');
4:write('-');
else
begin dd:=0;write('\');end;
end;
gotoxy(WhereX-1,WhereY);
{----------------------}
end;
write('.');
n:=2*n;
until abs(sum2-sum1)<e;
integr:=sum1;
writeln;
end;

{osnovnaja programma}
begin
clrscr;
repeat
write('Vvedite tochnost vichislenija integrala e: ');
readln(e);
until e>0;
writeln('Po usloviju A1=0 i B1=0.4');
repeat
write('Vvedite interval A..B dlja pervogo integrala: ');
readln(a1,b1);
until a1<b1;
writeln('Po usloviju A2=2.0 i B2=2.5');
repeat
write('Vvedite interval A..B dlja vtorogo integrala: ');
readln(a2,b2);
until a2<b2;
write('Podozhdite idet raschet');
Integ1:=integr(a1,b1,e,f1);
writeln('Integral ot ((x^2-1)*10^-2*x) = ',integ1:12:6);
write('Podozhdite idet raschet');
Integ2:=integr(a2,b2,e,f2);
writeln('Integral ot 1/x*(ln(x))^2 = ',integ2:12:6);
write('Dlja prodolzhenija mazhmite Enter...');
readkey;
end.
klem4
Елки-палки, FAQ для красоты сделан ?

FAQ : Численное интергирование, метод прямоугольников
garry_m
То, что написано в FAQ мне понятно!
У меня не получается связать все вместе, то что я отпостил. В моей задаче почти все сделано... вот я к вам и обращаюсь за помощью. blink.gif
volvo
Я не понял, а зачем ты так извращался с функциями F1 и F2? Все же гораздо проще:

uses crt;

type
TFunct = function(x: real): real;

var
x,y,z,e,
a1,a2,b1,b2: real;


function f1(x: real): real; far;
begin
f1 := (sqr(x) - 1) * Exp((-2*x)*Ln(10));
end;

function f2(x: real): real; far;
begin
f2 := 1 / (x * sqr(ln(x)));
end;

{ Integral }
function integr(x, y, e: real; F: TFunct): real;
const
n = 100;
var
sum, shag: real;
i: integer;
begin
shag := (y - x) / n;
sum := 0;
for i := 1 to n - 1 do
sum := sum + F(shag*i + x);

sum := sum + (F(x)+F(y))/2;
integr := (y - x) / n * sum;
end;


{ osnovnaja programma }
begin
clrscr;
repeat
write('Vvedite tochnost vichislenija integrala e: ');
readln(e);
until e>0;
writeln('Po usloviju A1=0 i B1=0.4');
repeat
write('Vvedite interval A..B dlja pervogo integrala: ');
readln(a1,b1);
until a1<b1;
writeln('Po usloviju A2=2.0 i B2=2.5');
repeat
write('Vvedite interval A..B dlja vtorogo integrala: ');
readln(a2,b2);
until a2<b2;
write('Podozhdite idet raschet');
writeln('Integral ot ((x^2-1)*10^-2*x) = ',integr(a1,b1,e,f1):12:6);
write('Podozhdite idet raschet');
writeln('Integral ot 1/x*(ln(x))^2 = ',integr(a2,b2,e,f2):12:6);
write('Dlja prodolzhenija mazhmite Enter...');
readkey;
end.
garry_m
Да у меня просто не получалось правильно функцию записать. А в программе я действительно намутил. Thnx!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.