(*==========================================================================*) (* *) (* PASCAL-XSC - MODUL CAUCHYCO 000221 *) (* *) (* MODUL ZUR BERECHNUNG DER CAUCHYSCHEN KOEFFIZIENTENABSCHÄTZUNG *) (* *) (* ABSCHÄTZUNG MIT SUBTRAKTION EINER VARIABLEN TAYLORENTWICKLUNG *) (* RECHNUNG MIT EINFACHER GENAUIGKEIT *) (* *) (*==========================================================================*) MODULE cauchyco; USE i_ari, c_ari, ci_ari, icf_ari, itaylor, service , ivp_data; TYPE ZEIGER = ^ELEMENT; ELEMENT = RECORD PHI : INTERVAL; INTERV : CINTERVAL; MIDFUNKT : CINTERVAL; FUNKT : CINTERVAL; MIDBETR : INTERVAL; BETR : INTERVAL; NEXT : ZEIGER; END; (*----------------------------------------------------------------------*) PROCEDURE LISTE_LOESCHEN( VAR HEAD : ZEIGER ); VAR P , Q : ZEIGER; BEGIN WHILE HEAD <> NIL DO BEGIN IF HEAD^.NEXT = NIL THEN BEGIN DISPOSE( HEAD ); HEAD := NIL END ELSE BEGIN P := HEAD; WHILE P^.NEXT <> NIL DO BEGIN Q := P; P := P^.NEXT; END; DISPOSE( P ); Q^.NEXT := NIL; END; END; END; (*----------------------------------------------------------------------*) GLOBAL PROCEDURE CAUCHYCO( BSPNR: INTEGER; ALPHA, BETA, GAMMA, MITTE: REAL; RADIUS: REAL; ORDNUNG: INTEGER; TKOEFF: MPVECTOR; SEKTOR_ANFANG, SEKTOR_MAX : INTEGER; VAR RMAX : REAL; VAR ERR: INTEGER; VAR AUSGABE : TEXT ); (* PROZEDUR ZUR BERECHNUNG DER MODIFIZIERTEN *) (* CAUCHYSCHEN KOEFFIZIENTENABSCHÄTZUNG *) (* MITTELS EINER LISTE VARIABLER LÄNGE *) (* (ADAPTIVE VERFEINERUNG) *) (* BSPNR : BSPNR DER DGL *) (* ALPHA, BETA...: FUNKTIONSPARAMETER (NICHT IMMER BENUTZT) *) (* MITTE, RADIUS : DES KREISES, AUF DEM F AUSZUWERTEN IST *) (* ORDNUNG : ORDNUNG APPROXIMIERENDEN TAYLORPOLYNOMS *) (* ODER DER ABLEITUNG *) (* TKOEFF : TAYLORKOEFFIZIENTEN *) (* SEKTOR_ANFANG : ANFÄNGLICHE ZAHL DER SEKTOREN *) (* SEKTOR_MAX : MAXIMALE ZULÄSSIGE ZAHL DER SEKTOREN *) (* RMAX : BERECHNETE CAUCHY-SCHRANKE *) CONST PI = 3.141592653589800; (* OBERSCHRANKE VON PI *) EPS_REL = 0.005; VAR HEAD , P , Q , R : ZEIGER; I , ANZ , MAXANZ , SEKTOR_AKT : INTEGER; LAENGE , ABBRUCH , MINDIAM , DIAM_MIN , RMAX_LB : REAL; IMAX : INTERVAL; BEGIN SEKTOR_AKT := SEKTOR_ANFANG; LAENGE := 2 * PI / SEKTOR_AKT; ERR := 0; HEAD := NIL; RMAX_LB := 0; IMAX := 0; MINDIAM := 0; DIAM_MIN := 0; (* ZERLEGUNG DES KREISES IN SEKTOR_AKT SEKTOREN *) (* AUSWERTUNG VON F IST IN DIESER PROZEDUR AUF *) (* DEM GESAMTEN KREIS MÖGLICH *) (* ALLE FUNKTIONSWERTE SIND BERECHENBAR *) FOR I := 1 TO SEKTOR_AKT DO BEGIN NEW( P ); P^.PHI.INF := ( I - 1 ) * LAENGE; P^.PHI.SUP := I * LAENGE; F_A( BSPNR , ALPHA , BETA, GAMMA, MITTE, RADIUS, P^.PHI, ORDNUNG, TKOEFF, P^.MIDFUNKT , P^.FUNKT , MINDIAM , ERR ); P^.MIDBETR := ABS( P^.MIDFUNKT ); P^.BETR := ABS( P^.FUNKT ); (* AKTUALISIERUNG DER OBERSCHRANKE *) IF IMAX.INF < P^.MIDBETR.INF THEN IMAX.INF := P^.MIDBETR.INF; IF RMAX_LB < IMAX.INF THEN RMAX_LB := IMAX.INF; IF IMAX.SUP < P^.BETR.SUP THEN IMAX.SUP := P^.BETR.SUP; IF DIAM_MIN < MINDIAM THEN DIAM_MIN := MINDIAM; P^.NEXT := HEAD; HEAD := P; END; IF ERR = 1 THEN (* ABBRUCH: FUNKTION ERHÄLT UNZULÄSSIGE KOMPLEXE ARGUMENTE *) (* (DIESER FALL DARF NICHT EINTRETEN) *) RMAX := 0 ELSE BEGIN ABBRUCH := ( IMAX.SUP - IMAX.INF ) / ( ABS(IMAX.SUP) + ABS(IMAX.INF) ); WHILE ( ABBRUCH > EPS_REL ) AND ( SEKTOR_AKT < SEKTOR_MAX ) DO BEGIN (* MAXIMALE UNTERTEILUNG NOCH NICHT ERREICHT, *) (* AKTUELLE UNTERTEILUNG NICHT AUSREICHEND *) (* VERFEINERUNG DER ZERLEGUNG *) (* LOESCHEN DER INTERVALLE MIT FUNKTIONSWERTEN < MAX.INF *) (* ÜBRIGE INTERVALLE WERDEN HALBIERT *) LAENGE := LAENGE / 2; SEKTOR_AKT := SEKTOR_AKT * 2; IMAX.SUP := IMAX.INF; (* RÜCKSETZEN DES MINDESTDURCHMESSERS AUF NULL *) (* (KANN ZU UNTERSCHÄTZUNG FÜHREN) *) DIAM_MIN := 0; P := HEAD; Q := HEAD; WHILE P <> NIL DO BEGIN (* LISTE KOMPLETT ABARBEITEN *) IF P^.BETR.SUP < RMAX_LB THEN BEGIN (* LOESCHEN *) IF P = HEAD THEN BEGIN HEAD := HEAD^.NEXT; DISPOSE( P ); P := HEAD; Q := HEAD END ELSE BEGIN Q^.NEXT := P^.NEXT; DISPOSE( P ); P := Q^.NEXT END END ELSE BEGIN (* NICHT LOESCHEN *) (* HALBIERUNG DES INTERVALLS DURCH ANLEGEN ZWEIER *) (* NEUER LISTENELEMENTE FšR DIE TEILINTERVALLE *) IF P = HEAD THEN BEGIN NEW( Q ); Q^.NEXT := HEAD; HEAD := Q; NEW( Q ); Q^.NEXT := HEAD; HEAD := Q; END ELSE BEGIN NEW( R ); R^.NEXT := Q^.NEXT; Q^.NEXT := R; NEW( R ); R^.NEXT := Q^.NEXT; Q^.NEXT := R; Q := Q^.NEXT; END; (* NEUBERECHNUNG DER FUNKTIONSWERTE *) (* ERSTES TEILINTERVALL *) Q^.PHI.INF := P^.PHI.INF; Q^.PHI.SUP := P^.PHI.INF +> LAENGE; F_A( BSPNR, ALPHA, BETA, GAMMA, MITTE, RADIUS, Q^.PHI, ORDNUNG, TKOEFF, Q^.MIDFUNKT, Q^.FUNKT, MINDIAM, ERR ); Q^.MIDBETR := ABS( Q^.MIDFUNKT ); Q^.BETR := ABS( Q^.FUNKT ); (* AKTUALISIERUNG DER OBERSCHRANKE DER FUNKTIONSWERTE *) IF IMAX.INF < Q^.MIDBETR.INF THEN IMAX.INF := Q^.MIDBETR.INF; IF IMAX.SUP < Q^.BETR.SUP THEN IMAX.SUP := Q^.BETR.SUP; IF DIAM_MIN < MINDIAM THEN DIAM_MIN := MINDIAM; (* ZWEITES TEILINTERVALL *) Q := Q^.NEXT; Q^.PHI.SUP := P^.PHI.SUP; Q^.PHI.INF := P^.PHI.SUP -< LAENGE; F_A( BSPNR, ALPHA, BETA, GAMMA, MITTE, RADIUS, Q^.PHI, ORDNUNG, TKOEFF , Q^.MIDFUNKT , Q^.FUNKT , MINDIAM , ERR ); Q^.MIDBETR := ABS( Q^.MIDFUNKT ); Q^.BETR := ABS( Q^.FUNKT ); (* AKTUALISIERUNG DER OBERSCHRANKE DER FUNKTIONSWERTE *) IF IMAX.INF < Q^.MIDBETR.INF THEN IMAX.INF := Q^.MIDBETR.INF; IF IMAX.SUP < Q^.BETR.SUP THEN IMAX.SUP := Q^.BETR.SUP; IF DIAM_MIN < MINDIAM THEN DIAM_MIN := MINDIAM; (* ALTES INTERVALL ENTFERNEN *) Q^.NEXT := Q^.NEXT^.NEXT; DISPOSE( P ); P := Q^.NEXT; END; END; (* WHILE *) ABBRUCH := ( IMAX.SUP-IMAX.INF ) / ( ABS(IMAX.SUP)+ABS(IMAX.INF) ); END; (* WHILE *) (* TESTEN, WIE VIELE SEKTOREN DAS MAXIMUM ENTHALTEN KÖNNEN *) (* (ZUSATZINFORMATION, FÜR DIE WEITERE RECHNUNG UNNÖTIG) *) MAXANZ := SEKTOR_AKT; P := HEAD; WHILE P <> NIL DO BEGIN IF P^.BETR.SUP < RMAX_LB THEN (* MAX NICHT IN DIESEM INTERVALL *) MAXANZ := MAXANZ - 1; P := P^.NEXT; END; WRITELN( AUSGABE , 'CAUCHYCO MIT SUBTRAKTION DES TAYLORPOLYNOMS:' ); WRITELN( AUSGABE , 'ORDNUNG: ' , ORDNUNG ); WRITELN( AUSGABE , 'MITTELPUNKT: ' , MITTE:4:2 ); WRITELN( AUSGABE , 'RADIUS: ' , RADIUS:4:2 ); WRITELN( AUSGABE , 'UNTERTEILUNG: ' , SEKTOR_AKT ); WRITELN( AUSGABE , 'BELEGTE SEKTOREN: ' , MAXANZ ); WRITE( AUSGABE , 'MAXIMUM: '); IWRITELN( AUSGABE , IMAX); WRITELN( AUSGABE , 'UNTERSCHRANKE FÜR MAXIMUM: ' , DIAM_MIN ); WRITELN( AUSGABE ); RMAX := IMAX.SUP; END; LISTE_LOESCHEN( HEAD ); END; (*----------------------------------------------------------------------*) GLOBAL PROCEDURE CAUCHYTEST( BSPNR: INTEGER; ALPHA, BETA, GAMMA, MITTE: REAL; RADIUS: REAL; ORDNUNG: INTEGER; TKOEFF: MPVECTOR; SEKTOREN, SEKTOR_MAX : INTEGER; VAR RMAX_MID_LB, RMAX_LB : REAL; VAR ERR : INTEGER; VAR AUSGABE : TEXT ); (* PROZEDUR ZUR NÄHERUNGSWEISEN BERECHNUNG DER CAUCHY-SCHRANKE *) (* DAS MAXIMUM AUF DEM KREIS WIRD AN SEKTOREN STELLEN BERECHNET *) (* BSPNR : BSPNR DER DGL *) (* ALPHA, BETA...: FUNKTIONSPARAMETER (NICHT IMMER BENUTZT) *) (* MITTE, RADIUS : DES KREISES, AUF DEM F AUSZUWERTEN IST *) (* ORDNUNG : ORDNUNG APPROXIMIERENDEN TAYLORPOLYNOMS *) (* TKOEFF : TAYLORKOEFFIZIENTEN *) (* SEKTOREN : ANZAHL DER VERWENDETEN SEKTOREN *) (* RMAX_LB : BERECHNETE CAUCHY-UNTERSCHRANKE *) (* MINDIAM : HIER NUR DUMMY-PARAMETER FÜR UNTERPROGRAMM-AUFRUF *) CONST PI = 3.1415926535898; (* NÄHERUNG VON PI *) VAR I : INTEGER; MINDIAM , ARGDIAM : REAL; LAENGE , PHI , MIDBETR , BETR : INTERVAL; INTERV , MIDFUNKT , FUNKT : CINTERVAL; BEGIN LAENGE := 2 * PI / SEKTOREN; ARGDIAM := 2 * PI / SEKTOR_MAX; RMAX_LB := 0; RMAX_MID_LB := 0; FOR I := 1 TO SEKTOREN DO BEGIN PHI := ( I - 1 ) * LAENGE; PHI.SUP := PHI.SUP +> ARGDIAM; (* FEINE KREIS-UNTERTEILUNG SIMULIEREN *) F_A( BSPNR , ALPHA, BETA, GAMMA, MITTE, RADIUS, PHI, ORDNUNG, TKOEFF, MIDFUNKT , FUNKT , MINDIAM , ERR ); MIDBETR := ABS( MIDFUNKT ); BETR := ABS( FUNKT ); (* AKTUALISIERUNG DER SCHRANKE *) (* RMAX_LB IST EINE UNTERSCHRANKE DER AUF DEM RECHNER *) (* ERZIELBAREN OBERSCHRANKE FÜR DAS MAXIMUM VON F *) (* (FALLS DIE UNTERTEILUNG NICHT FEINER ALS ARGDIAM WIRD) *) IF RMAX_MID_LB < MIDBETR.SUP THEN RMAX_MID_LB := MIDBETR.SUP; IF RMAX_LB < BETR.SUP THEN RMAX_LB := BETR.SUP; END; WRITELN( AUSGABE , 'CAUCHYTEST MIT SUBTRAKTION DES TAYLORPOLYNOMS:' ); WRITELN( AUSGABE , 'ORDNUNG: ' , ORDNUNG ); WRITELN( AUSGABE , 'MITTELPUNKT: ' , MITTE:4:2 ); WRITELN( AUSGABE , 'RADIUS: ' , RADIUS:4:2 ); WRITELN( AUSGABE , 'SEKTOREN: ' , SEKTOREN ); WRITELN( AUSGABE , 'MAXIMUM >= ' , RMAX_LB ); WRITELN( AUSGABE , 'MID_MAXIMUM >= ' , RMAX_MID_LB ); END; (*----------------------------------------------------------------------*) GLOBAL PROCEDURE CAUCHY( BSPNR: INTEGER; ALPHA, BETA, GAMMA, MITTE: REAL; RADIUS: REAL; ORDNUNG: INTEGER; TKOEFF: MPVECTOR; SEKTOREN : INTEGER; VAR RMAX : REAL; VAR ERR : INTEGER; VAR AUSGABE : TEXT ); (* PROZEDUR ZUR BERECHNUNG DER MODIFIZIERTEN *) (* CAUCHYSCHEN KOEFFIZIENTENABSCHÄTZUNG *) (* PROZEDUR, IN DER KEINE LISTE ANGELEGT WIRD *) (* DAS MAXIMUM AUF DEM KREIS WIRD BERECHNET, *) (* OHNE DIE SEKTORENZAHL ZU VERÄNDERN, FALLS *) (* DAS ERGEBNIS UNGENAU IST (ZEITERSPARNIS) *) (* BSPNR : BSPNR DER DGL *) (* ALPHA, BETA...: FUNKTIONSPARAMETER (NICHT IMMER BENUTZT) *) (* MITTE, RADIUS : DES KREISES, AUF DEM F AUSZUWERTEN IST *) (* ORDNUNG : ORDNUNG APPROXIMIERENDEN TAYLORPOLYNOMS *) (* TKOEFF : TAYLORKOEFFIZIENTEN *) (* SEKTOREN : ANZAHL DER VERWENDETEN SEKTOREN *) (* RMAX : BERECHNETE CAUCHY-SCHRANKE *) CONST PI = 3.141592653589800; (* OBERSCHRANKE VON PI *) VAR I : INTEGER; LAENGE , MINDIAM , DIAM_MIN : REAL; PHI , IMAX , MIDBETR , BETR : INTERVAL; INTERV , MIDFUNKT , FUNKT : CINTERVAL; BEGIN LAENGE := 2 * PI / SEKTOREN; IMAX := 0; MINDIAM := 0; DIAM_MIN := 0; (* ZERLEGUNG DES KREISES IN SEKTOR_AKT SEKTOREN *) (* AUSWERTUNG VON F IST IN DIESER PROZEDUR AUF *) (* DEM GESAMTEN KREIS MÖGLICH *) (* ALLE FUNKTIONSWERTE SIND BERECHENBAR *) FOR I := 1 TO SEKTOREN DO BEGIN PHI.INF := ( I - 1 ) *< LAENGE; PHI.SUP := I *> LAENGE; F_A( BSPNR , ALPHA, BETA, GAMMA, MITTE, RADIUS, PHI, ORDNUNG, TKOEFF, MIDFUNKT , FUNKT , MINDIAM , ERR ); MIDBETR := ABS( MIDFUNKT ); BETR := ABS( FUNKT ); (* AKTUALISIERUNG DER OBERSCHRANKE *) IF IMAX.INF < MIDBETR.INF THEN IMAX.INF := MIDBETR.INF; IF IMAX.SUP < BETR.SUP THEN IMAX.SUP := BETR.SUP; IF DIAM_MIN < MINDIAM THEN DIAM_MIN := MINDIAM; END; WRITELN( AUSGABE , 'CAUCHY MIT SUBTRAKTION DES TAYLORPOLYNOMS:' ); WRITELN( AUSGABE , 'ORDNUNG: ' , ORDNUNG ); WRITELN( AUSGABE , 'MITTELPUNKT: ' , MITTE:4:2 ); WRITELN( AUSGABE , 'RADIUS: ' , RADIUS:4:2 ); WRITELN( AUSGABE , 'SEKTOREN: ' , SEKTOREN ); WRITE( AUSGABE , 'MAXIMUM: '); IWRITELN( AUSGABE , IMAX); WRITELN( AUSGABE , 'UNTERSCHRANKE FÜR MAXIMUM: ' , DIAM_MIN ); WRITELN( AUSGABE ); WRITELN( AUSGABE ); RMAX := IMAX.SUP; END; END. (*==========================================================================*) (* *) (* PASCAL-XSC - MODUL CAUCHYCO *) (* *) (* MODUL ZUR BERECHNUNG DER CAUCHYSCHEN KOEFFIZIENTENABSCHÄTZUNG *) (* *) (* ABSCHÄTZUNG MIT SUBTRAKTION EINER VARIABLEN TAYLORENTWICKLUNG *) (* RECHNUNG MIT EINFACHER GENAUIGKEIT *) (* *) (*==========================================================================*)