home *** CD-ROM | disk | FTP | other *** search
- (*****************************************************************************)
- (* *)
- (* --- SOLVE.INC --- *)
- (* *)
- (* Unterprogramm-Modul zum Loesen einer Gleichung g(x)=0 *)
- (* *)
- (*****************************************************************************)
-
-
- Function Solve ( a,b, (* Suchintervall *)
- d :Real; (* Suchschrittweite *)
- k :Integer; (* k-te Ableitung *)
- Var Success :Boolean):Real; (* Loesung gefunden? *)
-
-
- Var x,y,s,dy,Lastx,Lasty,Lastdy :Real;
-
-
- Function Regula_Falsi ( Lastx,Lasty,
- x,y :Real;
- k :Integer;
- Var Success :Boolean) :Real;
-
- Var xmin,xmax,z :Real;
-
- Begin
- xmin := Lastx;
- xmax := x;
- If y<>0 then
- Repeat (* Anwendung der Regula falsi... *)
- z := x;
- x := x - y*(x-Lastx)/(y-Lasty);
- Lastx := z;
- Lasty := y;
- y := fn (x,k)
- until abs(x-Lastx) < eps; (* ... bis Genauigkeit erreicht *)
- Success := (x >= xmin) and (x <= xmax);
- Regula_Falsi := x
- End;
-
-
- Begin
- Success := false;
- x := a;
- Lasty := fn (x,k);
- Lastdy := fn (x,k+1);
- Lastx := x;
- x := x + d;
- If Lasty<>0 then
- Repeat
- y := fn (x,k);
- dy := fn (x,k+1);
- If y*Lasty <= 0 then (* Nullstelle lokalisiert *)
- s := Regula_Falsi (Lastx,Lasty,
- x,y,k,Success)
- else if dy*Lastdy <= 0 then (* Extremwert lokalisiert *)
- Begin
- s := Regula_Falsi (Lastx,Lastdy,x,
- dy,k+1,Success);
- Success := Success and
- (abs(fn(s,k)) < eps) (* Extremwert = Nullstelle? *)
- End;
- If not Success then
- Begin
- Lasty := y;
- Lastx := x;
- Lastdy := dy;
- x := x + d
- End
- else
- Solve := s
- until (x>b) or Success (* suche bis Nullstelle gefunden... *)
- else (* ... oder Intervallende erreicht *)
- Begin
- Success := true;
- Solve := x - d
- End
- End;