interpolēšanas metožu izmantošana delphi un matlab vidē
Post on 11-Feb-2016
60 Views
Preview:
DESCRIPTION
TRANSCRIPT
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ā.
y
x 1 2 … i i+1 … n – 1 n
Funkciju interpolācija
Lineārā interpolācija
bxay * - Taisnes vienādojums
bxaybxay
ii
ii
11 ** Funkcijas vērtības
kaimiņ mezglu punktos
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
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;
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
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
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.
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.
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.
xi
z1 = 0
xi+1
z2 = xi+1 - xi z = x - xi
y=az3+bz2+cz+d
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.
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
′
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
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
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
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.
Programmas fragmenti Delphi vidē
Funkcijas kubisks splains
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;
{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;
{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;
{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;
{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;
{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;
{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;
{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;
{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
top related