Gistrec icon

delphi интеграл монте-карло

Gistrec | PRO | 05/24/17 10:19:57 AM UTC | 0 ⭐ | 10259 👁️ | Never ⏰ | []
Delphi |

3.61 KB

|

None

|

0 👍

/

0 👎

unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, rxParsing, Rxtconst;
 
type
  TForm1 = class(TForm)
    Edit: TEdit;
    Button: TButton;
    NameGraph: TLabel;
    Graph: TImage;
    xFrom: TEdit;
    xTo: TEdit;
    LabelFrom: TLabel;
    LabelTo: TLabel;
    IntegrateLabel: TLabel;
    procedure OnClick(Sender: TObject);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
function integrate(formula: String; xFrom: Integer; xTo: Integer; count: Integer): Extended;
var
  i: Integer;
  Res: Extended; // Результат
  x: Integer;
  newFormula: String;
begin
  Res := 0;
  Randomize();
  // Собственно вычисляем интеграл Монте Карло
  for i := 1 to count do begin
    //x := Random(2 * (xTo - xFrom)) - (xFrom - xTo);
    x := Random(xTo - xFrom + 1) + xFrom;
    newFormula := stringreplace(formula, 'x', IntToStr(x), [rfReplaceAll, rfIgnoreCase]);
    Res := Res + rxParsing.GetFormulaValue(newFormula);
  end;
  Res := Res  / count;
  // Возвращяем результат
  Exit(Res);
end;
 
function drowLines(Graph : TImage): Integer;
begin
  // Ось Y
  Graph.Canvas.Pen.Color := RGB(255, 255, 255);
  Graph.Canvas.LineTo(Round(Graph.Width / 2), 0);
  Graph.Canvas.Pen.Color := RGB(255, 60, 255);
  Graph.Canvas.LineTo(Round(Graph.Width / 2), Graph.Height);
  // Ось X
  Graph.Canvas.Pen.Color := RGB(255, 255, 255);
  Graph.Canvas.LineTo(0, Round(Graph.Height / 2));
  Graph.Canvas.Pen.Color := RGB(255, 60, 255);
  Graph.Canvas.LineTo(Graph.Width + 100, Round(Graph.Height / 2));
  Exit(0);
end;
 
procedure TForm1.OnClick(Sender: TObject);
var
  x: Integer;
  formula: String;
  newFormula: String;
  y: Extended;
  integral: Extended;
begin
  // Стираем наше поле
  Graph.Canvas.FillRect(Graph.Canvas.ClipRect); 
  // Чертим линии oX oY
  drowLines(Graph);
  
  // Основная формула, в которой есть 'x'
  // Позже мы будем заменять 'x' на 'x + значение функции'
  formula := Edit.Text;
 
  // Установка ширины рисования
  Graph.Canvas.Pen.Width := 3;
 
  // Устанавливаем точку, от кторой будем чертить в начало нашей функции
  // Нужно, чтобы не было линии из 0:0 к началу черчения
  Graph.Canvas.Pen.Color := RGB(255, 255, 255);
  Graph.Canvas.LineTo(999, 999);
  x := Round(Graph.Width / 2) + StrToInt(xFrom.Text);
  newFormula := stringreplace(formula, 'x', IntToStr(x - Round(Graph.Width / 2)), [rfReplaceAll, rfIgnoreCase]);
  y := Round(Graph.Height / 2) - rxParsing.GetFormulaValue(newFormula);
  Graph.Canvas.LineTo(x, Round(y)); 
   
  Graph.Canvas.Pen.Color := RGB(60, 255, 60);
 
  // Чертим наш график :)
  for x := Round(Graph.Width / 2) + StrToInt(xFrom.Text) to Round(Graph.Width / 2) + StrToInt(xTo.Text) do
  begin
    newFormula := stringreplace(formula, 'x', IntToStr(x - Round(Graph.Width / 2)), [rfReplaceAll, rfIgnoreCase]);
    y := Round(Graph.Height / 2) - rxParsing.GetFormulaValue(newFormula);
    Graph.Canvas.LineTo(x, Round(y));
  end;
 
  // Вызываем функцию для интегрирования :)
  Integral := integrate(formula, StrToInt(xFrom.Text), StrToInt(xTo.Text), 10000);
  // Изменяем текст
  IntegrateLabel.Caption := 'Интеграл: ' + FloatToStr(Integral);
end;
 
end.

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎