Определить размеры цилиндрической емкости(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. Принимаем в качестве приближенного значения точки глобального минимума функции () на интервале [,] или каким-либо из рассмотренных одномерных методов локальной оптимизации организуем в окрестности точки поиск локального минимума этой функции При достаточно большом метода гарантирует нахождение глобального минимума с высокой вероятностью.
1/--страниц