|
П1.2 Используемые аппроксимации Примечание. Координата ХÎ[0,1] отсчитывается от дна пластины для всех аппроксимаций. Сплайн(SPL), кусочно-линейная(PWL), кусочно-постоянная(PWC) аппроксимации. В процессе расчетов ищутся значения электропроводности в узлах аппроксимации, причем количество узлов увеличивается от едениицы до nPoints в целях сохранения устойчивости решения. Начальные значения (узловые значения ²истинной² ЭП для эмуляции измерений U*вн) задаются в столбце ²si² файла исходных данных, начальные значения ограничений на узловые значения ЭП в столбцах ²siMin² и ²siMax²(движение по столбцу сверху вниз соответствует изменению координаты от дна пластины до обрабатываемой повехности). Экспоненциальная аппроксимация(EXP) В случае задания экспоненциальной аппроксимации зависимость электропрводности от толщины представляется в виде SIGMA = ( siE-siI )*EXP( -alfa*(1-x) ) + siI Варьруемыми параметрами являются эектропроводность на верхней поверхности siЕ, электропроводность "на бесконечности" siI и параметр alfa. В файле исходных данных в таблице из nPoints строк с подзаголовком "si siMin siMax", информация об ограничениях на параметры siE, siI задается в первой и nPoints-строке. Величина и ограничения для параметра alfa задаются первой строкой в "special approximation parameters". Аппроксимация гиперболическим тангенсом (HTG) В случае задания аппроксимации гиперболическим тангенсом зависимость электропрводности от толщины представляется в виде SIGMA = si2 + ( si1-si2 )/2*{ 1 + th( ( beta-x )/gamma ) } Величина и ограничения для параметров si2,beta,gamma задаются начиная со второй строки в "special approximation parameters", для si1 аналогично siI. П1.3 Результаты расчета Результаты расчета помещаются в текстовый файл( кодировка ASCII, расширение по умолчанию LST ), при этом результат каждой итерации отбражается строкой вида: 1 <Ф> 0.000353 Rg= 17.003 15.639 9.697 где первая цифра (в данном случае 1) соответствует номеру текущей внутренней итерации, затем после текста "<Ф>" идет значение текущей абсолютной среднеквадратичной невязки по всем гармоникам (в данном случае 0.000353), затем после текста "Rg= ", идут искомые текущие значения переменных минимизации. В случае SPL,PWL,PWC аппроксимаций это непосредственно узловые значения электропроводности для текущего количества узлов, а для EXP,HTG аппроксимаций это параметры { siE, siI, Alfa } или { si1, si2, Beta, Gamma}. B качестве последней строки помещаются nPoints вычисленных значений э/проводности в равномерно расположенных узлах пластины. П1.4 Основная программа ErIn (****************************************************************************) (* ErIn v1.42 *) (* Eddy current inverse problem solver. *) (* (C) 1999 by Nikita U.Dolgov *) (* Moscow Power Engineering Institute , Introscopy dept. *) {****************************************************************************} Program ErIn;{23.02.99} Uses DOS,CRT, EData, EMath, EDirect, EFile, EMinimum; Var m, mLast, i : byte; {loop counters} procedure about; {Let me to introduce myself} begin clrscr; GetTime( clk1.H, clk1.M, clk1.S, clk1.S100 ); {get start time} writeln('***********************************************************'); writeln('* ErIn v1.42 Basic * *'); writeln('***********************************************************'); end; procedure initParameters; var apDT : byte; {approximation type for direct task} begin apDT := nApprox SHR 4; {XXXXYYYY->0000XXXX} fHypTg:=(( apDT AND apHypTg ) = apHypTg); if fHypTg then begin si0[ 1 ]:=si[ 1 ]; {si1 - conductivity about bottom of slab} si0[ 2 ]:=par0[ 2 ]; {si2 - conductivity about top of slab} si0[ 3 ]:=par0[ 3 ]; {Beta - ratio of approx.} si0[ 4 ]:=par0[ 4 ]; {Gamma- ratio of approx.} mCur:=4; end else if(( apDT AND apExp ) = 0 ) then {It's not an EXP approx.} begin for i:=1 to nPoints do si0[ i ] :=si [ i ]; {SI data from file} mCur:=nPoints; end else begin si0[ 1 ]:=si[ 1 ]; {siI - conductivity about bottom of slab} si0[ 2 ]:=si[ nPoints ]; {siE - conductivity about top of slab} si0[ 3 ]:=par0[ 1 ]; {Alfa- ratio of approx.} mCur:=3; end; setApproximationType( apDT ); {approx. type for direct problem} setApproximationData( si0, mCur ); {approx. data for direct problem} nApprox := ( nApprox AND $0F ); {XXXXYYYY->0000YYYY} fHypTg := (( nApprox AND apHypTg ) = apHypTg ); fMulti := (( nApprox AND apExp ) = 0 ) AND NOT fHypTg; {It's not an EXP approx.} if fMulti then begin for i:=1 to nPoints do begin Gr[ 1,i ]:=SiMax[ i ]; Gr[ 2,i ]:=SiMin[ i ]; Rg[ i ]:=( Gr[ 1,i ] + Gr[ 2,i ] )/2; {zero estimate of SI} Rgs[ i ]:=1E33; {biggest integer} end; mLast:=nPoints; {loop for every node of approx.} mCur :=1; {to begin from the only node of approx} end else if fHypTg then begin Gr[ 1,1 ]:= siMax[ 1 ]; Gr[ 2,1 ]:= siMin[ 1 ]; Rgs[ 1 ]:=1E33; Gr[ 1,2 ]:=parMax[ 2 ]; Gr[ 2,2 ]:=parMin[ 2 ]; Rgs[ 2 ]:=1E33; Gr[ 1,3 ]:=parMax[ 3 ]; Gr[ 2,3 ]:=parMin[ 3 ]; Rgs[ 3 ]:=1E33; Gr[ 1,4 ]:=parMax[ 4 ]; Gr[ 2,4 ]:=parMin[ 4 ]; Rgs[ 4 ]:=1E33; for i:=1 to 4 do Rg[ i ]:=( Gr[ 1,i ] + Gr[ 2,i ] )/2; mLast:=1; mCur:=4; end else begin Gr[ 1,1 ]:= siMax[1]; Gr[2,1]:= siMin[1]; Rgs[ 1 ]:=1E33; Gr[ 1,2 ]:= siMax[nPoints]; Gr[2,2]:= siMin[nPoints]; Rgs[ 2 ]:=1E33; Gr[ 1,3 ]:= parMax[1]; Gr[2,3]:= parMin[1]; Rgs[ 3 ]:=1E33; for i:=1 to 3 do Rg[ i ]:=( Gr[ 1,i ] + Gr[ 2,i ] )/2; mLast:=1; mCur :=3; end; initConst( nLayers, parMaxH, parMaxX , parEps, parEqlB );{set probe params} end; procedure directTask; {emulate voltage measurements [with error]} begin for i:=1 to nFreqs do begin getVoltage( freqs[i], Umr[ i ], Umi[ i ] ); {"measured" Uvn*} if ( epsU > 0 ) then {add measurement error} begin randomize; Umr[ i ]:=Umr[ i ]*( 1 + epsU*( random-0.5 ) ); randomize; Umi[ i ]:=Umi[ i ]*( 1 + epsU*( random-0.5 ) ); end; end; writeln('* Voltage measurements have been emulated'); setApproximationType( nApprox ); {approx. type for inverse problem} setApproximationData( Rg, mCur ); {approx. data for inverse problem} end; procedure reduceSILimits; {evaluate SI for m+1 points of approx. using aG} var x0, x1, xL, dx, Gr1, Gr2 : real; j, k : byte; begin {----------------------------- get SI min/max for m+1 points of approximation} dx:=1/( nPoints-1 ); for i:=1 to m+1 do begin k:=1; x1:=0; x0:=( i-1 )/m; for j:=1 to nPoints-1 do begin xL:=( j-1 )/( nPoints-1 ); if( ( xL < x0 ) AND ( x0 <= xL+dx ) )then begin k:=j; x1:=xL; end; end; Gr[ 1,i ]:=siMax[ k ] + ( siMax[ k+1 ]-siMax[ k ] )*( x0-x1 )/dx; Gr[ 2,i ]:=siMin[ k ] + ( siMin[ k+1 ]-siMin[ k ] )*( x0-x1 )/dx; end; {------------------------------------- get SI for m+1 points of approximation} for i:=1 to m+1 do begin Rg[i]:=getSiFunction( (i-1)/m ); if ( Rg[i] > Gr[1,i] )then Rg[i]:=Gr[1,i]; if ( Rg[i] < Gr[2,i] )then Rg[i]:=Gr[2,i]; if m > 1 then {There're more than 1 point of approx.} begin Gr1:= Rg[i]+( Gr[1,i]-Rg[i] )*aG; {reduce upper bound} Gr2:= Rg[i]-( Rg[i]-Gr[2,i] )*aG; {reduce lower bound} if ( Gr1 < Gr[1,i] )then Gr[1,i]:=Gr1; {test overflow} if ( Gr2 > Gr[2,i] )then Gr[2,i]:=Gr2; end; end; setApproximationData( Rg , m+1 ); end; procedure resultMessage; {to announce new results} begin if fMulti then begin writeln(' current nodal values of conductivity'); write(' si : ');for i:=1 to m do write(Rg[i] :6:3,' ');writeln; write(' max: ');for i:=1 to m do write(Gr[1,i]:6:3,' ');writeln; write(' min: ');for i:=1 to m do write(Gr[2,i]:6:3,' ');writeln; end else begin for i:=1 to nPoints do si[i]:=getSiFunction( ( i-1 )/( nPoints-1 ) ); if fHypTg then saveHypTgResults else saveExpResults; end; end; procedure clockMessage; {user-friendly message} begin writeln('***********************************************************'); write( '* approximation points number :',m:3,' * Time '); clock; writeln('***********************************************************'); end; procedure done; {final message} begin Sound(222); Delay(111); Sound(444); Delay(111); NoSound; {beep} write('* Task processing time '); clock; saveTime; writeln('* Status: Inverse problem has been successfully evaluated.'); end; Begin about; loadData; initParameters; directTask; for m:=1 to mLast do begin if fMulti then begin mCur:=m; clockMessage; end; doMinimization; {main part of work} setApproximationData( Rg, mCur ); {set new approx. data} |
Новости |
Мои настройки |
|
© 2009 Все права защищены.