Дефиниране на модел

 

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.

 

Виж също:

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