Einzelnen Beitrag anzeigen

jan001

Registriert seit: 31. Mär 2009
10 Beiträge
 
#1

Ansatzkoeffizienten berechnen

  Alt 12. Okt 2012, 11:27
Für n=20 Punkte P(x,y) möchte ich Ansatzfunktionen finden.
Bei Funktion y = a1 + a2*x + a3*x*x + a4*x*x*x + a5*x*x*x*x habe ich eine Lösung zur Berechnung Koeffizienten a1 bis a5 gefunden (Polynom 4. Ordnung).
Für Funktion y = a1 + a2*x + a3*x*x + a4*x*x*x + a5*sqrt(x) hilft diese Methode nicht. Kennt jemand eine Lösung?

Code:
procedure interp_5(n : integer; p : rp; var a : array of double);
var i : integer;
    c1, c2, c3, c4, c5 : double;
    x0, xi, xi2, xi3, xi4, xi5, xi6, xi7, xi8,
    yi, xiyi, xi2yi, xi3yi, xi4yi : double;
begin
x0:= 0; xi:= 0; xi2:= 0; xi3:= 0; xi4:= 0; xi5:= 0; xi6:= 0; xi7:= 0; xi8:= 0;
yi:= 0; xiyi:= 0; xi2yi:= 0; xi3yi:= 0; xi4yi:= 0;

for i:= 1 to n do begin
  x0:= x0 + 1;
  xi:= xi + p.x[i];
  xi2:= xi2 + p.x[i]*p.x[i];
  xi3:= xi3 + p.x[i]*p.x[i]*p.x[i];
  xi4:= xi4 + p.x[i]*p.x[i]*p.x[i]*p.x[i];
  xi5:= xi5 + p.x[i]*p.x[i]*p.x[i]*p.x[i]*p.x[i];
  xi6:= xi6 + p.x[i]*p.x[i]*p.x[i]*p.x[i]*p.x[i]*p.x[i];
  xi7:= xi7 + p.x[i]*p.x[i]*p.x[i]*p.x[i]*p.x[i]*p.x[i]*p.x[i];
  xi8:= xi8 + p.x[i]*p.x[i]*p.x[i]*p.x[i]*p.x[i]*p.x[i]*p.x[i]*p.x[i];
  yi:= yi + p.y[i];
  xiyi:= xiyi + p.x[i]*p.y[i];
  xi2yi:= xi2yi + p.x[i]*p.x[i]*p.y[i];
  xi3yi:= xi3yi + p.x[i]*p.x[i]*p.x[i]*p.y[i];
  xi4yi:= xi4yi + p.x[i]*p.x[i]*p.x[i]*p.x[i]*p.y[i];
end;

Loesung_LGS_5(x0,xi,xi2,xi3,xi4,xi5,xi6,xi7,xi8, yi,xiyi,xi2yi,xi3yi,xi4yi, c1, c2, c3, c4, c5);
a[1]:= c1; a[2]:= c2; a[3]:= c3; a[4]:= c4; a[5]:= c5;
end;

procedure Loesung_LGS_5(x0,xi,xi2,xi3,xi4,xi5,xi6,xi7,xi8, yi,xiyi,xi2yi,xi3yi,xi4yi : double; var c1, c2, c3, c4, c5 : double);
const n = 5;
var
  i0 : integer;
  x : array[0..n-1] of extended;            //Die Lösungen x0, x1, x2, ...
  koeff : array[0..n-1,0..n] of extended;   //Die Koeffizienten

  procedure VereinfacheRest(i: integer);
  var
    zeile, spalte: integer;
    d: extended;
  begin
    for zeile:= 0 to n - 1 do if zeile <> i then begin
      d:= koeff[zeile,i]/koeff[i,i];
      if d <> 0 then begin
        for spalte:= 0 to n do if spalte <> i then
          koeff[zeile,spalte]:= koeff[zeile,spalte] - d*koeff[i,spalte]
        else koeff[zeile,i]:= 0;
      end;
    end;
  end;

begin
koeff[0,0]:= x0; koeff[0,1]:= xi; koeff[0,2]:= xi2; koeff[0,3]:= xi3; koeff[0,4]:= xi4; koeff[0,5]:= yi;
koeff[1,0]:= xi; koeff[1,1]:= xi2; koeff[1,2]:= xi3; koeff[1,3]:= xi4; koeff[1,4]:= xi5; koeff[1,5]:= xiyi;
koeff[2,0]:= xi2; koeff[2,1]:= xi3; koeff[2,2]:= xi4; koeff[2,3]:= xi5; koeff[2,4]:= xi6; koeff[2,5]:= xi2yi;
koeff[3,0]:= xi3; koeff[3,1]:= xi4; koeff[3,2]:= xi5; koeff[3,3]:= xi6; koeff[3,4]:= xi7; koeff[3,5]:= xi3yi;
koeff[4,0]:= xi4; koeff[4,1]:= xi5; koeff[4,2]:= xi6; koeff[4,3]:= xi7; koeff[4,4]:= xi8; koeff[4,5]:= xi4yi;

for i0:= 0 to n - 1 do VereinfacheRest(i0);
for i0:= 0 to n - 1 do x[i0]:= koeff[i0,n]/koeff[i0,i0];

c1:= x[0]; c2:= x[1]; c3:= x[2]; c4:= x[3]; c5:= x[4];
end;

Geändert von jan001 (12. Okt 2012 um 12:29 Uhr)
  Mit Zitat antworten Zitat