interpolēšanas metožu izmantošana delphi un matlab vidē

28
Interpolēšanas metožu izmantošana Delphi un Matlab vidē.

Upload: brilliant

Post on 11-Feb-2016

60 views

Category:

Documents


0 download

DESCRIPTION

Interpolēšanas metožu izmantošana Delphi un Matlab vidē. . Praks ē nereti rodas nepieciešam ī ba noskaidrot sakar ī bas daž ā dos procesos un par ā d ī b ā s un izteikt š ī s sakar ī bas matem ā tiskas izteiksmes veid ā . - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

Interpolēšanas metožu izmantošana Delphi un Matlab vidē.

Page 2: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

Praksē nereti rodas nepieciešamība noskaidrot sakarības dažādos procesos un parādībās un izteikt šīs sakarības matemātiskas izteiksmes veidā.

Ir zināmi trīs funkciju uzdošanas veidi: analītiskais, grafiskais un tabulārais.

Interpolācija visbiežāk jāizmanto tad, ja funkcija ir uzdota tabulas veidā.

Page 3: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

y

x 1 2 … i i+1 … n – 1 n

Funkciju interpolācija

Page 4: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

Lineārā interpolācija

bxay * - Taisnes vienādojums

bxaybxay

ii

ii

11 ** Funkcijas vērtības

kaimiņ mezglu punktos

Page 5: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

ii

iiii

ii

ii

iiii

ii

xxyyxyb

xxyya

xayxayxayb

1

1

1

1

11

*

***

Atrodam a un b vērtības:

Nosacījums xi < Xt < xi+1

Page 6: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

Piemērs.

xt := strtofloat(edit1.text);For i := 1 to n-1 dobegin if (xt < x[i+1]) and (xt > x[i]) then begin

a:= (y[i+1] – y[i])/(x[i+1] – x[i]);

b:= y[i] – x[i] * a; yt:= a*xt + b;

endend;

Page 7: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

Kvadrātiskā interpolācija

a*x2 + b*x + c = 0; Parabolas vienādojums

y[i-1] = x[i-1]*x[i-1]*a + x[i-1]*b + c

y[i] = x[i]*x[i]*a + x[i]*b + c

y[i+1] = x[i+1]*x[i+1]*a + x[i+1]*b + c

Page 8: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

No vienādojumu sistēmasatrodam a, b un c vērtības:

a = ∆a /∆; b = ∆b /∆; c = ∆c /∆;

kur ∆, ∆a, ∆b, ∆c – trešās kārtas

determinanti.

xi-1 <= x <= xi+1

Page 9: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

 Splain-interpolācija

m kārtības splain dēvējas funkcija, kura ir m pakāpes polinoms uz katras atstarpes starp mezglu punktiem un visos iekšējos mezglos apmierina funkcijas un atvasinājumu kontinuitātes nosacījumiem.

Page 10: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

Vislielāko izplatīšanu saņēma kuba splains

y=ax3+bx2+cx+d.

Atradīsim atkarības viņa a, b, c, d koeficentu aprēķināšanai pa funkcijas un tās pirmo atvasinājumu vērtībām kaimiņ mezglu punktos.

Page 11: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

 Izkravāšanu vienkāršojumam pieņemsim,

ka atstarpes kreisa leņķiska punkta xi,xi+1

argumenta vērtība, kurai meklējam splain-

funkciju, vienāds nullei. To vienmēr var

izdarīt pārveidi x=xi+z, kur z jauns

arguments.

Page 12: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

xi

z1 = 0

xi+1

z2 = xi+1 - xi z = x - xi

y=az3+bz2+cz+d

Page 13: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

 Tad uzdevums ir noformulējams sekojoši:

atrast nezināmus a, b, c, d splaina koeficentus,

apmierinoši mezglu punktos nosacījumam

z1=0; y(z1)=f1; y'(z1)=f1'; y(z2)=f2; y' (z2)=f2'.

Šeit f1,f2,f1',f2' - attiecīgi interpolēšanas

funkcijas un tās atvasinājuma vērtības mezglu

punktos z1, z2.

Page 14: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

 Lai atrastu a,b,c,d saliksim vienādojumu

sistēmu, izmantojot nosacījumus mezglu

punktos

f1 = d;

f1′ = c;

f2 = az23 + bz2

2 + cz2 +d;

f2′ = 3az2

2 + 2bz +c; tātad

d = f1;c = f1

Page 15: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

 Paliekot atrastās d, c vērtības divos

pēdējos vienādojumos un atļaujot tos

relatīvi a, b saņemsim

a = (z2(f2′ - f1

′ ) – 2(f2 - f1′ * z2 – f1))/z2

3

b = (3(f2 - f1′ * z2 – f1) – z2(f2

′ - f1′ ))/z2

2

Page 16: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

Paliekot atrastos koeficentus kuba splainu un uzdodot argumenta vērtību, aprēķināsim funkcijas vērtību starp mezglu punktiem.

y = az3 + bz2 + cz + d

Page 17: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

Bieži pie interpolācijas ir esamas tikai funkcijas vērtības mezglu punktos un nav atvasinājumu vērtību. Tad pirmie atvasinājumi iekšējos mezglu punktos aprēķina pa formulām

fi′ = (fi+1 – fi-1)/(xi+1 – xi-1),

fi′ = (fi+1 – fi-1)/(2h), i = 2, .. N-1

h- attālums starp mezglu punktiem.N – mezglu punktu skaits

Page 18: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

Atvasinājuma vērtību pirmajā un pēdējā mezglu punktos aprēķina pa formulām:

f1′ = f2

′ - f2″ h; fn

′ = fn-1′ – fn-1

″ h;

f2″ = (f1 + f3 – 2f2)/h2;

fn-1″ = (fn-2 + fn – 2fn-1)/h2;

f2″ , fn-1

″ - otro atvasinājumu pietuvinātās vērtības otrajā un n - 1 punktos.

Page 19: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

Programmas fragmenti Delphi vidē

Funkcijas kubisks splains

Page 20: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

function k_spl(xx:Real):Real;var d:Real; // koeficient d{pirmā atvasinājuma aprēķins mezgla punktos (i>= 2) and (i <= n-1)}function fi_1(i:Byte):Real;begin fi_1 := (y[i+1] - y[i-1])/(x[i+1]-x[i-1]);end;{otrā atvasinājuma aprēķins punktā i = 2}function f22:single;begin f22 := (y[1] + y[3] - 2*y[2])/sqr(x[2]-x[1]);end;{pirmā atvasinājuma aprēķins punktā i = 1}function f12:single;begin f12 := fi_1(2) - f22*(x[2]-x[1]);end;

Page 21: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

{otrā atvasinājuma aprēķins punktā i = n-1}function fn2:single;begin fn2 := (y[n-2] + y[n] - 2*y[n-1])/sqr(x[n]-x[n-1]);end;{pirmā atvasinājuma aprēķins punktā i = n}function f1n:single;begin f1n := fi_1(n-1) - fn2*(x[n]-x[n-1]);end;{koeficienta c aprēķināšana}function c(i:byte):single;begin if (i>= 2) and (i < n-1) then c := fi_1(i); if i = 1 then c := f12; if i = n-1 then c := f1n;end;

Page 22: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

{koeficienta a aprēķinšāna}function a(i:Byte):Real;begin if (i>= 2) and (i < n-1) then begin a := ((x[i+1]-x[i])*(fi_1(i+1)-fi_1(i)) - 2*(y[i+1] - fi_1(i)*(x[i+1]-x[i]) - y[i]))/power(x[i+1]-x[i],3); end; if i= 1 then begin a := ((x[i+1]-x[i])*(fi_1(i+1)-fi_1(i)) - 2*(y[i+1] - f12*(x[i+1]-x[i]) - y[i]))/power(x[i+1]-x[i],3); end; if i= n-1 then begin a := ((x[i+1]-x[i])*(f1n-fi_1(i)) - 2*(y[i+1] - fi_1(i)*(x[i+1]-x[i]) - y[i]))/power(x[i+1]-x[i],3); end;end;

Page 23: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

{koeficienta b aprēķināšana}function b(i:Byte):Real;begin if (i>= 2) and (i < n-1) then begin b := (3*(y[i+1] - fi_1(i)*(x[i+1]-x[i]) - y[i])-(x[i+1]-x[i])* (fi_1(i+1)-fi_1(i)))/sqr(x[i+1]-x[i]); end; if i = 1 then begin b := (3*(y[i+1] - f12*(x[i+1]-x[i]) - y[i])- (x[i+1]-x[i])*(fi_1(i+1)-

fi_1(i)))/sqr(x[i+1]-x[i]); end; if i= n-1 then begin b := (3*(y[i+1] - fi_1(i)*(x[i+1]-x[i]) - y[i])- (x[i+1]-x[i])*(f1n-fi_1(i)))/sqr(x[i+1]-x[i]); end;end;

Page 24: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

{Funkcijas ķermenis}begin for j := 1 to n-1 do if(xx > x[j]) and (xx < x[j+1]) then it := j; {it – kreisa mezgla numurs x[it] - kreisa mezgla koordināta xx – argumenta vērtība} d := y[it];

k_spl := a(it)*power(xx-x[it],3) + b(it)*sqr(xx-x[it])+ c(it)*(xx-x[it]) + d;end;

Page 25: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

{Funkcijas y(xt) vērtības aprēķināšana}

procedure TForm1.Button1Click(Sender: TObject);begin xt := strtofloat(edit1.Text);{ lasīt vektorus x un y no stringgrid komponenta} for i := 1 to n do begin x[i] := strtofloat(stringgrid1.Cells[i-1,0]); y[i] := strtofloat(stringgrid1.Cells[i-1,1]); end; yt := k_spl(xt) ; {vērtības y(xt) izvade}

edit2.Text := floattostrf(yt,fffixed,10,3);end;

Page 26: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

{Grafika konstruēšana}procedure TForm1.Button2Click(Sender: TObject);begin Series1.Clear; Series2.Clear; for i := 1 to n do begin x[i] := strtofloat(stringgrid1.Cells[i-1,0]); y[i] := strtofloat(stringgrid1.Cells[i-1,1]); Series1.AddXY(x[i],y[i]); end; xg := x[1]; yg := y[1]; Series2.AddXY(xg,yg); repeat xg := xg + 0.05; yg := k_spl(xg) ; Series2.AddXY(xg,yf); until xg >= x[n];end;

Page 27: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

{Lasīt vektorus x un y no faila, izmantojot OpenDialog komponentu}

procedure TForm1.Open1Click(Sender: TObject);begin if OpenDialog1.Execute then begin AssignFile(ff,OpenDialog1.FileName); Reset(ff); i:=0; while not Eof(ff) do begin i := i+1; readln(ff,x[i],y[i]); end; end; CloseFile(ff);end;

Page 28: Interpolēšanas metožu izmantošana  Delphi  un  Matlab vidē

{Fails dati.txt Notepadā}

-5.0 9.13-4.2 1.26-3.4 -0.7-2.6 1.03-1.8 -2.05-1.0 -7.23-0.2 -6.150.6 -2.021.4 -3.022.2 -5.43