Zaloguj się
Blog na Matlab.pl
Forum polskich użytkowników
 
UŻYTKOWNICY GRUPY PROFIL Zaloguj się, by sprawdzić wiadomości FAQ
 



Napisz nowy temat     Odpowiedz do tematu Zobacz poprzedni temat :: Zobacz następny temat

Pętla while - algorytm nie przechodzi do pętli.
Forum MATLAB Strona Główna-> Pozostałe
Post Wysłany: 24 Listopada 2016, Czw 1:48 pm Temat postu: Pętla while - algorytm nie przechodzi do pętli. Odpowiedz z cytatem
 
AUTOR:
Novikzz



Dołączył: 10 Mar 2015
Posty: 2


Ogląda profil użytkownika Wyślij prywatną wiadomość
Witam,
mam problem z moim while'm, a mianowicie podany niżej algorytm nie wykonuje podanej pętli. Czy ktoś może mi powiedzieć co jest przyczyną?

function E = kepeqtne(M,e,tolerance)
if M>-pi & M<0
elseif M>pi
E(1) = M-e;
else
E(1) = M+e;
end
E(2) = E(1)+(M-E(1)+e*sin(E(1))/(1-e*cos(E(1))))


n=1;
while abs( E(n+1)-E(n) ) < tolerance
E(n+1) = E(n)+(M-E(n)+e*sin(E(n))/(1-e*cos(E(n))))
n=n+1;
end


 

Post Wysłany: 24 Listopada 2016, Czw 3:57 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
Łazik
Dość dobry pisarz


Dołączył: 31 Maj 2013
Posty: 94
Skąd: Polska


Ogląda profil użytkownika Wyślij prywatną wiadomość
Czy w warunku while nie powinno być ">" lub ">=" zamiast "<" ?



_________________
cody/players/4345310
 

Post Wysłany: 24 Listopada 2016, Czw 5:29 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
alhambra
Może pisać książki


Dołączył: 05 Sie 2008
Posty: 675


Ogląda profil użytkownika Wyślij prywatną wiadomość
nie powinno byc

n=3;
while abs( E(n-1)-E(n-2) ) < tolerance
E(n) = E(n-1??)+(M-E(n)+e*sin(E(n))/(1-e*cos(E(n))))
n=n+1;
end

jaka jest wartość abs( E(n+1)-E(n) ) na początku pętli?
podaj przykładowe wartości (M,e,tolerance) to sprawdzę u siebie



_________________
Korepetycje z Matlaba, pomoc ....
 

Post Wysłany: 24 Listopada 2016, Czw 6:25 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
Łazik
Dość dobry pisarz


Dołączył: 31 Maj 2013
Posty: 94
Skąd: Polska


Ogląda profil użytkownika Wyślij prywatną wiadomość
alhambra napisał:

Kod:
n=3;
while
abs( E(n-1)-E(n-2) ) < tolerance
E
(n) = E([b]n-1??[/b])+(M-E(n)+e*sin(E(n))/(1-e*cos(E(n))))
n=n+1;
end



To nie ma sensu. W pierwszym wywołaniu pętli odwołujesz się do E(3), które nie istnieje.

Tak czy inaczej obie wersje pętli nie mają prawa działać - z tego samego powodu. Pierwsza "wykrzaczy się" na sprawdzaniu warunku przy drugiej iteracji.

prędzej:
Kod:
n=2;
while
abs( E(n)-E(n-1) ) < tolerance
E
(n+1) = E(n)+(M-E(n)+e*sin(E(n))/(1-e*cos(E(n))));
n=n+1;
end


Skoro jednak w pętli jest błąd, może być błąd również w warunku pętli. Jeśli ciąg "E" ma być zbieżny, znak nierówności należy zamienić. Przy warunku takim jaki jest obecnie dla danych wejściowych (1, 0, 0.001) poprawiona funkcja wejdzie w nieskończoną pętlę.

Kolejnym mankamentem jest brak zdefiniowania E(1) w przypadku M>-pi & M<0. Wtedy funkcja zwraca błąd przy definiowaniu E(2). Jeśli funkcja ma zwrócić błąd warto go zdefiniować wpisując chociażby : error('blad funkcji "kepeqtne": niepoprawne dane wejscia')

Kiedy już funkcja zadziała, warto wprowadzić limit ilości iteracji. Nie dla wszystkich warunków początkowych obliczenia muszą się kiedykolwiek zakończyć. Kilka zmian w kodzie i będzie on znacznie szybszy. Wtedy należy zdefiniować E = zeros(1, limit); i jeśli pętla zakończy się wcześniej, zwrócić jedynie wartości od 1 do n.

Jak zawsze, w kodzie przydałyby się komentarze.



_________________
cody/players/4345310
 

Post Wysłany: 24 Listopada 2016, Czw 9:55 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
Novikz



Dołączył: 10 Mar 2015
Posty: 1


Ogląda profil użytkownika Wyślij prywatną wiadomość
Dziękuje za szybką odpowiedź.

Warunki początkowe dla funkcji to:
M = -150.476867;
e = 0.048485;
tolerance = 10^(-8);

Wynikiem, który funkcja ma zwrócić to wynik bardzo zbliżony do -147.65009, ponieważ funkcja zwraca przybliżenie. Zmiana znaku w while'u nie pomogła jeżeli chodzi o przepuszczenie przez pętle.

PS: Łazik, jakie zmiany w kodzie usprawniłyby szybkość działania? Czy jesteś w stanie skorygować skrypt?

Oto implementowany algorytm

Zdjęcia

http://pokazywarka.pl/kovih6/


 

Post Wysłany: 18 Styczenia 2017, Sro 9:14 am Temat postu: Odpowiedz z cytatem
 
AUTOR:
mrekral



Dołączył: 18 Sty 2017
Posty: 3


Ogląda profil użytkownika Wyślij prywatną wiadomość
O kurcze dzięki, właśnie tego szukałem Smile


 

Forum MATLAB Strona Główna-> Pozostałe
Wyświetl posty z ostatnich:   

Napisz nowy temat     Odpowiedz do tematu Zobacz poprzedni temat :: Zobacz następny temat

Wszystkie czasy w strefie CET (Europa)

Skocz do:  

Statystyki forum:



Od dnia 08.06.2006 forum odwiedzano 34064011
Najwięcej użytkowników 266 było obecnych 19 Lutego 2015, Czw 7:03 pm

Aktualnie online:




Najnowsze posty na forum:
Zapis do pliku wektora po DCT obrazu  (22 Styczenia 2017, Nie 11:45 pm)
Zlece prosty projekt w Matlab  (22 Styczenia 2017, Nie 3:52 pm)
Wprowadzanie wlasnej daty  (22 Styczenia 2017, Nie 3:32 pm)
Zadanie  (22 Styczenia 2017, Nie 11:37 am)
Odwracanie macierzy, pomocy  (20 Styczenia 2017, Pią 9:20 pm)
[Matlab] odwracanie macierzy  (20 Styczenia 2017, Pią 9:17 pm)
Zamiana zmiennych globalnych na zmienne lokalne  (20 Styczenia 2017, Pią 4:57 pm)
[Scilab] interpolacja wielomianem Hermite'a  (19 Styczenia 2017, Czw 8:24 pm)
Metoda Gaussa-Jordana  (19 Styczenia 2017, Czw 7:20 pm)
Obliczenia za pomocą punktu KKT/Mnożnik Lagrange'a  (19 Styczenia 2017, Czw 6:54 pm)
Twoje prawa:
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Nie możesz ściągać plików na tym forum