![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Все работает) Спасибо огромное, теперь буду думать, как бы умными словами рассказать об этой программе в курсовой работе(
|