Меню
Поиск



рефераты скачать Решение обратной задачи вихретокового контроля

50." Impedance of coils over layered metals with continuously variable conductivity and permeability: Theory and experiment " , Rose JH, ²Journal of Applied Phisics², 1993, vol74, ?3, p2076

51." Eddy-current interaction with ideal crack " , Bowler JR, ²Journal of Applied Phisics², 1994, vol75, ?12, p8128,8138

52." Method of solution of forward problems in eddy-current testing " , Kolyshkin AA, ²Journal of Applied Phisics², 1995, vol77, ?10, p4903-4912


Приложение 1. Программная реализация

Программная реализация изложенного метода решения обратной задачи ВТК осуществлена при помощи  компилятора Borland Pascal 7.0 и состоит из шести модулей:

1.     ErIn12.pas - исполняемый файл, осуществляет основной цикл программы

2.     EData.pas - содержит глобальные данные и осуществляет чтение файла исходных данных

3.     EFile.pas - содержит вспомогательные функции и иосуществляет сохранение результатов расчетов

4.     EMath.pas - осуществляет поддержку операций с комплексными числами

5.     EDirect.pas - осуществляет решение прямой задачи ВТК

6.     EMinimum.pas - осуществляет решение обратной задачи ВТК

П1.1 Исходные данные

Исходные данные программы хранятся в текстовом файле( кодировка ASCII, расширение по умолчанию TXT ).

HThick

- толщина пластины,[мм]

nPoints

- количество узлов аппроксимации электропроводности для PWL,PWC,SPL аппроксимаций. В случае EXP,HTG аппроксимации вычисление значений ЭП в них производится по окончании расчетов

nLayers

- количество  интервалов с кусочно-постоянной электропроводностью, на которые разбивается пластина для непосредственного расчета вносимой ЭДС по реккурентным формулам для многослойной пластины

nFreqs

- количество частот возбуждения гармоник вносимой относительной ЭДС

nStab

- число стабилизируемых значащих цифр

epsU

- погрешность измерения

aG

- коэффициент сжатия ограничений (aG<=1); НЕ используется при EXP,HTG аппроксимации

nApprox

- типы аппроксимации прямой и обратной задач

si

- значения проводимости в узлах аппроксимации

siMin, siMax

- ограничения на возможные значения проводимости в узлах аппроксимации в процессе решения ОЗ

incVal

- величина dx для численного дифференцирования

maxSteps

- максимальное число отрезков интегрирования

maxX

- верхний предел интегрирования при расчете Uvn*

Eps

- погрешность интегрирования при расчете Uvn*

dType

- тип разностной производной (=1 правая или =2 центральная)

eqlB

- толщины слоев пластины одинаковы( b=hThick/nLayers) если eqlB>0, в противном случае используются координаты слоев из файла

П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}

Страницы: 1, 2, 3, 4, 5




Новости
Мои настройки


   рефераты скачать  Наверх  рефераты скачать  

© 2009 Все права защищены.