![]() |
|
#1
|
|||
|
|||
![]() Здравствуйте! Прошу помощи. Очень нужна дельная подсказка в корректировке кода. Пишу программу в Delhi по нахождению определенного интеграла методом Монте-Карло.
Решение математическим методом – это число 8. Решение же с помощью программы дает либо неправильный результат, либо ошибку. У меня есть определенная догадка – скорей всего неправильно использован цикл повтора нахождения всех последующих 9999 точек - связка repeat…until. Подскажите, пожалуйста, как правильно его в моем коде использовать? Или может быть здесь должен использоваться другой оператор (while…do) ? Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Label2: TLabel; Edit2: TEdit; Label3: TLabel; Edit3: TEdit; Button1: TButton; Label4: TLabel; Label5: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; const x1=2; // Интервал X2=3; // интегрирования var Form1: TForm1; k: integer; // Количество точек введенных пользователем y1,y2: real; n,m: integer; r1,r2: real; //случайные числа от 0 до 1 fx: real; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var r1: real; r2: real; x,y,Integral: real; i:integer; j: integer; begin y1:=0; y2:= strtoint(Edit1.Text); //Это значение равно 15 //i:=1; n:=0; m:=0; k:=strtoint(Edit2.text); //количество точек введенное пользователем repeat //=============== Запускаем цикл нахождения точки ===================== Randomize; //Запускаем генератор случ. чисел for i := 1 to k do begin r1:= Random; //Генерируем случ. числа от 0 до 1 r2:= Random; //ShowMessage ('r1= '+FloatToStr(r1)+ #13 + ' r2= ' + FloatToStr(r2)); end; x := x1 + (r1*(x2-x1)); y := r2 * y2; fx :=((3*x*x) - (4*x) - 1); if y <= fx then n:= n+1 else if y > fx then m:= m+1; //========================================================================= until i<=k; Integral:= ((x2-x1)*(y2-y1)*(n/(n+m))); Edit3.Text:=floattostr(Integral); end; end. |