ID tematu: 48892
|
60. Część wspólna 2 odcinków (przedziałów) |
Autor |
Wiadomość |
Maciej Gonet
Excel Expert
Wersja: Win Office 365
Posty: 10323
|
Wysłany: 22-10-2015, 10: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
|
|
|
|
|
|
|
Bill Szysz
Excel Expert
Wersja: Win Office 365
Posty: 4124
|
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 651 raz(y) 13.41 KB |
|
|
| ID posta:
274333
|
|
|
|
|
|
Maciej Gonet
Excel Expert
Wersja: Win Office 365
Posty: 10323
|
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 644 raz(y) 13.55 KB |
|
|
| ID posta:
274663
|
|
|
|
|
|
|
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
|
|
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
|