Консультация № 179915
12.09.2010, 15:13
41.22 руб.
0 6 1
Здравствуйте помогите написать программу на godegear delphi 2009.
Нужно решить определенный интеграл методом монте-карло.
Использовать форму делфи и текстовые поля (edit) для ввода интеграла и вывода результата.
3[$8747$]2(3x2-4x-1)dx

Обсуждение

Неизвестный
12.09.2010, 18:22
общий
14.09.2010, 21:40
это ответ
Здравствуйте, 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.
1
интеграл решен неправильно. Прошу перерешать. Правильный ответ 7,98
Неизвестный
13.09.2010, 06:45
общий
Здравствуйте. А что такое поля "интегрировать с:" и "интегрировать по"?
И еще в mathcad у меня получился результат 8, а не 48.
Неизвестный
13.09.2010, 20:28
общий
Здравствуйте, novij2011!

Поясните пожалуйста как Вы получили результат 7,98.
Воспользовавшись онлайн калькулятором на диапазоне от 0,0 до 10,0 определенный интеграл приведенной вами функции равен: 4673,25.
В коде приведенном в приложении було не удачно выбрана константа MAX_Y = 100.0;
При MAX_Y = 1000.0 программа выдает значения в пределах 4600...4800.
Точное вычисление при использовании данного алгоритма достичь невозможно.
Можно лишь добиться получения значение с заданной погрешностью манипулируя значениями констант MAX_Y и MAX_COUNT.

Неизвестный
14.09.2010, 08:25
общий
В диапазоне от 0 до 10 действительно получается большое число,
но у меня диапазон от 2 до 3.
Ответ
Результат вычисления определенного интеграла от функции 3x^2-4x-1 с пределами a=2 и b=3:
= 7.984375 (или 8).
Воспользовался вами приведенным калькулятором.
Неизвестный
14.09.2010, 17:47
общий
спасибо. Немножко изменил значение константы MAX_Y. Ответ почти сошелся.
Незнаю как вам изменить сейчас оценку ответа (ставлю 5)
давно
Мастер-Эксперт
680
2811
14.09.2010, 21:41
общий
novij2011:
Т.к. оценки редактированию не подлежат, эксперту скорректирован рейтинг и оставлена пометка для экзаменаторов.
Форма ответа