Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi] Cоставить функцию для вычисления приближенного зна


Автор: dark99 20.4.2011, 17:11
Cоставить функцию для вычисления приближенного значение интеграла

Автор: leniviy 21.4.2011, 16:27
Что такое "p", я не понял, но остальное вроде бы понял.
Код

function f_line(x: real): real;
begin
  f_line:= x;
end;

function f_arc(x: real): real;
begin
  f_arc:= Sqrt( 1 - Sqr(x) );
end;

const
  h: real = 0.01;

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

function integral(
    f: Tf;
    x0, xn: real
  ): real;
var
  rslt: real = 0;
  n: Integer;
  i: Integer;
  xi, xi1, fxi, fxi1: real;
begin
  n:= Trunc((xn - x0) / h);
  xi:= x0;
  fxi:= f(xi);
  for i:=1 to n do
  begin
    if (i = n) then
      xi1:= xn
    else
      xi1:= x0 + (h * i);
    fxi1:= f(xi1);
    rslt:= rslt + ( h/2 * ( fxi + fxi1 ) );
    xi:= xi1;
    fxi:= fxi1;
  end;
  integral:= rslt;
end;

begin
  writeln(integral(@f_line, 0, 1) :0:5 );
  writeln(integral(@f_arc, -1, 1) :0:5 );
end.


Автор: dark99 23.4.2011, 10:15
Код

  rslt: real = 0;


Ошибку выдает тут

Автор: leniviy 23.4.2011, 10:29
ну тада, 
Код

 rslt: real;
...
begin
  result:= 0;

Автор: dark99 23.4.2011, 12:06
Код

  result:= 0;


Неизвестный идентефикатор

Автор: leniviy 23.4.2011, 12:55
Ну не result , а rslt. Что, даже очевидные вещи непонятны?

Автор: dark99 23.4.2011, 13:29
У меня паскаль такой? Везде ошибки находит?

n:integer;

Неизвестный идентефикатор

Автор: leniviy 23.4.2011, 15:18
вот код для turbo pascal 7
Код

{$F+}
function f_line(x: real): real;
begin
  f_line:= x;
end;
function f_arc(x: real): real;
begin
  f_arc:= Sqrt( 1 - Sqr(x) );
end;
{$F-}


const
  h: real = 0.01;
type
  Tf = function (x: real) : real;
function integral(
    _f: Pointer;
    x0, xn: real
  ): real;
var
  rslt: real;
  i: Integer;
  xi, xi1, fxi, fxi1: real;
  f: Tf;
begin
  f:= Tf(_f);
  rslt:= 0;
  xi:= x0;
  fxi:= f(xi);
  i:= 1;
  while (xi < xn) do
  begin
    xi1:= x0 + (h * i);
    if (xi1 > xn) then
      xi1:= xn;
    fxi1:= f(xi1);
    rslt:= rslt + ( h/2 * ( fxi + fxi1 ) );
    xi:= xi1;
    fxi:= fxi1;
    i:= i+1;
  end;
  integral:= rslt;
end;
begin
  writeln(integral(@f_line, 0, 1) :0:5 );
  writeln(integral(@f_arc, -1, 1) :0:5 );
end.

Автор: dark99 24.4.2011, 02:09
0.50000
1.57021
2


так получается ответ?

Автор: leniviy 24.4.2011, 09:37
Да. 1.57021 - это π/2, интеграл от функции арки от -1 до 1.
0.5 - интеграл от функции f(x) = x, от 0 до 1.
а рандом в конце я просто забыл убрать, это не ответ

Автор: dark99 24.4.2011, 20:22
Цитата

0.50000
1.57021
2




Последняя строчка меняется каждый раз на разный, если запускаешь. Все верно?

Автор: leniviy 24.4.2011, 21:06
исправил, больше не меняется

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)