Цитата:
Сообщение от _Dmitry
В Delphi конечно же нет. Но на форуме тема вычисления определённого интеграла обсуждалась неоднократно. Пользуйтесь поиском...
Ну, а значение функции Лапласа можно вычислить так:
Код:
type
TFunction = function(x: double): double;
//вычисление определённого интеграла методом Симпсона
//a,b-пределы интеграла, eps-точность решения, Fun-подынтегральная функция
function Simpson(Fun: TFunction; a,b,eps: double): double;
var
i,n: integer;
h,s0,s: double;
begin
n:=1; s:=0;
repeat
n:=n*2; h:=(b-a)/n; s0:=s;
s:=Fun(a)+Fun(b);
for i:=1 to n-1 do
s:=s+2*(1+i mod 2)*Fun(a+i*h);
s:=s*(b-a)/(3*n);
until abs(s-s0) <= eps;
result:=s;
end; //Simpson
//подынтегральное выражение для вычисления нормированной функции Лапласа
function Fun(t: double): double;
begin
result:=exp(-t*t/2);
end; //Fun
//нормированная функция Лапласа
function F(x: double): double;
begin
result:=Simpson(Fun,0,x,1E-12)/sqrt(2*pi);
end; //F
Формула здесь http://www.nuru.ru/teorver/026.htm
Для тестирования правильности вычислений использовалась таблица значений http://www.mathauto.ru/calc/tfl.htm
|
Выдаёт ошибку Error:
local procedure/function 'Fun' assigned to procedure variable с переводом курсора на строку " result:=Simpson(Fun,0,x,1E-12)/sqrt(2*pi)". Подскажите, пожалуйста, в чем проблема?
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TFunction = function(x: double): double;
TForm1 = class(TForm)
edt1: TEdit;
edt2: TEdit;
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
var
d,h:Real;
h_s,x_s:string;
code:Integer;
function Simpson(Fun: TFunction; a,b,eps: double): double;
var
i,n: integer;
h,s0,s: double;
begin
n:=1; s:=0;
repeat
n:=n*2; h:=(b-a)/n; s0:=s;
s:=Fun(a)+Fun(b);
for i:=1 to n-1 do
s:=s+2*(1+i mod 2)*Fun(a+i*h);
s:=s*(b-a)/(3*n);
until abs(s-s0) <= eps;
result:=s;
end; //Simpson
function Fun(t: double): double;
begin
result:=exp(-t*t/2);
end; //Fun
function F(x: double): double;
begin
result:=Simpson(Fun,0,x,1E-12)/sqrt(2*pi);
end; //F
begin
x_s :=edt1.Text;
val(x_s,d,code);
h:= F(d);
Str(h:3:6, h_s);
edt2.Text:=h_s;
end;
end.