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 01. 05. 2015 12:47

pizzaguy
Zelenáč
Příspěvky: 3
Škola: TUL FS
Pozice: student
Reputace:   
 

Metoda sečen MATLAB

Zdravím, můj problém není tak metoda samotná, nýbrž její provedení v MATLABU. S MATLABEM nejsem zrovna kamarád, na mém oboru se jedná spíše o okrajovou záležitost.

Zadanou rovnici mám řešit metodou sečen, přičemž vstupními parametry jsou 2 okrajové podmínky a tolerance (chyba). Výstupem mají být všechna řešení+graf.

$atan(x) = x^2 - x -1$

Při vytváření skriptu jsem narazil na několik problémů. Rovnice má 2 řešení. To je věc, se kterou jsem se ještě nesetkal (u numerických metod). Pokud by rovnice měla pouze jedno řešení, prostě bych dosadil do vzorce pro metodu sečen.
Pro odhadnutí výsledků jsem si vykreslil graf. Jeden kořen je -0,42 a druhý je 2,04 (přibližně). Proto mě napadlo použít dvě proměnné (xa a xb) a každou definovat pouze tam, kde se mi to hodí (snad je to možné).
Asi takhle:
$xa=<-1;0>$
$xb=<1;3>$
V "normálním matlabu"(command window) by to nebyl problém ale při vytváření skriptu mi to hlásí chybu. To co jsem doteď vytvořil zde raději ani publikovat nebudu, nestojí to za řeč. Programování v PASCALU mi nedělalo sebemenší problém, ale MATLAB to je jiná...
Nečekám celý skript (i když by mi to usnadnilo život). Pokud by byl nějak realizovatelný můj nápad se 2 proměnnými, následně bych už asi dokázal úkol dokončit.
Za každou radu nebo případné odkázání budu moc rád.

Offline

 

#2 01. 05. 2015 18:14

FliegenderZirkus
Příspěvky: 544
Škola: RWTH Aachen
Reputace:   25 
 

Re: Metoda sečen MATLAB

Zdravím,

tvůj nápad podle mě není šťastný. Ke kterému řešení rovnice bude metoda sečen konvergovat záleží na volbě dvou počátečních bodů. Pro některé jejich volby k žádnému řešení ani konvergovat nemusí. Proto bych raději napsal funkci, která za základě volby těch dvou počátečních bodů provede potřebné iterace. Tuhle funkci pak můžeš zavolat dvakrát (nebo vícekrát) a dívat se ke kterému z řešení ta která volba vedla.

Velmi jednoduchá implementace v Matlabu pro fixní počet iterací je třeba tady

http://en.wikipedia.org/wiki/Secant_method

Offline

 

#3 02. 05. 2015 13:01

pizzaguy
Zelenáč
Příspěvky: 3
Škola: TUL FS
Pozice: student
Reputace:   
 

Re: Metoda sečen MATLAB

Určitě díky za odpověď. Oba kořeny už vycházejí jak mají. Teď chci ještě dořešit poslední problém. Potřebuji počítat se zadanou odchylkou e, dejme tomu 0.01. Potřeboval bych zastavit for cyklus po kroku kdy se chyba stane menší než předepsaná odchylka. Není potřeba již řešit funkci takovou, ale zastavení cyklu.
Zadám tedy x(1), x(2), e, a=3.

$for  i=3:a$
   $ x(i) = (x(i-1))-(f(x(i-1))) * ((x(i-1)-x(i-2)) / ((f(x(i-1))-f(x(i-2)))));$
   $ chyba=(abs(x(i)-x(i-1)));$
   $disp(x(i));$
   
   $ if (chyba > e)
        a=a+1;$
       
   $ else
        disp(x(i));$
       
   $ end$

Cykly v MATLABu používám poprvé v životě a trochu se v tom ztrácím. Mějte prosím pochopení, že jsem naprostý amatér co se MATLABu týče. Můj cyklus takto napsaný nefunguje.

Offline

 

#4 02. 05. 2015 16:02 — Editoval FliegenderZirkus (02. 05. 2015 16:03)

FliegenderZirkus
Příspěvky: 544
Škola: RWTH Aachen
Reputace:   25 
 

Re: Metoda sečen MATLAB

1. Každému for a if musí příslušet jedno end. Tobě tam jedno end chybí.
2. Počet provedení for cyklu se určí na začátku a nelze ho změnit v jeho průběhu. Pokud nevíš, kolikrát se má ten blok příkazů provést, tak je potřeba použít cyklus while.
3. Odchyka řešení není rozdíl dvou po sobě jdoucích iterací. Převeď všechny členy původní rovnice na jednu stranu a dosaď nalezení přibližné řešení. Chyba pak bude absolutní hodnota rozdílu tohohle čísla a nuly.

Offline

 

#5 07. 05. 2015 19:27

Eratosthenes
Příspěvky: 2592
Reputace:   132 
 

Re: Metoda sečen MATLAB

ahoj ↑ pizzaguy:

% Metoda Secen
clc
format long
% obrazek pro separaci korenu
f = @(x) atan(x)-x^2+x+1;
x=-2:0.005:6;
osa=zeros(1,length(x));
for i=1:length(x)
    y(i)=f(x(i)); 
end;
figure
grid on
hold on
plot(x,osa,x,y)
% prvni koren v intervalu <-1;0>
a=-1;b=0;
Presnost=5e-7; % koren chci na sest des. mist
Chyba=1;PocetIteraci=0;
while Chyba>Presnost
    PocetIteraci=PocetIteraci+1;
    c=a-f(a)/((f(a)-f(b))/(a-b));
    Chyba=abs(c-a);
    a=c; 
  end;
PocetIteraci
PrvniKoren = c
Chyba
% druhy koren uz si ulov sam :-)


Budoucnost patří aluminiu.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson