Matematické Fórum

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

#1 14. 05. 2013 17:09

dobes.pavel
Příspěvky: 68
Reputace:   
 

Program v Delphi - kde mám chybu?

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

  • (téma jako vyřešené označil(a) dobes.pavel)

#2 15. 05. 2013 18:25

dobes.pavel
Příspěvky: 68
Reputace:   
 

Re: Program v Delphi - kde mám chybu?

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

 

#3 16. 05. 2013 13:48 — Editoval Honzc (16. 05. 2013 13:57)

Honzc
Příspěvky: 4641
Reputace:   248 
 

Re: Program v Delphi - kde mám chybu?

↑ 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

 

#4 16. 05. 2013 17:02

dobes.pavel
Příspěvky: 68
Reputace:   
 

Re: Program v Delphi - kde mám chybu?

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

 

#5 17. 05. 2013 06:33

Honzc
Příspěvky: 4641
Reputace:   248 
 

Re: Program v Delphi - kde mám chybu?

↑ 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

 

#6 17. 05. 2013 14:06

dobes.pavel
Příspěvky: 68
Reputace:   
 

Re: Program v Delphi - kde mám chybu?

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

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson