close

Вход

Забыли?

вход по аккаунту

?

код

код для вставкиСкачать
Определить размеры цилиндрической емкости(R-радиус основания 3<=R<=10,H-высота,10<=H<=30)заданного объема V(990<=V<=1010), которая имела бы минимальную площадь поверхности S.
Задачу следует решать методом Монте-Карло. Построить чертеж цистерны. Задание на КР:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Spin, StdCtrls, ExtCtrls;
type
TSimple = class
private
minR,maxR,minH,maxH,minV,maxV:real;
public
V,h,r,S : real;
optH,optR,optS:real;
n:integer;//Êîëè÷åñòâî òî÷åê
constructor Create(V:real;n:integer);
function getH(V,r:real):real;
function getS(r,h:real):real;
function getR:real;
procedure doMonteCarlo;
end;
Tsecond=class(Tsimple)
private
public
procedure Cylinder(im:Timage);
end;
type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
Label1: TLabel;
seV: TSpinEdit;
Label2: TLabel;
seN: TSpinEdit;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
end;
var
Form1: TForm1;
second:Tsecond;
implementation
{$R *.dfm}
procedure Tsecond.Cylinder(im:Timage);
var cx,cy:integer;
begin
//Öåíòð ðèñóíêà
cx:=im.Width div 2;
cy:=im.height div 2;
im.Canvas.CleanupInstance;
im.Canvas.MoveTo(cx-round(10*optr/2),cy+round(10*opth/2));
im.Canvas.LineTo(cx-round(10*optr/2),cy-round(10*opth/2));
im.Canvas.MoveTo(cx+round(10*optr/2),cy+round(10*opth/2));
im.Canvas.LineTo(cx+round(10*optr/2),cy-round(10*opth/2));
im.Canvas.Ellipse(cx-round(10*optr/2),cy+round(10*opth/2)-round(5*optr/2),cx+round(10*optr/2),cy+round(10*opth/2)+round(5*optr/2));
im.Canvas.Ellipse(cx-round(10*optr/2),cy-round(10*opth/2)-round(5*optr/2),cx+round(10*optr/2),cy-round(10*opth/2)+round(5*optr/2));
end;
// Ñîçäàíèå îáúåêòà
constructor TSimple.Create(V:real;n:integer);
begin
randomize;
minR:=3;
maxR:=10;
minH:=10;
maxH:=30;
minV:=990;
maxV:=1010;
// Ñîõðàíåíèå äàííûõ
self.V := V;
self.n := n;
end;
function TSimple.getH(V,r:real):real; //Íàéòè âûñîòó
begin
getH:=V/(PI*r*r);
end;
function TSimple.getS(r,h:real):real;//Íàéòè ïëîùàäü ïîâåðõíîñòè
begin
getS:=2*Pi*r*h+2*pi*r*r;
end;
function TSimple.getR:real;
begin
getR:=minR+(maxR-minR)*random;
end;
procedure TSimple.doMonteCarlo;
var i:integer;
begin
optR:=getR;
optH:=getH(V,optR);
optS:=getS(optR,optH);
for i:=1 to n do
begin
r:=getR;
h:=getH(V,r);
S:=getS(r,h);
if S<optS then begin
optS:=S;
optR:=r;
optH:=h;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
second := Tsecond.Create(seV.value,seN.value);
second.doMonteCarlo;
second.Cylinder(image1);
memo1.Lines.Clear;
memo1.Lines.Add('Äëÿ çàäàííîãî îáúåìà V='+floattostrF(second.V,ffFixed,5,0));
memo1.Lines.Add('Ìèíèìàëüíîå çíà÷åíèå ïëîùàäè ïîâåðõíîñòè S='+floattostrF(second.optS,ffFixed,7,3));
memo1.Lines.Add('Ðàäèóñ îñíîâàíèÿ öèëèíäðà R='+floattostrF(second.optR,ffFixed,7,3));
memo1.Lines.Add('Âûñîòà öèëèíäðà H='+floattostrF(second.optH,ffFixed,7,3));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;
end.
Одномерный метод Монте-Карло
Схема одномерного метода Монте-Карло:
1. Генерируем с помощью какого-либо программного генератора случайных чисел, равномерно распределенных в интервале [,], случайное число .
2. Производим испытание в точке - вычисляем значения функции () в этой точке.
3. Полагаем 2.
4. Аналогично п. 1) генерируем случайное число [,] .
5. Производим испытание в точке - вычисляем значение () функции () в этой точке.
6. Если , то выполняем присваивания , .
7. Если , то выполняем присваивание 1 и переходим на п. 4). Иначе - заканчиваем вычисления. Здесь - количество испытаний.
8. Принимаем в качестве приближенного значения точки глобального минимума функции () на интервале [,] или каким-либо из рассмотренных одномерных методов локальной оптимизации организуем в окрестности точки поиск локального минимума этой функции
При достаточно большом метода гарантирует нахождение глобального минимума с высокой вероятностью.
Документ
Категория
Рефераты
Просмотров
18
Размер файла
56 Кб
Теги
код
1/--страниц
Пожаловаться на содержимое документа