Дефиниране на модел
QstatLab предоставя няколко различни начина за дефиниране на модели. Тук те ще бъдат демонстрирани върху примера "Запъната греда"
Дефиниране на задачата "Запъната греда"

Променливи:
Височина - HEIGHT [5 50]
Широчина - BREDTH [20 250]
Цел 1: Минимално лице на сечението:
AREA = HEIGHT * BREDTH;
Цел 2: Минимално напрежение при огъване:
SIGMA-B = 6.0*FORCE*LENGTH/(BRDTH*HEIGHT*HEIGHT);
Ограничения
%напрежение при огъване: SIGMA-B <= 200
SIGMAB = 6.0*FORCE*LENGTH/(BRDTH*HEIGHT*HEIGHT);
%напречно напрежение: TAU <= 100
TAU = 1.5*FORCE/(BRDTH*HEIGHT);
%огъване: DEFLN <=5
DEFLN = 4.0*FORCE*LENGTH^3/(EE*BRDTH*HEIGHT^3);
%широчина към дължина: H-ON-B <= 10
HONB = HEIGHT/BRDTH;
%Натоварване за достигане на нестабилност (счупване): F-CRIT >=5000
FCRIT = (4.0*sqrt(GG*(BRDTH^3*HEIGHT+HEIGHT^3 *BRDTH)*EE*(BRDTH^3*HEIGHT)/(144.0*(1.0-NU*NU)))/(LENGTH*LENGTH));
Константи
LENGTH = 1500; FORCE = 5000; FACTOR = 2; EE = 216620;
GG = 86650; NU = 0.27; SIGMAY = 200
Дефиниране на модела чрез таблични формули
Всяка от целите и ограниченията се записва в отделна колона и под клетката 'result' се записва табличната формула която се използва за изчисление. Задачата е дефинирана във файл beam\beam-spreadsheet.qsl.


Виж "Таблични модели" за повече информация.
Дефиниране на модела чрез скрипт
Моделът е записан във файл beam-script.qsl. В първата колона е дефиницията на главния модел, който е от тип 'скрипт' и съдържа името на файл съдържащ този скрипт. Останалите колони съдържат модели от тип 'intvar' (вътрешна променлива) които предоставят достъп до 6-те изчислени величини по време на изпълнението на скрипта записани във вътрешна променлива qs_RESULT. Всяка една от тези величини може да се използва като оптимизационна цел или ограничение, или и двете. Всички колони използват дефиницията зададена в колона А. Ако самата колона А се използва като модел за оптимизация, тя ще дава стойността на първия елемент в qs_RESULT - което я прави еквивалентна на колона B.

Използваният скрипт е записан в beam.qscript и представлява следното:
'script language = VBscript
function Main()
' задаваме
стойности на
физическите
константи
LENGTH = 1500
FORCE = 5000
FACTOR = 2
EE = 216620
GG = 86650
NU = 0.27
SIGMAY = 200
'
използваме
стойностите
от вътрешния
масив qs_VARS
BRDTH = qs_VARS(1)
HEIGHT = qs_VARS(2)
AREA = BRDTH*HEIGHT
SIGMAB = 6.0*FORCE*LENGTH/(BRDTH*HEIGHT*HEIGHT)
TAU = 1.5*FORCE/(BRDTH*HEIGHT)
DEFLN =
4*FORCE*LENGTH*LENGTH*LENGTH/(EE*BRDTH*HEIGHT*HEIGHT*HEIGHT)
FCRIT =
(4*qs_sqrt(GG*(BRDTH*BRDTH*BRDTH*HEIGHT+HEIGHT*HEIGHT*HEIGHT*BRDTH)*EE*(BRDTH*BRDTH*BRDTH*HEIGHT)/(144*(1-NU*NU)))/(LENGTH*LENGTH))
HONB = HEIGHT/BRDTH
' записваме
резултатите
във
вътрешния
масив qs_RESULT
qs_RESULT(1) = AREA
qs_RESULT(2) = SIGMAB
qs_RESULT(3) = DEFLN
qs_RESULT(4) = TAU
qs_RESULT(5) = FCRIT
qs_RESULT(6) = HONB
end function
Всички променливи започващи с qs_ са вътрешни променливи или функции дефинирани в QstatLab. Скриптът се изпълнява веднъж на всяка оптимизационна итерация. Преди изпълнението му, текущите стойности на променливите се записват в масива qs_VARS, като променливата qs_NVARS съдържа общия брой променливи. Тези стойности могат да се използват за изчисление на изходните величини, които се записват в масива qs_RESULT. След изпълнение на скрипта, QstatLab използва стойностите в този масив. Ако има повече от един изходен резултат, както е в примера със запъната греда, те трябва да се представят като отделни колони, както е показано по-горе.
За повече информация относно вътрешните променливи и функции, както и за съставянето на скриптовете, вижте тук.
Свързване на QstatLab с външен изпълним код.
Скриптовете предоставят удобна възможност за свързване на QstatLab с външен изпълним код. Това може да е комерсиален пакет или програма създадена и компилирана от потребителя. Тази възможност позволява да се извършва оптимизация, както и други операции които са част от Qstatlab, с модели създадени в други програми. Комуникацията между QstatLab и външната програма се осъществява чрез файлове и команди на операционната система, което позволява съвместимост с най-голям брой продукти.
Логиката е следната:
1. Зареждаме стойностите на променливите за които искаме да изчислим външния модел. Ако той ще се използва в оптимизационен цикъл, стойностите се намират в qs_VARS. Възможно е да се прочетат директно от таблицата чрез функцията qs_CELLSTR.
2. Създава се файл, в който се записват тези стойности.
3. Изпълнява се външната програма, така че тя да може да прочете стойностите от горе-създадения файл.
4. В края на изпълнението си, тя трябва да създаде друг файл, който съдържа резултатите от изчисленията.
5. Файлът съдържащ резултатите се зарежда и съответните числа се прехвърлят във вътрешния масив qs_RESULT или в таблицата чрез функцията qs_CELLSTR
Нека първо да разгледаме случаят когато скриптът изпълняващ външната програма не участва в оптимизационен цикъл.
Отваряме нова таблица в QstatLab и активираме скриптовия редактор (Редакция/Скриптов редактор)

Използваме бутончето 'Отвори' (в скриптовия редактор) зада заредим скрипт beam-exe.qscript

Зареденият скрипт се състои от 2 функции - Main и beamexe. Ще разгледаме първо функцията Main. Тя ще зареди стойностите на променливите директно от таблицата, ще извика функцията beamexe, която ще върне резултат, който ще се прехвърли обратно в таблицата.
Внимание! преди да изпълните скрипта, трябва да въведете стойности на променливите в първата колона, откъдето те ще се прочетат. Това ще бъде демонстрирано след обяснението на функцията beamexe.
function Main()
'
декларираме
масиви x и y
Dim x(3), y
'
зареждаме
стойностите
на
променливите
от първата
колона в
таблицата
x(1) =
CDbl(qs_CELLSTR(1,1))
x(2) = CDbl(qs_CELLSTR(2,1))
'
изчисляваме
резултата
y = beamexe(x)
'
записваме го
във втората
колона в таблицата.
for i=1 to UBound(y)-1
qs_CELLSTR(i,2) = CStr(y(i))
next
end function
Втората функция е beamexe, която изчислява резултат, чрез стартиране на външен изпълним код. В случая ще използваме програмата beam.exe която изчислявя 6те стойности (както в beam.qscript). Тя се стартира от командния промпт по със следния синтаксис:
c:\QstatLab\BG5\primei\beam>beam beaminp.txt beamout.txt
Тя има два входни аргумента, които представляват имената на входния и изходния файл.
function beamexe(x)
' Задаваме имената на файловете
exefilename = "beam.exe"
infilename = "beaminp.txt"
outfilename = "beamout.txt"
' създаваме обект objFSO от тип Scripting.FileSystemObject
' той ще служи за всички файлови операции свързани с операционната система.
Set objFSO = CreateObject("Scripting.FileSystemObject")
' изтриваме входните и изходните файлове, ако те съществуват
if objFSO.FileExists(outfilename) then objFSO.DeleteFile(outfilename)
if objFSO.FileExists(infilename) then objFSO.DeleteFile(infilename)
' Създаваме входен файл и записваме масива x в него.
Set infile = objFSO.CreateTextFile(infilename,TRUE)
infile.WriteLine(UBound(x)-1)
for i = 1 to UBound(x)-1
infile.WriteLine(x(i))
qs_print x(i)
next
infile.Close
' Изпълняваме външната програма и я изчакваме да свърши.
Set objApp = createObject("WScript.Shell")
objApp.Run exefilename & " " & infilename
& " " & outfilename, 2, TRUE
' Прочитаме създадения от нея изходен файл и го връщаме като резултат
Set outfile = objFSO.OpenTextFile(outfilename,1)
beamexe = Split(outfile.ReadAll,vbNewLine)
outfile.close
' Изтриваме създадените обекти
set
objApp = nothing
set objFSO = nothing
end function
Зада изпълним функцията, въведете 2 стойности в първата колона (различни от 0):

Натиснете бутончето 'Изпълни'

Резултатът ще се появи в колона 2, както е указано в скрипта.
В случай, че искаме да използваме това във оптимизационен цикъл, трябва да направим следната промяна във функцията Main, така че комуникацията да става чрез вътрешни променливи, вместо чрез таблицата.
function Main()
'
декларираме
масиви x и y
Dim x(3), y
'
зареждаме
стойностите
на
променливите
от вътрешния
масив qs_VARS
x(1) = qs_VARS(1)
x(2) = qs_VARS(2)
'
изчисляваме
резултата
y = beamexe(x)
'
записваме го
във
вътрешния
масив qs_RESULT.
for i=1 to UBound(y)-1
qs_RESULT(i) = y(i)
next
end function
Моделът се дефинира в таблицата по начин подобен на този чрез скрипт. Във файл beam-exe.qsl той е дефиниран в колона C.

Виж също:
Упражнения по оптимизация, моделиране и робастно проектиране