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
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.
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:
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
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
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.
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
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
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 :-)
Offline