Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 48892 Skopiuj do schowka 60. Część wspólna 2 odcinków (przedziałów)
Autor Wiadomość
Maciej Gonet
Excel Expert


Posty: 4037
Wysłany: 22-10-2015, 09:04   60. Część wspólna 2 odcinków (przedziałów)

Często pojawia się problem znalezienia części wspólnej 2 odcinków, lub stwierdzenia czy się częściowo lub całkowicie nakładają. Problem może występować również w kontekście czasu.
Ostatnio podobny problem wystąpił w temacie http://www.excelforum.pl/viewtopic.php?t=48876
Opiszę jak ogólniej zmierzyć się z tym problemem.
Załóżmy, że dane są 4 liczby: dwie pierwsze a i b określają początek i koniec pierwszego odcinka, następne c i d opisują drugi odcinek.
Kolejne założenie: jeśli liczby a<b lub c<d to mamy odpowiednio odcinek (przedział) od a do b lub od c do d. W przeciwnym przypadku np. gdy b<a dane te będą oznaczać dopełnienie odcinka od a do b, czyli sumę odcinków od -∞ do b i od a do +∞.
Jeżeli spełnione są warunki a<b i c<d to warunek nakładania się odcinków ma postać:
Kod:
MAX(a; c) < MIN(b; d)
Długość części wspólnej:
Kod:
=MAX(MIN(b; d)- MAX(a; c);0)
Jeżeli spełnione są warunki b<a i c<d to część wspólna może się składać z dwóch części i jej długość wynosi:
Kod:
=MAX(MIN(b; d)- c;0)+ MAX(d - MAX(a; c);0)
Analogicznie jeżeli spełnione są warunki a<b i d<c to część wspólna może się składać z dwóch części i jej długość wynosi:
Kod:
=MAX(MIN(b; d)- a;0)+ MAX(b - MAX(a; c);0)
W czwartym przypadku gdy b<a i d<c wspólna część obejmuje końce osi i jej długość jest nieskończona.
Chociaż funkcje MAX i MIN pozwalają na zwarty i czytelny zapis, to jednak utrudniają przekształcenie formuły w tablicową. Jeżeli potrzebny jest zapis tablicowy, należy zamiast funkcji MAX i MIN użyć dłuższych i mniej czytelnych konstrukcji z funkcjami JEŻELI lub MODUŁ.LICZBY.
Kod:
MAX(a; c)  =  JEŻELI(a<c; c; a)  =  (a+c+MODUŁ.LICZBY(a-c))/2
MIN(b; d)  =  JEŻELI(b<d; b; d)  =  (b+d-MODUŁ.LICZBY(b-d))/2
Sumarycznie długość części wspólnej można zapisać w formie:
Kod:
=JEŻELI(ORAZ(a<b;c<d); MAX(MIN(b; d)- MAX(a; c);0);JEŻELI(a<b; MAX(MIN(b; d)- a;0)+ MAX(b - MAX(a; c);0); JEŻELI(c<d; MAX(MIN(b; d)- c;0)+ MAX(d - MAX(a; c);0);"nieskończona")))
Najczęściej w praktyce będziemy mieli jednak do czynienia tylko z pierwszym, najbardziej typowym przypadkiem.
ID posta: 273946 Skopiuj do schowka
 
 
Bill Szysz 
Excel Expert


Posty: 3240
Wysłany: 27-10-2015, 01:58   

Maciej, z zainteresowaniem przeczytałem ten temat. Niestety nie mogę się zgodzić z zaprezentowanym podejściem. Być może coś mi umknęło lub zostało niedoprecyzowane. Chodzi mi o przypadki a>b i b<a.(również c>d i c<d )
Maciej Gonet napisał/a:
Kolejne założenie: jeśli liczby a<b lub c<d to mamy odpowiednio odcinek (przedział) od a do b lub od c do d. W przeciwnym przypadku np. gdy b<a dane te będą oznaczać dopełnienie odcinka od a do b, czyli sumę odcinków od -∞ do b i od a do +∞.

Wg mnie założenie jest niepoprawne. Określając punkt końcowy (zawsze b lub d jest końcem) na prostej (dla uproszczenia jednowymiarowy układ współrzędnych) określasz tylko zwrot odcinka a jego długość pozostaje bez zmian. Zmienia się tez położenie końca (b lub d) na układzie współrzędnych Można więc powiedzieć że długość ab jest równa ba jednak umiejscowienie odcinka w układzie współrzędnych jest inne. Wynika z tego że zawsze mamy do czynienia z odcinkiem o długości ab jednak inaczej zakotwiczonym w układzie współrzędnych i nieskończona część wspólna nigdy nie wystąpi. Dopełnenie więc od -∞ do b i od a do +∞ jest wg mnie niepoprawnym założeniem.
Proponuję przejść od tych teoretycznych rozważań na grunt praktyki a okaże się znacznie jaśniejsze to o co nieporadnie staram się wytłumaczyć.
Załaczam plik z przykładowymi punktami wyznaczającymi poczatki i końce odcinków w różnej konfiguracji i wynikami Twoich i moich formuł. (dla danych czasowych ale to samo ma zastosowanie dla każdych innych).
Być może coś mi uciekło i doprecyzowanie tego co wyżej napisałeś spowoduje że zmienię zdanie.
Pozdrawiam ;-)

przedziały.xlsx
Pobierz Plik ściągnięto 227 raz(y) 13.41 KB

ID posta: 274333 Skopiuj do schowka
 
 
Maciej Gonet
Excel Expert


Posty: 4037
Wysłany: 29-10-2015, 09:58   

Dziękuję za komentarz. Cieszę się, że temat wzbudził zainteresowanie. Ale widzę, że moja koncepcja jest kontrowersyjna, więc spróbuję wyjaśnić ją dokładniej. Mamy oś współrzędnych i dwie pary liczb (punktów). Każda taka para liczb dzieli oś na 3 części: dwie półproste i jeden odcinek. Jeśli taką parę potraktujemy jak parę nieuporządkowaną (kolejność punktów nie ma znaczenia), to może ona być przypisana do jednego obiektu - naturalna jest interpretacja tej pary jako przedziału (odcinka). To jest jedno możliwe podejście, które preferuje szbill. Jeśli jednak taką parę potraktować jak parę uporządkowaną (kolejność ma znaczenie), to kolejność liczb zawiera dodatkową informację, dzięki której można nadać tej samej parze liczb różną interpretację, zależnie od ich kolejności. I tak jeśli a<b, parę można interpretować jako odcinek (a, b), a jeśli a>b, to można tę parę zinterpretować jako dopełnienie odcinka do prostej (sumę dwu półprostych). Taką interpretację zaproponowałem w swoim tekście. Oba podejścia można stosować i wyprowadzać z nich sensowne wnioski. Wszystko zależy od tego jakie wyniki chcemy uzyskać.
Moją interpretację można porównać z wprowadzeniem liczb ujemnych i zastąpieniem dwu działań – dodawania i odejmowania – jednym dodawaniem z wykorzystaniem liczb ujemnych.
Rozważmy taki przykład: urządzenie jest włączone od chwili a do b (a<b), jednak wystąpiła przerwa w zasilaniu od chwili c do d (c<d). Jak długo urządzenie było zasilane?
Poszukujemy części wspólnej odcinka (a, b) i dopełnienia odcinka (c, d), czyli według mojej koncepcji pary uporządkowanej (d, c). Oczywiście zamiast tego można wprowadzić ideę odejmowania odcinków na wzór odejmowania zbiorów. Moim zdaniem jednak koncepcja części wspólnej jest bardziej przystępna (to oczywiście kwestia gustu).
Nie planowałem wykorzystania mojej koncepcji do obliczeń zegarowych na przełomie doby. To odrębne zagadnienie, wymagające dodatkowych założeń odnośnie synchronizacji początkowych dat, przykładowo gdy jedno urządzenie pracuje od godz. 8 do godz. 24, a drugie od godz. 22 do godz. 11, to jak długo pracują równocześnie? To zadanie bez dodatkowych informacji nie ma jednoznacznego rozwiązania, bo jeśli oba urządzenia zaczynają w tym samym dniu, to wspólny czas pracy to 2 godziny, a jeśli drugie urządzenie zaczyna w dniu wcześniejszym niż pierwsze, to wspólny czas to 3 godziny. Jeśli zaś oba urządzenia pracują w ruchu ciągłym, to na każdą dobę przypada 5 wspólnych godzin.
Jeśli chodzi o przykłady liczbowe podane w pliku załączonym przez szbilla, to niezgodność wyników jest konsekwencją innej interpretacji danych wejściowych. Jeśli potraktujemy dane wejściowe jak parę nieuporządkowaną, to wyniki będą zgodne. Tyle, że zapis moich formuł w takich warunkach jest nieoptymalny.

przedziały_Szbill.xlsx
Pobierz Plik ściągnięto 228 raz(y) 13.55 KB

ID posta: 274663 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
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
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe