nachopro yendo de la cama a la compu…

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!

Filed under: Uncategorized Leave a comment
Comments (0) Trackbacks (0)

No comments yet.


Leave a comment


Before you submit form:
Human test by Not Captcha

No trackbacks yet.

Pages

Categories

Blogroll

Archive

Meta