Thema: Delphi Itereation optimieren

Einzelnen Beitrag anzeigen

Benutzerbild von brinkee
brinkee

Registriert seit: 27. Aug 2004
60 Beiträge
 
Delphi 7 Enterprise
 
#1

Itereation optimieren

  Alt 7. Sep 2007, 19:39
Liebe Community,

ich bastle zur Zeit an einem Programm, mit dem man eine mulivariate Regression für Dosis-Wirkungs-Kurven durchführen kann, also für logistische, sigmoidale Funktionen. Das mache ich mit der Methode der kleinsten Quadrate, was auch hervorragend funkioniert. Allerdings habe ich ein Geschwindigkeitsproblem: Bei vier unabhängigen Parametern, die die zu approximierende Funktion beschreiben, ergeben sich nach meiner iterativen Methode vier geschachtelte While-Schleifen... Die Berechnung dauert fast eine Minute.
Jetzt kommt meine Frage an Euch: wie kann ich das Ganze soweit optmieren, dass das Ganze nicht so lange dauert?

Hier mein Code:
Delphi-Quellcode:
//####### Berechnen der Best-Fit-Values für den in "Datensatz" gegebenen Dataset ######
procedure TMainform.Regression;
Var
  x: Integer;
  i, j, k, l,
  nr_fifty, nr_eighty,
  xmin, xmax, ymin, ymax,
  a, b, c, d, start: Double;
  F: TRealData;
  G: TRealArray;
  msg: String;
begin


  //Parameter xmin, xmax, log(EC50) und hillslope mit den kleinsten Fehlerquadraten ermitteln
  start := 9999999999;

  i := ymin + 10;
  while i > ymin - 10 do
  begin
    j := ymax - 10;
    while j < (ymax + 10) do
    begin
      k := xmin;
      while k < xmax do
      begin
        l := -6;
        while l < -2 do
        begin
          if (getR(i, j, k, l)) < start then
          begin
            start := (getR(i, j, k, l));
            a := i;
            b := j;
            c := k;
            d := l;
          end;
          l := l + 0.1;
        end;
        k := k + 0.1;
      end;
      j := j + 0.1;
    end;
    i := i - 0.1;
  end;


  [...]


end;

//###### Summe der Fehlerquadrate ermitteln ######
function TMainform.getR(ymin, ymax, ec, hillslope: double): Double;
Var
  i: Integer;
  R: Double;
begin
  R := 0;
  for i := 0 to Datensatz.RowCount - 1 do
  begin
    R := R + Power(Datensatz.Cell[1,i].AsFloat-func(Datensatz.Cell[0,i].AsFloat, ymin, ymax, ec, hillslope), 2);
  end;
  result := R;
end;


//###### Gibt den Funktionswert von X mit den gegebenen Parametern zurück ######
function TMainform.func(x, ymin, ymax, ec, hillslope: double): Double;
begin
  result := ymin + (ymax-ymin)/(1+Power(10,(ec-x)*hillslope));
end;
Markus Brinkmann
  Mit Zitat antworten Zitat