Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.06.2014, 19:08
Zig852 Zig852 вне форума
Прохожий
 
Регистрация: 29.05.2014
Сообщения: 6
Версия Delphi: delphi 7
Репутация: 10
По умолчанию интегрирование методом монте-карло

Здравствуйте! Прошу помощи. Очень нужна дельная подсказка в корректировке кода. Пишу программу в 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.
Админ: Пользуемся тегами для оформления кода!
Изображения
Тип файла: jpg Интеграл.jpg (3.1 Кбайт, 20 просмотров)
Вложения
Тип файла: rar моя программа.rar (222.9 Кбайт, 18 просмотров)

Последний раз редактировалось Admin, 04.06.2014 в 19:26.
Ответить с цитированием
  #2  
Старый 05.06.2014, 11:12
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

для начала Randomize вынести из цикла
Ответить с цитированием
  #3  
Старый 05.06.2014, 13:08
Zig852 Zig852 вне форума
Прохожий
 
Регистрация: 29.05.2014
Сообщения: 6
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Вынес не чего не изменилось
Ответить с цитированием
  #4  
Старый 05.06.2014, 15:17
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

А нафига двойной цикл?
1)уберите repeat из 55 строки
2)уберите end из 63 строки
3)и напишите его вместо until в 71 строке
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
Zig852 (05.06.2014)
  #5  
Старый 05.06.2014, 23:08
Zig852 Zig852 вне форума
Прохожий
 
Регистрация: 29.05.2014
Сообщения: 6
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Все ровно у меня не считает интеграл(
Ответить с цитированием
  #6  
Старый 05.06.2014, 23:10
Zig852 Zig852 вне форума
Прохожий
 
Регистрация: 29.05.2014
Сообщения: 6
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

кому не сложно, если сможете поправить код в исходнике, скиньте его сюда) Очень прошу, не чего путного не выходит.
Ответить с цитированием
  #7  
Старый 06.06.2014, 06:54
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,068
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, в принципе, почти правильно.
Только очень уж как-то сложно получается местами.

Код:
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  
Старый 06.06.2014, 12:37
Zig852 Zig852 вне форума
Прохожий
 
Регистрация: 29.05.2014
Сообщения: 6
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Я вставил ваш код, под моей интегральной функцией, запускаю и начались ошибки в коде, сначала в 6 строке(менял скобки убирал пробелы) потом в 14 и в низ. И все ровно у меня в итоге ошибки при счете интеграла, или виснет программа(

Последний раз редактировалось Zig852, 06.06.2014 в 12:41.
Ответить с цитированием
  #9  
Старый 06.06.2014, 14:03
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Zig852
Я вставил ваш код, под моей интегральной функцией, запускаю и начались ошибки в коде, сначала в 6 строке(менял скобки убирал пробелы) потом в 14 и в низ.
Словосочетание "ошибки в коде" ни о чём не говорит - нужно писать какие именно ошибки выдаёт.
Цитата:
Сообщение от Zig852
И все ровно у меня в итоге ошибки при счете интеграла, или виснет программа(
Скорее всего неправильно исправил "ошибки"
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Zig852 (08.06.2014)
  #10  
Старый 07.06.2014, 09:15
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,068
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не может оно виснуть, так как негде.
Может ты кол-во точек большое задал, так что просто считает долго...

Ошибки - в студию.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Zig852 (08.06.2014)
  #11  
Старый 07.06.2014, 21:55
Zig852 Zig852 вне форума
Прохожий
 
Регистрация: 29.05.2014
Сообщения: 6
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Все работает) Спасибо огромное, теперь буду думать, как бы умными словами рассказать об этой программе в курсовой работе(
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:15.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter