29Nov/070
Aproximación a integrales con la regla de Simpson en Pascal
Actualización: Se recomienda leer la entrada Revisión de la regla de Simpson en Pascal terminada la presente.
Pasada ya la fecha de entrega del examen domiciliario de Lab. de computación I de la ORT, voy a ventilar el código por el cual obtuve un "Muy bien Diez! Sobresaliente!!" con carita feliz.
El examen se conformaba por un ejercicio en donde había que calcular la superficie que formaba una función cuadrática y el eje de las Xs utilizando la regla de Simpson.
En respuesta, aquí viene el código Pascalino para un programa que pide la función cuadrádica de la cual, si tiene raices, calculará su superficie con el margen de error que le indiquemos:
Program SimpsonV1;
Uses
Crt;
Var
a, b, c : real;
x1, x2 : real;
RadicandoB4AC : real; { Cálculo intermedio de Raiz(b^2 - 4*a*c) }
BaseTotal : real; { Base de la figura formada por la parábola y el eje x (x2-x1) }
Precision, i : integer;
BaseParcial : real;
x, Altura : real;
SupAnt, SupFin : real;
MargenError : real;
Begin
Precision := 1; { Inicializo en 1 la cantidad de rectángulos a procesar }
ClrScr;
WriteLn('f(x) = Ax^2 + Bx + C');
Repeat { Solicito margen de error válido }
Write('Ingrese margen de error (entre 0 y 100): ');
ReadLn(MargenError);
Until ((MargenError > 0) and (MargenError < 100));
Write('Ingrese A: ');
ReadLn(a);
Write('Ingrese B: ');
ReadLn(b);
Write('Ingrese C: ');
ReadLn(c);
WriteLn('y = (',a:4:6,')x^2 + (',b:4:6,')x + ', c:4:6); { Muestro la fórmula a utilizar }
WriteLn;
RadicandoB4AC := sqr(b) - (4 * a * c);
If RadicandoB4AC > 0 Then { Si RadicandoB4AC es positiva continúo }
Begin
x1 := ((b * -1) + sqrt(RadicandoB4AC)) / (2 * a);
x2 := ((b * -1) - sqrt(RadicandoB4AC)) / (2 * a);
BaseTotal := x2 - x1;
MargenError := MargenError / 100;
Repeat
inc(Precision);
BaseParcial := BaseTotal / Precision;
x := x1;
SupAnt := SupFin;
SupFin := 0;
For i := 1 To Precision Do
Begin
x := x + BaseParcial;
Altura := (a * sqr(x)) + (b * x) + c;
SupFin := SupFin + (BaseParcial * Altura);
End;
Until (abs(SupFin - SupAnt) < MargenError);
WriteLn('Las raices son: x1 = ', x1:4:6, ' y x2 = ', x2:4:6);
WriteLn('La superficie es de ', SupFin:4:6, ' unidades cuadradas.');
WriteLn('Se calculo en ', Precision - 1, ' pasadas y con ', (MargenError * 100):3:2, '% de error.');
WriteLn('Se usaron ', Precision,' rectangulos de base (DifX) = ', BaseParcial:4:6, ' unidades.');
End
Else
Begin
WriteLn('La funcion no tiene raices.');
WriteLn('No se pueden realizar los calculos solicitados.');
End;
ReadLn;
End.
Espero que les sea útil
Saludos!
No trackbacks yet.