Problem z programem w Ada

0

Witam,
mój problem wygląda następująco. Miałam do napisania program całkowanie numeryczne metodą prostokątów i trapezów. Program napisałam, ale liczy mi złą ilość kroków w metodzie trapezu i nie wiem jak to powinno poprawnie wyglądać. z góry dziękuje jeśli ktoś byłby w stanie mi pomóc. tak wygląda napisany przeze mnie program:

WITH Ada.Text_Io;
USE Ada.Text_Io;
WITH Ada.Float_Text_Io;
USE Ada.Float_Text_Io;
WITH Ada.Integer_Text_IO;
USE Ada.Integer_Text_IO;
WITH Ada.Numerics.Elementary_Functions;
USE Ada.Numerics.Elementary_Functions;

PROCEDURE Calkowanie_Numeryczne IS

-- P : Float;
-- R : Float;
-- S : Float;
A : Float;
B : Float;
H : Float;
Epsilon : Float;
Suma : Float;
Suma2 : Float;
Sumat : Float;
I : Integer; --iteracja 1
I2 : Integer; --iteracja 2
N : Integer; -- liczba podziałów
L1 : Integer; -- liczba wykonywanych operacji metodą trapezów
L2 : Integer; -- liczba wykonywanych operacji metodą prostkątów
FUNCTION Funkcja (X : Float)
RETURN Float IS
Y : Float;
BEGIN
-- Y:=Sin(1.0/X);
RETURN X;
END Funkcja;
BEGIN
---- New_Line;
-- Put("Liczymy calke oznaczona z funkcji: PX^2+RX+S");
-- new_line;
-- Put("podaj p:");
-- Get(P);
-- new_line;
-- Put("podaj r:");
-- Get(R);
-- new_line;
-- Put("podaj s:");
-- Get(S);
-- New_Line;
Put("Nasza funkcja wynosi ");
Put("sin(1/x)");
-- Put(P,1,1,0);Put("X^2"); Put("+"); Put(R,1,1,0); Put("X");Put("+"); Put(S,1,1,0);
New_Line;
Put(" Podaj dolna granice calkowania: ");
Get(A);
New_Line;
Put(" Podaj gorna granice calkowania: ");
Get(B);
New_Line;
Put(" Podaj dokladnosc calkowania: ");
Get(Epsilon);
New_Line;
I:=1;--iterajce
N:=2;---liczba podzialow
H:=(B-A)/Float(N);
Suma:=(B-A)Funkcja(B);
Suma2:=H
(Funkcja(A+H)+Funkcja(B));
WHILE ABS(Suma-Suma2)>=Epsilon LOOP
I:=I+1;
N:=2I;
Suma:=Suma2;
Sumat:=0.0;
FOR I IN 0..(N/2)-1 LOOP
Sumat:=Sumat+Funkcja(A+H/2.0+Float(I)H);
END LOOP;
H:=H/2.0;
Suma2:=Suma2/2.0+H
Sumat;
END LOOP;
New_Line(2);
I2:=1;
N:=2;
H:=(B-A)/Float(N);
Suma:=((B-A)/2.0)(Funkcja(A)+Funkcja(B));
Suma2:=(H/2.0)
(Funkcja(A)+2.0*Funkcja(A+H)+Funkcja(B));
Put("Dla metody prostokatow calka wynosi: ");
Put(Suma2,2,8,0);
New_Line;
WHILE ABS(Suma-Suma2)>=Epsilon LOOP
I2:=I2+1;
N:=2
I2;
Suma:=Suma2;
Sumat:=0.0;
FOR I IN 0..(N/2)-1 LOOP
Sumat:=Sumat+Funkcja(A+H/2.0+Float(I2)H);
END LOOP;
H:=H/2.0;
Suma2:=Suma2/2.0+H
Sumat;

END LOOP;
Put("Dla metody trapezow calka wynosi: ");
Put(Suma2,2,8,0);
New_Line;
Put("Liczba krokow dla metody trapezow ");
Put(I1,1);
New_Line;
Put("Liczba wykonanych krokow dla metody prostokatow ");
Put(L2,1);
New_Line;
Put("lepsza metoda to: ");

IF L1<L2 THEN
Put("metoda trapezowa");

ELSIF L1>L2 THEN
Put ("metoda prostokatow");
ELSIF L1=L2 THEN
Put("Nie ma roznicy, ktora metode wybierzemy");
END IF;

END Calkowanie_Numeryczne;

0
Put("Liczba krokow dla metody trapezow ");
Put(I1,1); -- I1 nie jest nigdzie zadeklarowane imo powinno tu być I
New_Line;
Put("Liczba wykonanych krokow dla metody prostokatow ");
Put(L2,1); -- L2 nie ma przypisanej wartości imo powinno tu być I2
New_Line;

Tak szybko przeglądając to nie używasz zmiennych L1 i L2... zamień wszędzie L1 na I i L2 na I2 i deklaracje skasuj i powinno być git.

0

Dziękuje za pomoc :) Zmieniając tak jak mówisz wydaje mi się, że program liczy liczbe kroków w metodzie trapeza ok :) a wiesz może dlaczego przy metodzie prostokątów wyskakuje mi cały czas liczba kroków 1 nie zważając na to jaką całkę liczy?

0

Wydaje mi się że ten fragment trzeba poprawić

WHILE ABS(Suma-Suma2)>=Epsilon LOOP
I:=I+1;  -- I powinno przyjmować kolejno 2,3,4,5 
N:=2**I;
Suma:=Suma2;
Sumat:=0.0;
FOR I IN 0..(N/2)-1 LOOP -- ale przez ten fragment przyjmuje: 2, (ostatnia wartość fora) itd
0

Adę można tutaj kolorować za pomocą tagu code=ada, np:

WHILE ABS(Suma-Suma2)>=Epsilon LOOP
I:=I+1;  -- I powinno przyjmować kolejno 2,3,4,5

1 użytkowników online, w tym zalogowanych: 0, gości: 1