Integral v Delphi - poraďte prosím :) – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Integral v Delphi - poraďte prosím :) – Delphi – Fórum – Programujte.comIntegral v Delphi - poraďte prosím :) – Delphi – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Pomeranc
~ Anonymní uživatel
6 příspěvků
29. 5. 2007   #1
-
0
-

Ahoj lidi, potřeboval bych poradit s jedním programem.
Mám zadání:
Napište program pro přibližný výpočet určitého integrálu z funkce

f(x) = arctg(x2+1)/(2+x4)

na intervalu [-2,1] pomocí levé obdélníkové formule, interval rozdělte na N stejně dlouhých úseků. V programu použijte procedury nebo funkce. Program proveďte pro N=10, 100, 1000.

No a nevím jak napsat ten integrál. Funkci jsem si přepsal jako [(1/(sin/cos))(x sqr+1)]/(2+x sqr sqr) ale s tím jak to celé zapsat už si rady nevím. Budu rád za jakoukoliv radu. Díky za pomoc. Pomeranc

Nahlásit jako SPAM
IP: ...–
Reklama
Reklama
Pomeranc
~ Anonymní uživatel
6 příspěvků
29. 5. 2007   #2
-
0
-

Díky, nějak tak podobně jsem uvažoval, ale napsat to v Delphi je po mě druhá věc. :/

Nahlásit jako SPAM
IP: ...–
Pavel
~ Anonymní uživatel
264 příspěvků
29. 5. 2007   #3
-
0
-

V Delphi si napíšeš pár funkcí a máš to :-)

type TInterval = record
a : double;
b : double;
end;

function MojeFunkce(x:double):double;
begin
result := ArcTan(...;
end;

function VratIntegral(Interval: TInterval; N: integer): double;
var dx : double;
X, F, S : double;
begin
if N = 0 then
begin
raise Exception('Pocet kroku musi byt nenulovy');
end;
dx := (Interval.b - Interval.a) / N;
S := 0;
X := Interval.a;
for i := 0 to N-1 do
begin
F := MojeFunkce(X);
S := S + F * dx;
X := X + dx;
end;
result := S;
end;

Pak staci volat funkci VratIntegral pro zadany interval a pocty kroku.

Nahlásit jako SPAM
IP: ...–
Pomeranc
~ Anonymní uživatel
6 příspěvků
29. 5. 2007   #4
-
0
-

Díky, zkusím z toho vyjít, ale některé věci jako raise Exception nebo double jsme nebrali.

Nahlásit jako SPAM
IP: ...–
Pavel
~ Anonymní uživatel
264 příspěvků
29. 5. 2007   #5
-
0
-

Double je typ real, který má větší rozsah.
Exception - vyhodí chybu. Místo toho můžeš třeba vrátit nulu a skončit, je to ošetření hraničního případu.
A nespoléhej se při učení programování jen na to, co vám řeknou ve škole, existuje i nápověda a spousta informací na webu.

Nahlásit jako SPAM
IP: ...–
Petr
~ Anonymní uživatel
696 příspěvků
2. 5. 2009   #6
-
0
-

Ahoj, potřeboval bych aspoň nějak naťuknout ohledně programu na výpočet integrálu odlélníkovou metodou se středními hodnotami. Potřebujem to do školy a tohle je pro mne španělská vesnice, skoro nechápu, jak to funguje a tak, jelikož to učitel moc neumí vysvětlit a asi 9/10 lidí z toho neudělá zápočet. Máme N postupně zvyšovat na dvojnásobek tak, aby přesnost byla na 4 desetinná místa s předem daným výsledek té funkce. Rád bych to dělal sám, jenže i kdybych nad tím seděl do Vánoc, nevymyslím snad nic, tak kdyby se někdo ochotný našel a nějak mi s tím pomohl, byl bych moc rád.
Děkuju moc za ochotu, snad se ještě najdou lidé, kteří pomohou.

Nahlásit jako SPAM
IP: 90.178.218.–
Honzc0
Stálý člen
13. 5. 2009   #7
-
0
-

To Petr
Nejdříve je třeba si uvědomit co znamená výpočet určitého integrálu.
Je to vlastně plocha pod funkcí f(x) v mezích a,b. To je plocha omezená
fcí f(x) a přímkami x=a, x=b a y=0.
Protože integrál je dán předpisem Integrál(f(x0)dx) je zřejmé, že ho můžeme v nějakém přiblížení
nahradit součtem ploch obdélníčků, které mají jednu stranu dlouhou y=f(x) a druhou dx.
(to platí pro obdélníkovou metodu)
Pozn. 1. U lichoběžníkové metody se počítá místo s obdélníky s lichoběžníky.
2.Znak integrálu vznikl "narovnáním" znaku pro sumu (velké řecké sigma)
Pro tvůj případ, kdy máš počítat obdélníkovou metodou se střední hodnotou, počítáš první stranu obdélníka
y0=f(a+dx/2) tj. v polovičce intervalu vzniklého tak, že dx= (b-a)/n, kde n je počet dělení. Délka druhé
strany je pak dx. V cyklu pak projdeš všechny úseky (od 0 do n-1) kdy k předešlému x přičteš dx (x := x+dx)
Takto vypočítáš jednotlivé plochy a ty sečteš a máš přibližnou hodnotu integrálu. (můžeš sčítat přímo v cyklu, S:=S+f(x)*dx)
K druhé otázce, tj. počítání na určitou přesnost (metoda se jmenuje "metoda půlení intervalu")
1. v nějaké opakující se podmínce (while nebo repeat) porovnáváš vypočtenou hodnotu integrálu s tou přesně zadanou
do té doby, dokud absolutní hodnota jejich rozdílu je větší než požadovaná přesnost. (jde to dělat i tak, že počítáš
rozdíl mezi dvěma následujícími hodnotami výpočtu integrálu - to když nemáš zadanou přesnou hodnotu)
2.Vlastní algoritmus metody půlení intervalu.
Začneš s počtem dělení n=1, tj. dx=(b-a)/1.
Vypočítáš integrál a porovnáš ho s danou přesnou hodnotou. Pokud rozdíl bude větší než přesnost zvýšíš počet dělení
na n := 2*n (v druhém kroku tedy bude n=2*1=2, atd.)
Takto pokračuješ v podmíněném cyklu až do doby, kdy rozdíl přesné hodnoty a vypočteného integrálu bude menší
než požadovaná přesnost.
Pozn. U tvého případu je ještě vhodné, pro případ, že bys zadal špatně tu přesnou hodnotu do toho podmíněného cyklu
dát omezení, počtu kroků, aby se podmínka nezacyklila.
Takový malý nástin programu:
Mějme n - počet dělení, x - hodnota (číslo), ve kterém počítáme hodnotu fce f(x),
dx - velikost kroku, vysl-přesná hodnota integrálu, tol - požadovaná přesnost, S - výsledek (hodnota integrálu)
a nadefinovanou funkci function VypHod(x: Extended): Extended; //Funkce pro výpočet hodnoty pro dané x
begin
Result := napsat funkci,která je zadaná (s neznámou x)
end;
Pak pro celý výpočet to může vypadat asi takto:
{vysl := ....; //Zadat přesný výsledek
tol := ...; //Zadat toleranci}
n := 1; //Začínáme s dělením 1 - obdélníková metoda
S := 1035.1234; //Počáteční hodnota integrálu - jenom aby na začátku nebyla splněna podmínka
while (abs(S-vysl)>tol)and(n<100000) do //(n<100000) tam je jenom proto, aby se to
begin //nemohlo zacyklit, když se spleteme s přesnou hodnotou
S := 0;
dx := (b-a)/n;
x := a+dx/2;
for i := 0 to n-1 do //Výpočet integrálu složenou obdelníkovou metodou
begin
S := S+VypHod(x)*dx;
x := x+dx;
end;
n := 2*n;
end;


Nahlásit jako SPAM
IP: 85.207.57.–
Honzc0
Stálý člen
13. 5. 2009   #8
-
0
-

To Petr
V příloze máš program - jak by to mohlo vypadat

Nahlásit jako SPAM
IP: 85.207.57.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

Podobná vlákna

Integrál v delphi — založil lusishka

Poradte mi prosím... — založil Majox

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý