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
Może pisać książki


Dołączył: 31 Maj 2013
Posty: 100
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: 697


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
Może pisać książki


Dołączył: 31 Maj 2013
Posty: 100
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: 4


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



_________________
More about the author
 

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 36038296
Najwięcej użytkowników 266 było obecnych 19 Lutego 2015, Czw 7:03 pm

Aktualnie online:




Najnowsze posty na forum:
Sterowanie wektorowe silnika PMSM  (24 Maj 2017, Sro 12:53 pm)
Zapis obrazu z scope  (23 Maj 2017, Wto 7:05 pm)
Brak funkcji tr3d  (23 Maj 2017, Wto 4:11 pm)
FFT Problem  (23 Maj 2017, Wto 1:12 pm)
Nienawidzę swojej pracy  (23 Maj 2017, Wto 9:52 am)
Modelowanie układu.  (21 Maj 2017, Nie 8:40 pm)
Małe poprawki  (21 Maj 2017, Nie 8:33 pm)
Matlab, a praca?  (21 Maj 2017, Nie 7:56 am)
NADZWYCZAJ nietypowy problem  (21 Maj 2017, Nie 2:14 am)
WYKRESY  (18 Maj 2017, Czw 4:26 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