P_59_E37-Calcular+raiz+de+polinomio+de+tercer+grado

=__**Calcular una de las raices de un polinomio de tercer grado**__=

Escribir un progra que calcule una de las raices de un polinomio de tercer grado, empleando para ello el método de la bisección.

(para que ese rango sea válido debe haber en él un número impar de raíces)
 * El program apedirá inicialmente los coleficientes del polinomio
 * Seguidamente pedirá los límites de un rango de valores donde buscar la raíz

code format="pascal" PROGRAM Subpr37 ; USES Crt ;

CONST rAPROXIMACION = 0.000000001 ;

FUNCTION fnrPotencia (iExponente : Integer ; rBase : Real) : Real ; VAR iIndice : Integer ; rResultado : Real ; BEGIN rResultado := 1 ; FOR iIndice := 1 TO iExponente DO     rResultado := rResultado * rBase ; fnrPotencia := rResultado END ; { fnrPotencia }

FUNCTION fnrCalculaFuncion (rA, rB, rC, rD : Real ; rPunto : Real) : Real ; BEGIN fnrCalculaFuncion := rA * fnrPotencia (3, rPunto) + rB * fnrPotencia (2, rPunto) + rC * rPunto + rD END ; { fnrCalculaFuncion }

FUNCTION fnboFuncionCambSigno (rA, rB, rC, rD : Real ;                              rPrincipio, rFin : Real ) : Boolean ; VAR rProducto : Real ; BEGIN rProducto := fnrCalculaFuncion (rA, rB, rC, rD, rPrincipio) * fnrCalculaFuncion (rA, rB, rC, rD, rFin) ;

fnboFuncionCambSigno := rProducto < 0 END ; { fnboFuncionCambSigno }

PROCEDURE ValorMedio (rA, rB, rC, rD : Real ;                     VAR rSegmenBajo, rSegmenAlto : Real ;                      VAR boSolucion : boolean ) ; VAR rMedio : Real ; BEGIN rMedio := (rSegmenAlto + rSegmenBajo ) / 2 ;

IF Abs (fnrCalculaFuncion (rA, rB, rC, rD, rMedio)) < rAPROXIMACION THEN BEGIN rSegmenBajo := rMedio ; rSegmenAlto := rMedio ; boSolucion := TRUE END ELSE IF fnboFuncionCambSigno (rA, rB, rC, rD, rSegmenBajo, rMedio) THEN BEGIN rSegmenAlto := rMedio ; boSolucion := FALSE END ELSE BEGIN rSegmenBajo := rMedio ; boSolucion := FALSE END END ; { ValorMedio }

VAR rA, rB, rC, rD : Real ; { coeficientes de la ecuaci¢n } rSegmenAlto, { extremo superior de un segmento } rSegmenBajo, { extemo inferior de un segmento } rValorFuncion : Real ; boError, boFinal : Boolean ; cEspera : Char ; BEGIN {* PROGRAMA PRINCIPAL *} Writeln ; Writeln ; Writeln (' PROGRAMA QUE CALCULA UNA DE LAS RAICES DE UN POLINOMIO ') ; Writeln (' ====================================================== ') ; Writeln ('Funcion de tercer grado : ') ; Writeln ('F (x) = A * x^3 + B * x^2 + C * x + D ') ;

Writeln ('Introducir los par metros de la funcion de tercer grado') ; Writeln ('hacerlo en el orden indicado:') ; Write (' A: ') ; Readln (rA) ; Write (' B: ') ; Readln (rB) ; Write (' C: ') ; Readln (rC) ; Write (' D: ') ; Readln (rD) ;

REPEAT Clrscr ; WritelN ('INTRODUCE LOS EXTREMOS DEL INTERVALO DONDE BUSCAR LA SOLUCION : ') ; Write (' Extremo inferior ........ ') ; Readln (rSegmenBajo) ; Write (' Extremo superior ........ ') ; Readln (rSegmenAlto) ;

IF (rSegmenBajo >= rSegmenAlto) OR      NOT fnboFuncionCambSigno (rA,rB,rC,rD, rSegmenBajo, rSegmenAlto) THEN boError := TRUE ELSE boError := FALSE UNTIL NOT boError ;

boFinal := FALSE ; REPEAT ValorMedio (rA, rB, rC, rD, rSegmenBajo, rSegmenAlto, boFinal) ; UNTIL boFinal ;

Clrscr ; Writeln ; Writeln ; Write (' UNA SOLUCION DE LA ECUACION ES : ', rSegmenAlto:6:3) ;

Writeln ; cEspera:= ReadKey ; END. { Fin de SUBPR_37.PAS *) code