Základní numerická metoda – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Základní numerická metoda – Pascal – Fórum – Programujte.comZákladní numerická metoda – Pascal – Fórum – Programujte.com

 

atp256
~ Anonymní uživatel
4 příspěvky
6. 12. 2021   #1
-
0
-

Ahoj,

dostal jsem za úkol napsat základní numerickou metodu pro řešení lineární rovnice tak, aby našla všechny kořeny v daném intervalu.

Toto jsem zatím napsal:

       procedure zaklad_num_metoda(X,Y,presnost:real);
         var TEMP:real;
         begin
              TEMP:= X+presnost;
              while(TEMP<Y) and (F(X)*F(TEMP)>0) do begin
                                                          X:=TEMP;
                                                          TEMP:= X+presnost
                                                    end;
              if TEMP>=Y then result:=(X+Y)/2
                         else result:=(X+TEMP)/2
         end;

Takto napsaná procedura mi ale najde pouze jeden kořen z intervalu. Nevěděl byste někdo, jak proceduru upravit tak, aby našla všechny kořeny?

Budu rád za jakoukoli pomoc.   

Nahlásit jako SPAM
IP: 2a00:1028:96d2:cb3a:f462:5448:3cad:4a4...–
Gai
~ Anonymní uživatel
1 příspěvek
6. 12. 2021   #2
-
0
-

Proisť cyklom. Pri každom vypisať koren.

Nahlásit jako SPAM
IP: 138.201.116.–
gna
~ Anonymní uživatel
1891 příspěvků
7. 12. 2021   #3
-
0
-

Já bych řekl, že lineární rovnice má jen jeden kořen.

Ale budiž, toto ti teda najde první vyhovující hodnotu a když chceš hledat dál, tak tu funkci prostě zavolej znova s upraveným intervalem.

Nahlásit jako SPAM
IP: 213.211.51.–
atp256
~ Anonymní uživatel
4 příspěvky
7. 12. 2021   #4
-
0
-

#3 gna
Ta rovnice není lineární, to jsem napsal špatně, omlouvám se. Já bych toho spíše potřeboval docílit úpravou procedury než voláním funkce s upraveným intervalem.

Nahlásit jako SPAM
IP: 2a00:1028:96d2:cb3a:1dad:bc0f:d37:af19...–
peter
~ Anonymní uživatel
4016 příspěvků
8. 12. 2021   #5
-
0
-

Ono, zkopirovat uciteluv priklad nestaci, kdyz zmeni zadani :)
Zkus to napsat sam uplne od zacatku a uvazuj o tom, ze chces vice korenu. My ti samozrejme muzeme kod upravit, ale to je splneni ukolu za tebe a neumel bys to pak uciteli vysvetlit, na coz si oni potrpi, kdyz maji pochyby o tvych schopnostech.
---

Numericke metody spocivaji v tom, ze vyuzivaji rovnosti leve a prave strany rovnice.

0 = 5*x*odm(x) - 2*y - 11
L = 0
P = 5*x*odm(x) - 2*y - 11

To bys mohl resit matematicky. Ale programove to mas rychlejsi, pokud vis, kde zhruba je vrchol nebo vic vrcholu. Prepises si to treba takto 

0 = 5*x*odm(x) - 2*y - 11
2*y + 11 = 5*x*odm(x)
L = 2*y + 11
P = 5*x*odm(x)
L = P ... a, protoze rovnice zachovava rovnost leve a 
prave strany, tak se vysledky musi rovnat nebo byt priblizne stejne

---
To sem odbocil, aby bylo jasne, co se snazis docilit.
Cili, pokud to ma najit vic vrcholu, tak musis pokracovat v hledani. Mel bys mu zadat interval od-do, aby vedel, kdy skoncit. Takze, bud upravis stavajici cyklus, aby prosel vsechny moznosti a nebo mozna jednodussi, udelat dalsi cyklus, co uz zminil Gai. 

presnost = 0.3;
x_start = 1;
x_end = 100;
x_step = 0.1;
cyklus (x_start<x_end)
    x_vysledek = hledej_koren(x_start, x_end, x_step, presnost)
        x = x_start
        L = vypocet_leva(x) // ty vypocty bych dal take jako funkce
        P = vypocet_prava(x)
        cyklus(x<x_end and L-P<presnost)
            x = x + x_step
            L = vypocet_leva(x)
            P = vypocet_prava(x)
        if(L-P<presnost)
            return x
        return 'stop'
    vypis(x_vysledek)
    if (x_vysledek=='stop')
        break;
    x_start = x_vysledek + x_step
Nahlásit jako SPAM
IP: 90.176.141.–
peter
~ Anonymní uživatel
4016 příspěvků
8. 12. 2021   #6
-
0
-

jo, samozrejme tam ma byt vsude absolutni hodnota

abs(L-P) < presnost
Nahlásit jako SPAM
IP: 90.176.141.–
peter
~ Anonymní uživatel
4016 příspěvků
8. 12. 2021   #7
-
0
-

Trochu jsem si s tim hral a prevedl to na javascript, ne pascal. A pocita to teda neco jineho, prusecik. Ale tak jako priklad to muze byt pouzitelne.

https://mlich.zam.slu.cz/js-numericke-metody.htm

zdrojovy kod si zobrazis pres kliknuti pravym tlacitkem - zobrazit zdrojovy kod. Nebo si stranku uloz a otevri v notepadu (poznamkovy blok).

pouzil jsem rovnici, priklad, primo z wolframu https://www.wolframalpha.com/input/?i=x%5E3+-+6x%5E2+%2B+4x+%2B+12

0 = x^3 - 6x^2 + 4x + 12	

ocekavane vysledky:
x1 = -1.0514
x2 = 2.5173
x3 = 4.5341
Nahlásit jako SPAM
IP: 90.176.141.–
atp256
~ Anonymní uživatel
4 příspěvky
9. 12. 2021   #8
-
0
-

Pokusil jsem se proceduru upravit na procházení cyklem:


       procedure zaklad_num_metoda(X,Y,presnost:real);
         var TEMP, vysledek:real;
     
         begin
              TEMP:= X+presnost;
              while F(X)*F(Y)<=0 do begin
                    while(TEMP<Y) and (F(X)*F(TEMP)>0) do begin
                                                               X:=TEMP;
                                                               TEMP:= X+presnost
                                                          end;
                    if TEMP>=Y then vysledek:=(X+Y)/2
                               else vysledek:=(X+TEMP)/2;
    writeln(vysledek);
         end;
 

Mám ale chybu v podmínce prvního cyklu while. Měla by tam být podmínka, za které má rovnice v intervalu řešení. S touto podmínkou to ale nefunguje a nevím, jakou jinou tam mám napsat. Nevěděl byste někdo prosím, jak bych měl podmínku změnit? 

Nahlásit jako SPAM
IP: 2a00:1028:96d2:cb3a:a12c:304b:83b6:650b...–
gna
~ Anonymní uživatel
1891 příspěvků
10. 12. 2021   #9
-
0
-

Chceš projít hodnoty od X do Y a při tom testovat, jestli je hodnota "poblíž" řešení.

procedure hledej(X, Y, presnost: real);
var
    X2: real;
begin
    while X < Y do
    begin
        X2 := X + presnost;
        if (F(X) * F(X2)) <= 0 then
            writeln((X + X2) / 2);
        X := X2;
    end;
end;
Nahlásit jako SPAM
IP: 213.211.51.–
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, 2 hosté

Podobná vlákna

Základní nastavení — založil Vesničan

Základní kalkulačka — založil Boom

Zakladni programovani-pointery — založil Andddrew158

Moderátoři diskuze

 

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