nachopro yendo de la cama a la compu…

11Dec/071

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 :P pero que brinda un resultado correcto :D

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!

Filed under: Uncategorized Leave a comment
Comments (1) Trackbacks (0)
  1. 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?

    …………


Leave a comment


*
Before you submit form:
Human test by Not Captcha

No trackbacks yet.

Pages

Categories

Blogroll

Archive

Meta