Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра електронних
обчислювальних машин
Звіт
про виконання лабораторної роботи № 4
з курсу „ Моделювання ”
Тема:
Обробка результатів вимірювань
за допомогою методів регуляризації.
Львів – 2005
Мета роботи:
Відновити форму вхідного сигналу за його виміряними дискретними значеннями, отриманими на виході лінійної системи.
Завдання до роботи:
Знайти часову залежність для вхідного сигналу , якщо відомо, що графік сигналу із виходу аналого-цифрового перетворювача має наступний вигляд:
Файл експериментальних даних знаходиться в таблиці. Кожен рядок файлу вимірювань складається із 2 числових значень – значення часу і відповідне йому значення напруги, виміряне за допомогою аналого-цифрового перетворювача. Як видно із графіка, сигнал дещо спотворений шумами вхідного підсилювача і перетворювача.
В якості регуляризуючого функціоналу можна взяти наступні функції:
а) б)
За комплексний частотний коефіцієнт передачі підсилювача взяти наступне співвідношення:
Дана характеристика відповідає підсилювачу, який має лише один полюс частотної характеристики. Реальні підсилювачі, як правило, описуються значно складнішими співвідношеннями.
При виконанні роботи необхідно визначити оптимальні значення параметрів регуляризації , враховуючи, що в вхідний сигнал підсилювача складається із суми прямокутних імпульсів.
При застосуванні регуляризуючої функції типу 2б необхідно обчислити числові значення інтегралу нев’язки за наступними співвідношенням:
Для обчислення інтегралу можна скористатись формулами прямокутників або трапецій.
Як приклад, наведемо залежність значень вхідного сигналу від часу без використання методів регуляризації (шляхом прямого застосування формули (4)) та відповідну залежність, знайдену із використанням регуляризуючого множника.
Текст програмної реалізації
unit Main;
interface
uses
Math,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, TeEngine, Series, ExtCtrls, TeeProcs, Chart;
type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
Image1: TImage;
BitBtn2: TBitBtn;
Memo1: TMemo;
Button1: TButton;
Edit1: TEdit;
Image2: TImage;
Label1: TLabel;
Label2: TLabel;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const Np=76;
type ArrMatr=array[1..Np,1..Np] of Extended;
var
Form1: TForm1;
VAH:array[1..2,1..Np] of Double=(
{Ud,V}(1.0E-03,0.10101,0.20202,0.30303,0.40404,0.50505,0.60606,0.70707,0.80808,0.90909,1.0101,1.11111,1.21212,1.31313,1.41414,1.51515,1.61616,1.71717,1.81818,1.91919,2.0202,2.12121,2.22222,2.32323,2.42424,2.52525,2.62626,2.72727,2.82828,2.92929,3.0303,3.13131,3.23232,3.33333,3.43434,3.53535,3.63636,3.73737,3.83838,3.93939,4.0404,4.14141,4.24242,4.34343,4.44445,4.54545,4.64647,4.74747,4.84849,4.94949,5.05051,5.15151,5.25253,5.35353,5.45455,5.55556,5.65657,5.75758,5.85859,5.95960,6.06061,6.16162,6.26263,6.36364,6.46465,6.56566,6.66667,6.76768,6.86869,6.96970,7.07071,7.17172,7.27273,7.37374,7.47475,7.57576),
{Id,A}(7.45457E-6,2.43832E-4,4.68852E-4,6.84301E-4,8.77114E-4,0.00108,0.00126,0.00144,0.0016,0.00176,0.0019,0.00204,0.00217,0.00228,0.00239,0.00249,0.00259,0.00267,0.00274,0.0028,0.00284,0.00289,0.00292,0.00295,0.00297,0.00298,0.00298,0.00297,0.00295,0.00292,0.00289,0.00284,0.00279,0.00273,0.00267,0.0026,0.00251,0.00243,0.00235,0.00225,0.00216,0.00207,0.00197,0.00187,0.00178,0.00167,0.00158,0.00149,0.00139,0.0013,0.00121,0.00112,0.00103,9.40321E-4,8.66034E-4,7.89536E-4,7.16527E-4,6.44088E-4,5.70496E-4,5.04513E-4,4.40479E-4,3.77542E-4,3.20819E-4,2.66671E-4,2.18542E-4,1.74533E-4,1.33869E-4,1.00213E-4,7.03066E-5,4.73798E-5,2.93464E-5,1.61997E-5,7.90947E-6,2.0467E-6,1.00E-09,1.00E-10));
(*VAH:array[1..2,1..Np] of Double=((1,2,3,4,5,6,7)
,(0.00087,0.00100,0.002,0.00290,0.00230,0.001,0.00050));*)
B:ArrMatr;
Y:array[1..Np] of Extended;
A:array[1..Np] of Extended;
L:ArrMatr;
Z:array[1..Np] of Extended;
Ub:Double;
implementation
procedure LUDecomposition(var A : ArrMatr;
N : Integer;
var L : ArrMatr);forward;
{procedure LUDecomposition(var A : ArrMatr;
N : Integer;
var L : ArrMatr);
var
i : Integer;
j : Integer;
k : Integer;
begin
i:=1;
while i<=n-1 do
begin
j:=i+1;
while j<=n do
begin
A[j,i] := A[j,i]/A[i,i];
Inc(j);
end;
j:=i+1;
while j<=n do
begin
k:=i+1;
while k<=n do
begin
A[j,k] := A[j,k]-A[j,i]*A[i,k];
Inc(k);
end;
Inc(j);
end;
Inc(i);
end;
I:=1;
while I<=N do
begin
L[I,I] := 1;
J:=1;
while J<=I-1 do
begin
L[I,J] := A[I,J];
A[I,J] := 0;
Inc(J);
end;
J:=I+1;
while J<=N do
begin
L[I,J] := 0;
Inc(J);
end;
Inc(I);
end;
end; }
procedure LUDecomposition(var A: ArrMatr;
N : Integer;
var L : ArrMatr);
var
i : Integer;
j : Integer;
k : Integer;
q:Integer;
sum:Double;
begin
for q:=1 to N-1 do
begin
i:=q;
for j:=i+1 to N do
begin
sum:=0;
for k:=1 to i-1 do
sum:=sum+a[i,k]*a[k,j];
a[i,j]:=(a[i,j]-sum)/a[i,i];
end;
j:=q+1;
for i:=j to N do
begin
sum:=0;
for k:=1 to j-1 do
sum:=sum+a[i,k]*a[k,j];
a[i,j]:=a[i,j]-sum;
end;
end;
for i:=1 to N do
for j:=1 to N do
begin
L[i,j]:=a[i,j];
if j>i then L[i,j]:=0;
end;
for i:=1 to N do
for j:=1 to N do
begin
if j=i then a[i,j]:=1;
if j<i then a[i,j]:=0;
end;
end;
{function power(Base, Exponent: Extended): Extended;
var
ex: extended;
begin
power := 0;
if (exponent <> 0)
and (frac(trunc((1 / exponent) * 1000000) / 1000000) = 0)
and (base < 0) then
begin
if round(1 / exponent) mod 2 = 0 then
exit;
ex := Exp(Exponent * Ln(-Base));
power := -ex;
end
else
begin
if Exponent = 0.0 then
power := 1.0
else if (Base = 0.0) and (Exponent > 0.0) then
power := 0.0
else if (Frac(Exponent) = 0.0) and (Abs(Exponent) <= MaxInt) then
power := IntPower(Base, Integer(Trunc(Exponent)))
else
power := Exp(Exponent * Ln(Base))
end;
end;}
function myfun(x:double;num:Integer):double;
var i:Integer;
tmp:double;
begin
tmp:=0;
for i:=1 to num do
tmp:=tmp+A[i]*power(x,i-1);
myfun:=tmp;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var x,y,i:Integer;
begin
Image1.Canvas.MoveTo(0,300);
Image1.Canvas.Pen.Width:=2;
for i:=1 to Np do
begin
x:=round(VAH[1,i]*100);
y:=300-round(VAH[2,i]*1e5);
Image1.Canvas.Pixels[x,y]:=clRed;
Image1.Canvas.LineTo(x,y);
Image1.Canvas.Pixels[x,y]:=clRed;
end;
Image1.Canvas.Pen.Color:=clRed;
Image1.Canvas.Pen.Width:=2;
Image1.Canvas.MoveTo(0,300);
for i:=1 to Np do
begin
x:=round(VAH[1,i]*100);
y:=300-round(myfun(VAH[1,i],Np)*1e5);
Image1.Canvas.Pixels[x,y]:=clRed;
Image1.Canvas.LineTo(x,y);
Image1.Canvas.Pixels[x,y]:=clRed;
end;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
var i,j,ll,m:Integer;
Ib:Double; num:Integer;
str:String;
begin
Ib:=VAH[2,1];
num:=1;
for i:=1 to Np do
if (Ib<VAH[2,i]) then
begin
Ib:=VAH[2,i];
num:=i;
end;
Ub:=VAH[1,num];
for ll:=1 to Np do
for m:=1 to Np do
begin
B[ll,m]:=0;
Y[ll]:=0;
for j:=1 to Np do
begin
B[ll,m]:=B[ll,m]+power(VAH[1,j]{-Ub},ll+m-2); //exp((l+m-2)*ln(VAH[1,j]-Ub));
Y[ll]:=Y[ll]+power(VAH[1,j]{-Ub},ll-1)*VAH[2,j];
//exp((l-1)*ln(VAH[1,j]-Ub))*VAH[1,j];
end;
end;
{ B[1,1]:=2; B[1,2]:=4; B[1,3]:=-4; B[1,4]:=6;
B[2,1]:=1; B[2,2]:=4; B[2,3]:=2; B[2,4]:=1;
B[3,1]:=3; B[3,2]:=8; B[3,3]:=1; B[3,4]:=1;
B[4,1]:=2; B[4,2]:=5; B[4,3]:=0; B[4,4]:=5;}
LUDecomposition(B,Np,L);
Z[1]:=Y[1]/L[1,1];
for i:=2 to Np do
begin
Z[i]:=0;
for j:=1 to i-1 do
Z[i]:=Z[i]+L[i,j]*Z[j];
Z[i]:=(Y[i]-Z[i])/L[i,i];
end;
A[Np]:=Z[Np];
for i:=Np-1 downto 1 do
begin
A[i]:=0;
for j:=i+1 to Np do
A[i]:=A[i]+B[i,j]*A[j];
A[i]:=Z[i]-A[i];
end;
str:='';
for i:=1 to Np do
begin
Memo1.Lines.Add(FloatToStr(A[i]));
str:=str+'+('+FloatToStrF(A[i],ffFixed,10,5)+'*(x^'+IntToStr(i-1)+'))';
end;
while Pos(',', str) > 0 do
str[Pos(',', str)] := '.';
Edit1.Text:=str;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
L = 10e-3; //10mH
R = 5e+3; // 5k
C = 1e-6; //1mkF
V = 4.8;
var i,j:Integer;
tmp:double;
T,ht,h,U,I1:double;
begin
T:=2*pi*sqrt(L*C);
ht:=T/100;
U:=V;
h:=ht;
Image1.Canvas.MoveTo(0,300);
Image1.Canvas.Pen.Width:=2;
{for i:=1 to 100 do
begin
I1:=I1+(h/L)*U;
U:=U+(h/c)*(myfun(U,Np)-I1-U/R);
Image1.Canvas.LineTo(round(h*10),300-round(U*50));
h:=h+ht;
end; }
t:=0;
Image2.Canvas.MoveTo(0,85);
for i:=1 to 500 do
begin
Image2.Canvas.LineTo(round(t*10),85-round(U*50));
t:=t+0.1;
end;
end;
end.
Приклад виконання програми
Висновок. На даній лабораторній роботі я відновив форму вхідного сигналу за його виміряними дискретними значеннями, отриманими на виході лінійної системи.