Здравствуйте, novij2011.
Здравствуйте, novij2011!
Код в приложении вычисляет определенный интеграл методом монте-карло.
Интегрируемая функция введена в коде программы.
Если Вам необходимо именно ввести её посредством формы, то необходимо добавить код вычисляющий функцию по её текстовой записи или использовать набор шаблонов функций и вводить коэффициенты для этих шаблонов.
Полный архив проэкта (Delphi 2009)Приложение:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
edFrom: TEdit;
Label2: TLabel;
edTo: TEdit;
Run: TButton;
Label3: TLabel;
edResult: TEdit;
procedure RunClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// Функция получения случайного числа с плавающей запятой в заданном диапазоне
function RandomRange(min, max: Double): Double;
begin
Result := Random(MaxInt) / MaxInt * (max - min) + min;
end;
// Интегрируемая функция (без части венесенной за интеграл)
function Func(X: Double): Double;
begin
Result := 2 * (3 * X * X - 4 * X - 1);
end;
// Функция интегрирования методом Монте-Карло
function MonteCarloIntegral(aFrom, aTo: Double): Double;
const
MAX_Y = 100.0; // Должно быть равно или немного больше максимума функции на интегрируемом диапазоне
MAX_COUNT = 100000; // Чем больше, тем точнее и дольше выполняется интегрирование
var
I, K: Integer;
S, X, Y: Double;
begin
S := (aTo - aFrom) * MAX_Y; // Площадь ограничивающего прямоугольника
K := 0; // Количество точек ниже интегрируемой функции
for I := 0 to MAX_COUNT do
begin
// Получение MAX_COUNT случайных точек в заданных пределах
X := RandomRange(aFrom, aTo);
Y := RandomRange(0, MAX_Y);
// Подсчет количества точек, лежащих ниже интегрируемой функции
if Y < Func(X) then Inc(K);
end;
Result := S * (K / MAX_COUNT);
end;
procedure TForm1.RunClick(Sender: TObject);
var
ValFrom, ValTo: Double;
begin
// Проверка исходных данных
try
{$FINITEFLOAT OFF}
ValFrom := StrToFloat(edFrom.Text);
{$FINITEFLOAT ON}
except
ShowMessage('В поле "Интегрировать с" должнобыть число!');
Exit;
end;
try
{$FINITEFLOAT OFF}
ValTo := StrToFloat(edTo.Text);
{$FINITEFLOAT ON}
except
ShowMessage('В поле "по" должнобыть число!');
Exit;
end;
if ValFrom >= ValTo then
begin
ShowMessage('Значение в поле "по" должно быть больше значения в поле "Интегрировать с" !');
Exit;
end;
// Вычисление интеграла
edResult.Text := FloatToStr(MonteCarloIntegral(ValFrom, ValTo) * 3);
end;
end.