Hornerovo schéma – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Hornerovo schéma – Pascal – Fórum – Programujte.comHornerovo schéma – Pascal – Fórum – Programujte.com

 

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

Zdravím, pokud mám vyřešenou metodu půlení intervalu za pomoci použití hornerova schématu, jak jej mám použít samotné, aby fungovalo ?





program ...;
var a: array [0..50]of real;

function Horner (Hc:real; Hn:integer):real;
var i:integer;
b:real;

begin b:=a[0];
for li:= 1 to Hn do b:=Hc*b+a[i];
Horner:=b;
end;



Potřebuju nějak tuto funkci použít k zadávaní hodnot polynomu a jeho následného výpočtu právě tak, jak to Hornerovo schéma "umí". Jsem začátečník a moc si s tím nevím rady. Můžete mi prosím pomoci ? Děkuji.

Nahlásit jako SPAM
IP: 95.85.252.–
Reklama
Reklama
Mircosoft+1
Věrný člen
2. 5. 2011   #2
-
0
-

Hornerovo schéma umí jenom vypočítat hodnotu polynomu, nic víc. Příklad pro polynom 4. stupně:
5*x^4+4*x^3+10*x^2+3*x+15
se dá zapsat jako:
(5*x^3+4*x^2+10*x+3)*x+15
a dále jako:
((5*x^2+4*x+10)*x+3)*x+15
(((5*x+4)*x+10)*x+3)*x+15
((((5)*x+4)*x+10)*x+3)*x+15

Polynom si uložíš do pole: array[0..4] of real=(15,3,10,4,5), ve kterém každý prvek pole představuje koeficient u x s příslušnou mocninou.

Obecně to funguje takhle:
- Zjisti si hodnotu proměnné x, pro kterou chceš hodnotu polynomu počítat.
- Připrav si a vynuluj pomocnou proměnnou, kterou použiješ jako mezivýsledek.
- Cyklus pro i od nejvyšší mocniny x po 1 (v předchozím případě tedy od 4 do 1):
-- Vezmi koeficient u i-té mocniny x (tedy postupně hodnoty 5, 4, 10, 3).
-- Přičti ho k mezivýsledku.
-- Mezivýsledek vynásob x.
-- Jdi na další i.
- K mezivýsledku přičti poslední člen bez x (tedy 15).
- Mezivýsledek teď obsahuje hodnotu polynomu, nahlaš ho jako výsledek.

Ve tvém kódu vidím chybu, že postupuješ přesně obráceně - od nultého koeficientu k poslednímu, takže ti pak vyjde nesmysl (nebo máš v tom poli koeficienty obráceně, což je taky možnost, ale kdo se v tom pak má vyznat). Plus ještě tam máš li místo i.

Jinak je dobré používat výstižnější jména proměnných. Hc, Hn, a, b a Horner mají nulovou vypovídací hodnotu, mnohem čitelnější by bylo x, Stupen, Koeficienty, Mezivysledek a HodnotaPolynomu. Je to sice tvoje věc, ale jestli chceš, aby se v tom vyznali ostatní a byli schopni ti nějak efektivně poradit, měl bys jim to co nejvíc usnadnit ;-).

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Marek.M
~ Anonymní uživatel
5 příspěvků
2. 5. 2011   #3
-
0
-

Děkuji za rady.
Ta chyba je můj omyl, v programu to mám správně. Jsem už zvyklý používat takovéto značení, ale chápu, že je asi méně praktické. Budu-li v budoucnu zde opět žádat o rady, určitě se Vaší připomínkou inspiruji.
Jdu se pokusit o řešení dle vašich rad, nastane-li nějaký problém, asi se opět ozvu, Prozatím díky.

Nahlásit jako SPAM
IP: 95.85.252.–
Marek.M
~ Anonymní uživatel
5 příspěvků
2. 5. 2011   #4
-
0
-

Tak, zkusil jsem něco vytvořit, ale mám problém. Zadám-li konkrétní hodnoty koeficientů u jednotlivých mocnin neznámé x, vše se v pořádku vypočítá. Zadám-li hodnoty koeficientů ručně, vypočíta se výsledná hodnota chybně. Nevím proč, pořád něco přehlížím, už mi to nemyslí... Prosím, pomozte, kde dělám chybu ?


Totot je onen nefunkční program (chybný výpočet)



type
stupen=array[0..20] of real;

var
a,b:stupen;
x,s:real;
n:integer;
d:integer;

procedure horner(var a,b:stupen;var x,s:real; n:integer);
var
i:integer;
begin
b[0]:=a[0];
for i:=1 to n do b[i]:=a[i]+b[i-1]*x;

s:=b[n];
end;

begin
clrscr;
writeln('zadej stupen polynomu');
read(n);

writeln('zadej hodnotu pro x');
readln(x);

for d:= 0 to n do
begin writeln('zadej koeficient pri x^',n-d);
readln(a[n]);
end;


write('hodnota funkce v bode',x:1:0,' je:');
horner(a,b,x,s,n);
writeln(s:6:2);

readln;
end.



Nahradím-li část kódu od zadávání stupně polynomu až po konec cyklu napevno danými hodnotami -


n:=3;
a[0]:=2;
a[1]:=-6;
a[2]:=2;
a[3]:=-1;
x:=3;


vše funguje, tak jak má (správný výpočet hodnoty v bodě x=3). Nejspíš je chyba naprosto triviální, já ji však prostě nevidím.
Můžete mi pomoci ? díky.

Nahlásit jako SPAM
IP: 95.85.252.–
Marek.M
~ Anonymní uživatel
5 příspěvků
2. 5. 2011   #5
-
0
-

Zkratka, zadáli uživatel stejné hodnoty, jako jsou následně níže uvedeny, vyjde naprosto odlišné číslo. a já nechápu proč. Něco mi stále uniká.

Nahlásit jako SPAM
IP: 95.85.252.–
Mircosoft+1
Věrný člen
3. 5. 2011   #6
-
0
-

Máš špatně to zadávání, místo readln(a[n]) by tam mělo být readln(a[d]) (d je řídicí proměnná cyklu, n je konstantní).
Novou verzi Hornera nějak vůbec nechápu, ale to s tímhle nesouvisí.

Jinak - vykat si snad nemusíme, ne? :-)

Nahlásit jako SPAM
IP: 141.202.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Marek.M
~ Anonymní uživatel
5 příspěvků
3. 5. 2011   #7
-
0
-

Jsem to ale trouba, řikám, že mi to nemyslí. Díky moc, už to funguje... =)) jupí.

Nahlásit jako SPAM
IP: 95.85.252.–
Anežka.P
~ Anonymní uživatel
1 příspěvek
28. 4. 2013   #8
-
+1
-
Zajímavé

Ahoj, program jsem naprogramovala, ale nevím si rady jak tam vložit graf té funkce... Poradíte mi prosím, děkuji

Nahlásit jako SPAM
IP: 62.204.237.–
Mircosoft+1
Věrný člen
29. 4. 2013   #9
-
0
-

S čím přesně je problém? S grafikou jako takovou, nebo s přepočty souřadnic bodů na obrazovku?

Grafiku standardně řeší jednotka Graph: Initgraph ji spouští, Closegraph ukončuje, Cleardevice maže obrazovku, Setcolor nastavuje barvu pro kreslení, Putpixel kreslí bod, Moveto posunuje grafický kurzor, Lineto kreslí čáru od kurzoru do nového bodu a zároveň tam posouvá kurzor, Outtext a Outtextxy zobrazují texty (plus hafo dalších funkcí, které asi nevyužiješ). Tohle funguje v TP, BP a snad i FP, ale za ostatní překladače (Delphi apod.) neručím.

Takže dejme tomu, že ti grafika běží. Udělej si cyklus, který do x postupně přiřazuje hodnoty z nějakého vhodného intervalu, pro každé x spočítá y (to umíš, ne?), spočítej, na který pixel se vypočítaný bod promítne, a vybarvi ho. Pro xový směr stačí vynásobit hodnotu nějakým měřítkem (záleží na tom, jak široký interval chceš zobrazit) a přičíst souřadnice počátku (protože na obrazovce x začíná u levého okraje obrazovky a ne uprostřed). Pro yový směr je to podobné, ale navíc je potřeba otočit znaménko, protože y na obrazovce začíná u horního okraje a přibývá směrem dolů. Tedy xobr=počátekx+měřítko*x a yobr=počáteky-měřítko*y. Výsledky je potřeba zaokrouhlit na celé pixely (Round).

Nahlásit jako SPAM
IP: 212.118.224.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Anežka0
Duch
29. 4. 2013   #10
-
0
-

#9 Mircosoft


No právě jsem s grafikou moc nikdy nepracovala, zobrazení natvrdo zadané fce bych dala, ale takhle když to zadávám do programu, až při spuštění, nějak jsem na to nepřišla... 

Takhle nějak jsem dělala program pro přímku, lze z toho také vyjít?:) Děkuji Ti

Program Grafika1;
uses crt,graph;
var gd,gm,     :integer;
        Barva:word;
begin
gd:=9;

gm:=2;

Initgraph(gd,gm,' ');


Barva:=Random(16);
x1:=;  x2:= ;
y1:=;  y2:= ;
SetColor(Barva);


Line(x1,y1,x2,y2); 
SetColor(White);

OutTextXY(x2,y2,'bod');
Delay(100)
until keypressed;

CloseGraph
end.

Nahlásit jako SPAM
IP: 188.122.212.–
Anežka0
Duch
29. 4. 2013   #11
-
0
-

cyklus pro výpočet využije array [0..10] of real? A pak výpočet hodnot, to už právě nevím, když tu funkci vlastně nevím kde ji mám uloženou...

Nahlásit jako SPAM
IP: 188.122.212.–
Mircosoft+1
Věrný člen
30. 4. 2013   #12
-
0
-

Říkala jsi, že program máš naprogramovaný a nejde ti akorát graf. Takže jsem předpokládal, že máš hotovou funkci, které dáš x a ona ti vyplivne y. Jestli ne, tak si tohle vlákno projdi od začátku, už jsme to tam jednou probírali a nechce se mi to samé psát ještě jednou ;-).

Array [0..něco] of real využiješ spíš pro uložení koeficientů toho polynomu, pro kreslení grafu žádné pole nepotřebuješ. Stačí ti jedna proměnná x a případně y. Protože x je reálné číslo, nedá se použít jako řídicí proměnná pro cyklus For, takže to budeš muset obejít jiným typem cyklu, třeba:

x:=LevaMez;
 repeat
 y:=horner(x);
 lineto(round(pocatekx+meritko*x),round(pocateky-meritko*y));
 x:=x+krok;
 until x>=PravaMez;

Ideální by bylo udělat For pro každé x na obrazovce (0..Getmaxy) a k němu zpětně spočítat reálné x pro funkci, ale to můžeme nechat na jindy.

Ten program na kreslení čar ti nebude fungovat, protože mu chybí hodnoty pro proměnné x1, x2, y1 a y2 a taky slovo Repeat, ke kterému je dole Until. Ale grafiku používáš správně, takže vyjít z toho určitě můžeš.

Nahlásit jako SPAM
IP: 212.118.224.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Anežka0
Duch
30. 4. 2013   #13
-
0
-

To už je na mě moc velkej level ... program mi funguje jen bych potřebovala aby výstupem byl i ten graf fce na zadaném intervalu a,b...

Nahlásit jako SPAM
IP: 188.122.212.–
Mircosoft+1
Věrný člen
30. 4. 2013   #14
-
0
-

Program ti funguje? Tak ho sem hoď, ať nemusím hádat jen tak naslepo.

Nahlásit jako SPAM
IP: 212.118.224.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Anežka0
Duch
30. 4. 2013   #15
-
0
-

pošleš mi maila, pošlu ho tam :)

Nahlásit jako SPAM
IP: 62.204.237.–
Mircosoft+1
Věrný člen
30. 4. 2013   #16
-
0
-

Na mail se mi proklikáš přes podpis, ale lepší bude pokračovat tady, ať z toho něco mají i ostatní.

Nahlásit jako SPAM
IP: 212.118.224.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Anežka0
Duch
1. 5. 2013   #17
-
0
-

Tak jsem ti napsala, sem pak hodím hotový program, ať tady nespamuju diskuzy

Nahlásit jako SPAM
IP: 46.229.124.–
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, 6 hostů

Podobná vlákna

Třídní schéma — založil RePRO

Vizualizace schéma db — založil Šťouchal

Hornerova schema — založil Dammit

Moderátoři diskuze

 

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