home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / sonderh1 / solve.inc < prev    next >
Text File  |  1988-02-01  |  3KB  |  74 lines

  1. (*****************************************************************************)
  2. (*                               SOLVE.INC                                   *)
  3. (*                                                                           *)
  4. (*                         Lösen der Gleichung f(x) = 0                      *)
  5. (*****************************************************************************)
  6.  
  7. Function Solve (    a,b,                                (* Suchintervall     *)
  8.                     d    :Real;                         (* Suchschrittweite  *)
  9.                     k    :Integer;                      (* k-te Ableitung    *)
  10.                 Var done :Boolean) :Real;               (* Lösung gefunden?  *)
  11.  
  12.    Var  x,y,s,dy,Lastx,Lasty,Lastdy :Real;
  13.  
  14.  
  15.    Function RegulaFalsi (    Lastx,Lasty,x,y :Real;
  16.                              k               :Integer;
  17.                          Var done            :Boolean) :Real;
  18.  
  19.       Var xmin,xmax,z :Real;
  20.  
  21.       Begin
  22.       xmin := Lastx;
  23.       xmax := x;
  24.       If y <> 0 then
  25.          Repeat                                (* Anwendung der Regula falsi *)
  26.             z := x;
  27.             x := x - y*(x-Lastx)/(y-Lasty);
  28.             Lastx := z;
  29.             Lasty := y;
  30.             y := fn (x,k)
  31.          until (abs(x-Lastx) < eps) or (y = Lasty);
  32.       done := (x >= xmin) and (x <= xmax);
  33.       RegulaFalsi := x
  34.       End;
  35.  
  36.  
  37.    Begin
  38.    done    := false;
  39.    x       := a;
  40.    Lasty   := fn (x, k);
  41.    Lastdy  := fn (x, k+1);
  42.    Lastx   := x;
  43.    x       := x + d;
  44.    If Lasty <> 0 then
  45.       Repeat
  46.          y  := fn (x, k);
  47.          dy := fn (x, k+1);
  48.          If y*Lasty <= 0 then                      (* Nullstelle lokalisiert *)
  49.             s := RegulaFalsi (Lastx,Lasty,
  50.                               x,y,k,done)
  51.          else
  52.             If dy*Lastdy <= 0 then                 (* Extremwert lokalisiert *)
  53.                Begin
  54.                s := RegulaFalsi (Lastx, Lastdy, x, dy, k+1, done);
  55.                done := done and
  56.                        (abs(fn(s,k)) < eps)      (* Extremwert = Nullstelle? *)
  57.                End;
  58.          If not done then
  59.             Begin
  60.             Lasty  := y;
  61.             Lastx  := x;
  62.             Lastdy := dy;
  63.             x      := x + d
  64.             End
  65.          else
  66.             Solve := s
  67.       until (x > b) or done              (* suche bis Nullstelle gefunden... *)
  68.    else                                  (* ... oder Intervallende erreicht  *)
  69.       Begin
  70.       done := true;
  71.       Solve := x - d
  72.       End
  73.    End;
  74.