Revisión de la regla de Simpson en Pascal
Antes de sintonizar La venganza será terrible y luego de obtener un Diez en mi libreta de estudios, voy a dejarles una revisión mejorada del código de Aproximación a integrales con la regla de Simpson en Pascal que hice hoy antes de presentarme en clase.
Iba de camino a la ORT para el final de Lab. de Computación I cuando, en el aire, me puse a pensar sobre el trabajo que codifiqué y entregué. Noté que no tuve en cuenta si la parábola era cóncava o convexa, y esto es de vital importancia para calcular la superficies de los rectángulos según la regla de Simpson. Es decir, no es lo mismo que la altura sea positiva o negativa ya que en el segundo caso derivaría en un absurdo de superficie negativa.
Pese a esto mi programa funcionaba de pelos ya que si la parábola era convexa, se calculaba una base negativa (diferencia entre x2 y x1), como así también una altura (y) negativa y así se obtenía una superficie positiva ;P
Aunque después de varios testeos, me di cuenta que es mejor así... con lo que sólo hace falta agregar un abs() en dónde se muestra BaseParcial.
Así que aquí les dejo el código que no contempla parábolas convexas
pero que brinda un resultado correcto
Program SimpsonV2;
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) = ', abs(BaseParcial):4:6, ' unidades.');
End
Else
Begin
WriteLn('La funcion no tiene raices.');
WriteLn('No se pueden realizar los calculos solicitados.');
End;
ReadLn;
End.
Saludos!
No trackbacks yet.
December 11th, 2007 - 14:46
de pelos…
te olvidaste de poner que antes tu novia te habia comprado un heladito rico =) y que eso te dio suerte para el 10 =P no?
…………