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
Ahoj. Mám menší problém s priebehom funkcie a jej extrémami. Minimum mi program vyhľadá, ale za maximum stále vezme pravú hranicu intervalu, na ktorom chcem priebeh aj extremy zistiť.
procedure maximum; var l,p,max:real; begin p:=pr; l:=la; max:=fx(l); while l<p do begin l:=l+0.001; if fx(l)>fx(l-0.001) then max:=l; end; if (max=la) or (max=p) then writeln ('funkcia nema maximum') else writeln('maximum v bode x=',max:5:2); end;
proceduru pre minimum mam zapisanu v podstate rovnako a funguje. aspoň čo som si stačila všimnúť, a neviem prísť na chybu. a ďalšia otázka, priebeh. je lepšie ísť cez 1. deriváciu alebo prechádzať interval po kúskoch? Skúšala som naprogramovať obe možnosti, ale ani jedna nechcela ísť. vedel by niekto pomôcť?
Offline
Tahle podminka:
if fx(l)>fx(l-0.001) then max:=l;
podle me dela to, ze kdyz ta funkce je v tom bode rostouci, tak na ten bod nastavi maximum. V tom while cyklu postupuje zleva doprava, takze kdyz ta funkce bude rostouci na konci toho intervalu, tak se podle nastavi maximum na ten konec. Jestli mate hledat lokalni maximum, tak by to podle me melo byt spis neco jako:
if ((fx(l)>fx(l-0.001)) and (fx(l)>=fx(l+0.001))) then max:=l;
protoze je potreba zjistit, jestli hodnoty nejenom nalevo jsou mensi, ale take jestli hodnoty napravo od toho bodu jsou mensi.
(Ten program ani vzorec jsem netestoval tak nevim, jestli to nepisu spatne)
Jeste me napadlo, ze tohle:
max:=fx(l);
by mozna melo byt spis:
max:=l;
Nejsem si jisty, jestli mate hledat jen to lokalni maximum, nebo celkove maximum na intervalu (Kdyby to melo byt obecne maximum, tak by to vypadalo jinak), pripadne take - jestli staci najit jen jedno to lokalni maximum, nebo jich tam muze byt vic.
No mozna to pisu zmatene tak kdyztak dej vedet, jestli to pomohlo :-) nebo co si o tom myslis.
Jeste me napada - mozna by to bylo lepsi pres tu derivaci (asi podle toho, jekeho radu muze byt ten polynom), mate zadany nejaky postup, kterym to mate pocitat? Kolik radu muze mit ten polynom?
Offline
tak ono, ide len o lokálne maximum na intervale, čiže tam má hľadať len jednu hodnotu.
ale zistila som, že ak má funkcia maximum, nájde ho, ale za minimum zoberie pravú hranicu intervalu a naopak.ale som rada, že to funguje aspoň takto.
polynóm môže byť hocijakého stupňa, ale tak najviac pracujem s maximálne 5tym stupňom.
záleží na tom, akého stupňa je ?
je to na mne, ako to naprogramujem, ale aj ja si myslím, že cez deriváciu by to mohlo byť lepšie. len vôbec neviem, ako to zapísať
Offline
Polynom 5. stupne muze mit treba 2 maxima, napriklad kdyz se podivas sem: Odkaz, proto jsem se ptal, jakeho muze byt stupne a kolik mate hledat maxim (minim). Ale nevim, jake mate zadani, anebo k cemu ten program potrebujes.
Jeste me napadlo, ze ta podminka, jak tam mas:
if (max=la) or (max=p) then writeln ('funkcia nema maximum') else
Tak nejspis nefunguje, protoze v tom cyklu je:
while l<p do begin
takze 'l' se uvnitr toho cyklu nebude nikdy rovnat 'p' (bude vzdycky akorat mensi - kdyz se bude rovnat nebo bude vetsi, tak uz to skonci), takze i ta promenna 'max' bude vzdycky mensi nez p - proto to nejspis ukazuje maximum na konci intervalu, a nepise to, ze nema zadne maximum. Kdyby se to zmenilo na:
if (max=la) or (max>=p-0.001) then writeln ('funkcia nema maximum') else
tak to podle me bude fungovat (v nekterych pripadech :-) ), ale nezkousel jsem to
Jinak si ale porad myslim, ze kdyz to neupravis jak jsem psal minule, tak to v nekterych pripadech nebude fungovat (treba kdyz na tom intervalu bude zaroven maximum i minimum)
Co se tyce te derivace, tak vis treba, jak naprogramovat samotnou tu derivaci polynomu? (podle vzorce pro derivaci polynomu) Ale pro paty stupen nevim, jestli to s derivaci bude jednodussi, mel jsem na mysli, za kdyby to bylo treba do 3. stupne, tak by se to dalo pocitat normalne pomoci kvadraticke rovnice.
Offline
o tom viem, že môže mať aj dve maximá, ale myslím, že bude stačiť, ak nájde jedno.je to program do školy, ale jedine s týmto neviem pohnúť.
maximum som upravila, funguje.
a už len ten priebeh.
1. deriváciu naprogramovanú mám, takisto funkciu výpočtu hodnoty prvej derivácie fxder-len neviem či dobre. a podľa toho chcem urobiť ten priebeh, ale netuším ako ďalej, mám len toto
if fxder(l)>0 then write('funkcia rastie na intervale: <',l:3:1) else write('funkcia klesa na intervale: <',l:3:1);
teraz by mal ísť cyklus while, zase by mal prechádzať celý interval a vypisovať, kde klesá a kde rastie.
Offline
Ok, tak nejspis vis, co delas :-) upravit to by podle me nebylo slozite.
Tady jsem neco napsal - jak by mohl vypadat ten cyklus: (je to trochu slozitejsi, ale jednoduseji me to nenapadlo)
Offline
prečo je toto? pre obidva to isté?
lastIncreasing := la; lastDecreasing := la;
nefunguje to :(
veľká vďaka za snahu a pomoc, ale mne z toho programu už šibe :D najprv som zistila, že mi zle počíta deriváciu, opravila som to. deriváciu mi už počíta dobre, ale aj tak to nejde.
Offline
Proc je oboji to same - nevim, jak by to melo vypisovat ty intervaly, kde je to rostouci, a kde klesajici, tak jsem si rekl, ze to bude od zacatku toho testovaneho intervalu. Promenne lastIncreasing a lastDecreasing jsem tam dal jako indikatory toho, v jakem poslednim miste byla funkce rostouci anebo klesajici. Pro zacatek je to nastavene oboji proste na zacatek toho intervalu, podrobnejsi vysvetleni by bylo asi dlouhe :-) nevim, jestli to takhle staci.
Jestli jsi prepsala to, co jsem tu psal :-) (a opravila ty syntakticke chyby, co tam byly), tak se omlouvam, ze to nefunguje. Stahnul jsem pascal a vyzkousel to, a v tech vypisech jsem tam mel vymenene lastIncreasing a lastDecreasing. Takhle mi to tak nejak fungovalo:
program Untitled; var x, la, p, lastIncreasing, lastDecreasing: real; var previousSign: integer; function fxder(x:real):real; begin fxder:= 3-x; end; begin la := 0; p := 6; x := la; lastIncreasing := la; lastDecreasing := la; previousSign := 0; while x < p do begin if fxder(x)>0 then begin if previousSign = -1 then writeln('funkcia klesa na intervale: <',lastIncreasing:3:1,',',x:3:1,'>'); previousSign := 1; lastIncreasing := x; end else begin if previousSign = 1 then writeln('funkcia rastie na intervale: <',lastDecreasing:3:1,',',x:3:1,'>'); previousSign := -1; lastDecreasing := x; end; x := x + 0.001; end; if (previousSign = -1) then begin if (lastDecreasing < x - 0.001) then write('funkcia klesa na intervale: <',lastIncreasing:3:1,',',x:3:1,'>'); end else begin if (lastIncreasing < x - 0.001) then write('funkcia rastie na intervale: <',lastDecreasing:3:1,',',x:3:1,'>'); end; readln(); end.
(ten readln() na konci jsem tam dal jenom aby se to zastavilo a byl videt vysledek, jinak to tam nepatri :-) )
Vypsalo mi to:
funkcia rastie na intervale: <0.0,3.0>
funkcia klesa na intervale: <3.0,6.0>
Jestli ti to nefunguje z jineho duvodu, tak kdyztak napis, co to vypisuje, a pripadne muzes poslat, jak vypada ten program (jinak nevim jestli nekdo bude schopny s tim poradit)
Offline
ok toto už nejako pomaly chápem.
a už to funguje, som to zle poprepájala predtým :) len ak je funkcia najprv klesajúca, napíše interval kde klesá a potom aj kde rastie. ale ak je funkcia najprv rastúca, potom už nechce napísať klesajúci interval a pritom potom ešte klesá. tak neviem,ale inak to ide :)
viem že takto cez net sa to ťažko vysvetľuje :) veľmi si mi pomohol, ďakujem pekne :)
Offline
V nejhorsim sem muzes poslat cely ten kod, ale tusim ze to asi nejak zvladnes :-)
Offline