|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
интегрирование методом монте-карло
Здравствуйте! Прошу помощи. Очень нужна дельная подсказка в корректировке кода. Пишу программу в Delhi по нахождению определенного интеграла методом Монте-Карло. Вот код.
Код:
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. Последний раз редактировалось Admin, 04.06.2014 в 19:26. |
#2
|
|||
|
|||
для начала Randomize вынести из цикла
|
#3
|
|||
|
|||
Вынес не чего не изменилось
|
#4
|
|||
|
|||
А нафига двойной цикл?
1)уберите repeat из 55 строки 2)уберите end из 63 строки 3)и напишите его вместо until в 71 строке |
Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
Zig852 (05.06.2014)
|
#5
|
|||
|
|||
Все ровно у меня не считает интеграл(
|
#6
|
|||
|
|||
кому не сложно, если сможете поправить код в исходнике, скиньте его сюда) Очень прошу, не чего путного не выходит.
|
#7
|
|||
|
|||
Ну, в принципе, почти правильно.
Только очень уж как-то сложно получается местами. Код:
function f(x : double) : double; begin // Это твоя подинтегральная функция end; function Integral(x1, x2 : double; k : integer) : double; var x, y, ym : double; n : Integer; begin n := 0; // Кол-во точек, попавших в площадь Result := 0; ym := max(f(x1),f(x2)); For I := 1 To k Do // Кол-во проб Begin x := x1 + Random*(x2-x1); y := Random*ym; If y < f(x) Then inc(n); End; Result := (x2-x1)*ym*n/k; // результат - площадь прямоугольника * коэф "попадания" end; // использование procedure TForm1.Button1Click(Sender : TObject); begin // Edit1 - нижняя граница интеграла // Edit2 - верхняя граница интеграла // Edit3 - кол-во проб ShowMessage('Интеграл = ' + FloatToStr(Integral(strtofloat(Edit1.Text),strtofloat(Edit2.Text),strtoint(Edit3.Text)))); // Надеюсь, со скобками не ошибся... end; Последний раз редактировалось lmikle, 07.06.2014 в 09:15. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Zig852 (06.06.2014)
|
#8
|
|||
|
|||
Я вставил ваш код, под моей интегральной функцией, запускаю и начались ошибки в коде, сначала в 6 строке(менял скобки убирал пробелы) потом в 14 и в низ. И все ровно у меня в итоге ошибки при счете интеграла, или виснет программа(
Последний раз редактировалось Zig852, 06.06.2014 в 12:41. |
#9
|
||||
|
||||
Цитата:
Цитата:
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Zig852 (08.06.2014)
|
#10
|
|||
|
|||
Не может оно виснуть, так как негде.
Может ты кол-во точек большое задал, так что просто считает долго... Ошибки - в студию. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Zig852 (08.06.2014)
|
#11
|
|||
|
|||
Все работает) Спасибо огромное, теперь буду думать, как бы умными словами рассказать об этой программе в курсовой работе(
|