Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1

Zdar
Podotýkám, že nestuduju informatiku a programování, takže nepiště věci typu udělej si to sám, budeš to potřebovat, ne opravdu jako stavební inženýr to nikdy potřebovat nebudu
Zde je zadání:
Sestavte podprogram pro výpočet přibližné hodnoty integrálu metodou:
c) obdélníkovou s funkčními hodnotami středními,
pro zadané n, přičemž součástí tohoto podprogramu bude tisk n a In.
Podprogram použijte v programu pro výpočet s přesností =10e-4 pro f(x) z příkladu
3.2.d Boháč – Častová: Základní numerické metody (str. 59, 60).
tohle jsem napsal:
program 2;
{$APPTYPE CONSOLE}
uses
SysUtils,Math;
function F(X:Real):Real;
begin
F:=ln(2+sqrt(x));
end;
function Obs(A,B:Real;N:integer):Real;
var
H,S,X:Real;
I:Integer;
begin
H:=(B-A)/N;
S:=0;
for i:= 1 to n-1 do
begin
X:=A+H/2+(I-1)*H;
S:=S+F(X);
end;
WriteLn('':2,'N = ',N:5,'':5,' VN = ',H*S:8:5,'':9);
Obs:=H*S;
end;
var
A,B,E,VN,VS:Real;
N,I:Integer;
begin
A:=1;
B:=3;
E:=10e-4;
WriteLn;
Write('Zadej N:');
ReadLn(N);
WriteLn;
VN:=Obs(A,B,N);
repeat
VS:=VN;
N:=N*2;
VN:=Obs(A,B,N);
until abs(VN-VS)<E;
WriteLn;
for i:= 1 to 30 do
Write('-');
WriteLn;
WriteLn;
WriteLn('Vysledek integralu = ',VN:8:5);
WriteLn;
WriteLn;
WriteLn('Vysledek ze skript = 2.442980584');
ReadLn;
end.
A bylo mi řečeno, že tam mám hrubou algoritmizační chybu, konkrétně v části, kde začíná 2. funkce - function Obs(A,B......
Díky za ochotu
Offline

Napadlo mě tohle:
function Obs(A,B:Real;N:integer):Real;
var
H,S,X:Real;
I:Integer;
begin
H:=(B-A)/N;
S:=0;
for i:= 1 to n do
begin
X:=A-H/2+I*H;
S:=S+F(X);
end;
WriteLn('':2,'N = ',N:5,'':5,' VN = ',H*S:8:5,'':9);
Obs:=H*S;
end;
Je to takhle možné?
Offline
↑ dobes.pavel:
Já tam vidím toto:
1. ve fci function Obs(A,B:Real;N:integer):Real; má jít I od 1 do N
Také nevím, proč v ní vypisuješ výsledek. (to jenom abys viděl jak se to blíží výsledku?) - to ale můžeš nechat
Tedy
function Obs(A,B:Real;N:integer):Real;
var
H,S,X:Real;
I:Integer;
begin
H:=(B-A)/N;
S:=0;
for i:= 1 to n do
begin
X:=A+H/2+(I-1)*H;
S:=S+F(X);
end;
//WriteLn('':2,'N = ',N:5,'':5,' VN = ',H*S:8:5,'':9);
Obs:=H*S;
end;
2. To že ji máš použít pro výpočet na přesnost znamená, že začneš s N=1, a to postupně zvětšuješ až je přesnost výpočtu jakou požaduješ (můžeš i N zdvojnásobovat - to máš ty, nebo můžeš i o 1, pak N := N+1;)
Pak je tam zbytečné načítání N.
Pokud chceš toleranci psát jako 10^(-4), tak v delphi se to píše 1e-4
Potom by samotné tělo bylo:
var
A,B,E,VN,VS:Real;
N,I:Integer;
begin
A:=1;
B:=3;
E:=1e-4; //spíš bych dal 1e-5
N := 1;
VN:=Obs(A,B,N);
repeat
VS:=VN;
N:=N*2;
VN:=Obs(A,B,N);
until abs(VN-VS)<E;
WriteLn;
for i:= 1 to 30 do
Write('-');
WriteLn;
WriteLn;
WriteLn('Vysledek integralu = ',VN:8:5);
WriteLn;
WriteLn;
WriteLn('Vysledek ze skript = 2.442980584');
ReadLn;
end.
Teď jsem si všimnul, že to N a VN máš vypisovat, tak v bodu 1. tu mou poznámku neber v potaz.
Zkoušel jsem to projet a vychází to dobře.
Pokud to chceš stejně jako ve skriptech tak dej E := 1e-9 a vypisuj VN:11:9
Offline

Da tolerance je daná zadáním, tam netřeba nic měnit
Chyba je podle mojeho cvičícího jen v té funkci Obs....
Takže s definitivní platností tam má být teda tohle?
function Obs(A,B:Real;N:integer):Real;
var
H,S,X:Real;
I:Integer;
begin
H:=(B-A)/N;
S:=0;
for i:= 1 to n do
begin
X:=A+H/2+(I-1)*H;
S:=S+F(X);
end;
//WriteLn('':2,'N = ',N:5,'':5,' VN = ',H*S:8:5,'':9);
Obs:=H*S;
end;
Díky za odpověď
Offline
↑ dobes.pavel:
Ano, pouze je vzhledem k tomu, že máš opravdu vypisovat N a VN ostranit to dvojité lomítko.
Tedy
function Obs(A,B:Real;N:integer):Real;
var
H,S,X:Real;
I:Integer;
begin
H:=(B-A)/N;
S:=0;
for i:= 1 to n do
begin
X:=A+H/2+(I-1)*H;
S:=S+F(X);
end;
WriteLn('':2,'N = ',N:5,'':5,' VN = ',H*S:8:5,'':9);
Obs:=H*S;
end;
Stejně si ovšem myslím toto:
1. přesnost 10e-4 je pouze přesnost na 3 desetinná místa, protože v delphi 10e-4 dá výsledek 0.001. Určitě se vzhledem k zápisu v matematice chce, aby přesnost byla 0.0001, tj. 1e-4.
2. také zadávat potom N je proti logice příkladu v tom, že máš použít vytvořený podprogram pro výpočet. Tedy bych očekával, že začneš pro N=1 (i když v zadání máš napsáno pro zadané N, což nedává logiku, spíš bych očekával pro dané n) a pak budeš dělení zjemňovat až dostaneš výsledek s požadovanou přesností.
3. jestliže je výsledek ve skriptech uveden na 9 desetinných míst, pak nevím proč vám čvicící nezadal přesnost alespoň 1e-9, lépe 1e-10 s výpisem devíti míst.
Offline

Každopádně díky, moc si mi pomohl
Nějaké ty detaily už řešit nebudu, není to můj obor, hned jak dostanu zápočet, tak to úplně vypustím z hlavy
Offline
Stránky: 1