Mathematica w Fizyce i nie tylko

https://www.wolfram.com/mathematica/

Automatyczne tłumaczenie (Firefox)

Zacznijmy od AI

Zobaczmy jak działa wykorzystanie AI w Mathematica

Generowanie obrazów używając Open AI

ImageSynthesize["Make cover-image for lecture titled 'Mathematica in Physics and beyond' use professional style",ImageSize->Medium]

Za każdym wykonaniem otrzymujemy inny obrazek. UWAGA: wymaga zewnętrznego serwisu, co może się wiązać z drobnymi opłatami.

Używając Google Gemini (na razie poza Mathematica)

Prompt: “Make catchy image for presentation titled ‘Mathematica in Physics and beyond’”

(*Show[Import["Gemini_Generated_Image_hzi8rthzi8rthzi8.jpg"],ImageSize->Large]*)

Jeszcze jedna próba: “Make catchy image for lecture about Wolfram Mathematica software and its applications for physics students”

(*Show[Import["Gemini_Generated_Image_2rjv9n2rjv9n2rjv.jpg"],ImageSize->Large]*)

Generowanie tekstu

poem=LLMSynthesize["Napisz 13-zgłoskowcem 4-zwrotkowy wiersz o studentach fizyki uczących się programu Mathematica"]

previousPoem="Studenci fizyki, z głowami pełnymi chmur liczbowych,  \nW nocach bezsennych zagłębiają świat cyfrowy.  \nMathematica w dłoniach niczym czarodziejski klucz,  \nProwadzi przez mrowię kodów w coraz dalszy trud.\n\nDzień za dniem walczą z funkcjami i grafów siecią,  \nRównań szum w uszach, światło ekranu zaprzecza.  \nCzasem abstrakcja tak wielka, że myśli się plączą,  \nLecz program je prostuje, jak matematyczny wąż.\n\nLiczą trajektorie, zderzenia praw grawitacji,  \nTworzą wykresy, co w snach tańczą jak wariacje.  \nPoranki witają ich z kubkiem starej herbaty,  \nWygrzebując błędy w kodzie, dążą do zadań daty.\n\nA gdy wreszcie rozjaśni się teoretyczny mrok,  \nWyniki powstają jak świt po ciężkiej nocy krok.  \nChoć czasem wątpią, czy kod znajdzie swój sens w świecie,  \nJednak Mathematica jak mentor prowadzi ich przecie."

Mathematica może przeczytać utworzony wiersz

poem=previousPoem;(*jeśli bez dostępu do Open AI*)

SpeechSynthesize[poem]

(*SpeechSynthesize[previousPoem]*)

Ciekawe aplikacje - “one-liner competition” (140 znaków)
https://blog.wolfram.com/2024/10/30/announcing-the-winners-of-the-2024-one-liner-competition/

Opowieść o studentach

Zadanie: chcemy by sztuczna inteligencja wygenerowała historię o studentach, następnie każdą z linijek przedstawiła na obrazku, a na koniec z pomocą Mathematica skleimy to w wideo z lektorem.

Poniższe polecenie za każdym razem wygeneruje inną historię

aTXT=TextSentences@LLMSynthesize@"6-linijkowa historia o studentach realizujących projekt z fizyki na kursie z programu Mathematica"

Historia wygenerowane wcześniej na wypadek problemu z nawiązaniem połączenia z OpenAI

aTXTprevious={"Grupa studentów fizyki postanowiła wykorzystać program Mathematica do rozwiązania problemu z mechaniki kwantowej.","Po licznych godzinach pracy w bibliotece i intensywnych dyskusjach, algorytm wreszcie zadziałał, generując piękne wykresy funkcji falowej.","Niespodziewanie jednak odkryli, że jedno równanie zawierało błąd, który zniekształcił wyniki.","Sfrustrowani, spędzili całą noc, próbując go naprawić.","Rankiem, przy wtórze wypijanych kaw, udało im się uzyskać poprawne dane.","Projekt zakończyli z sukcesem, zdobywając uznanie profesora i wdzięcznie wspominając intensywne, wspólne godziny pracy."}

(*aTXT=aTXTprevious*)(*jeśli bez dostępu do Open AI*)

aVOICE=SpeechSynthesize/@aTXT(*synteza mowy*)
dtIMG=Duration/@aVOICE(*czas trwania poszczególnych sekwencji*)

imgSYNT=ImageSynthesize[#]&/@aTXT(*synteza obrazów, dość czasochłonne, wymaga zewnętrznego serwisu*)

imgSYNTprevious={,,,,,}

imgSYNT=imgSYNTprevious;(*jeśli bez dostępu do Open AI*)

Generujemy video dla poszczególnych linijek tekstu: obraz + dźwięk o zadanej długości

videoTAB=Table[VideoGenerator[<|"Image"->imgSYNT[[k]],"Audio"->aVOICE[[k]]|>,Duration[aVOICE[[k]]]],{k,Length[imgSYNT]}]

Sklejamy w jeden plik

videoFINAL=VideoJoin[Splice[videoTAB]]

(*Export["video_o_stuntentach.mp4",videoFINAL]*)(*można wyeksportować*)

Czy gdzieś w tym jest fizyka?

Odpowiedź: TAK, a w szczególności narzędzia obliczeniowe

Są przestrzenie wektorowe, przestrzenie wielowymiarowe, zagadnienia optymalizacji

To co jest szczególnego w wektorach, co czyni je tak użytecznymi, to taka reprezentacja umożliwia przełożenie semantycznego podobieństwa postrzeganego przez ludzi na odległość w przestrzeni wektorowej.

Gdy reprezentujemy rzeczywiste obiekty i koncepcje, takie jak obrazy, nagrania audio, artykuły prasowe, profile użytkowników, wzorce pogodowe i poglądy polityczne, jako wektory osadzeń, semantyczne podobieństwo tych obiektów i koncepcji można określić ilościowo na podstawie tego, jak blisko siebie znajdują się one jako punkty w przestrzeniach wektorowych. Reprezentacje wektorów osadzeń nadają się zatem do typowych zadań uczenia maszynowego, takich jak klastrowanie, rekomendacja i klasyfikacja. [źródło: https://www.pinecone.io/learn/vector-embeddings/]

Przykład z bazami semantycznymi

Zaadaptowane od S. Wolfram

(*korzystamy z definicji słów, działa dobrze dla języka angielskiego*)

definicjeSlow=Map[StringRiffle[WordDefinition[#]]->#&,{"dolphin","whale","shark"}]

Funkcja CreateSemanticSearchIndex służy do wyodrębniania cech z tekstu, których można użyć do semantycznego przeszukiwania treści.

Pojęcie “semantyczne” odnosi się do znaczenia. W najszerszym sensie,  “semantyczny” oznacza “dotyczący znaczenia”.

Innymi słowy, funkcja ta analizuje tekst i tworzy jego reprezentację, która uwzględnia znaczenie słów i fraz, a nie tylko ich dosłowne występowanie. Dzięki temu możliwe jest wyszukiwanie informacji w tekście na podstawie ich znaczenia, a nie tylko słów kluczowych.

index=CreateSemanticSearchIndex[definicjeSlow]

Ukryta dla nas jest przestrzeń wektorowa reprezentująca definicje słów

SemanticSearch[index,"a very large sea mammal"]

Domyślnie Mathematica pracuje na liście słów z języka systemowego (u mnie język polski)

Length[WordList[]]
WordList[][[;;50]]

W przypadku języka angielskiego mamy do dyspozycji dużo większą funkcjonalność, np. wybór części mowy, definicje poszczególnych słów, ...

listaSlow=WordList["Noun",Language->"English"];
Length[listaSlow]
listaSlow[[;;20]]

indexNouns=CreateSemanticSearchIndex[Map[StringRiffle[WordDefinition[#]]->#&,listaSlow]](*Teraz tworzymy bazę do przeszukiwania na podstawie definicji rzeczwoników w języku angielskim; to może potrwać kilka minut*)

Wyszukujemy rzeczowniki pasujące do dużego ssaka morskiego.

res1=SemanticSearch[indexNouns,"a very large sea mammal"]

Zobaczmy jak działa tłumaczenie

Użyjmy wbudowanej funkcji by spróbować przetłumaczyć uzyskane słowa

WordTranslation[#,"English"->"Polish"]&/@res1

Skorzystajmy z pomocy AI

res1PLfull=LLMSynthesize["Please translate from English to Polish the following word: "<>#]&/@res1

res1PLprevious={"The Polish translation of the word \"whale\" is \"wieloryb.\"","The word \"cetacean\" in Polish is **\"waleń\"**.","The translation of the word \"seahorse\" to Polish is **\"konik morski\"**.","Sailfish in Polish is \"żaglica\".","The translation of \"dolphin\" into Polish is **delfin**.","The translation of the word \"porpoise\" in Polish is \"morświn.\"","The translation of the word \"walrus\" into Polish is \"mors.\"","The Polish translation of \"crocodile\" is **krokodyl**.","The word \"grampus\" in Polish can be translated as **\"kaszalot\"** when referring to the sperm whale or as **\"grindwal\"** when referring to the Risso's dolphin, another marine mammal sometimes called grampus. Make sure the context of your usage matches either of these translations.","The English word \"narwhal\" can be translated into Polish as \"narwal.\""}

(*bez dostępu do Opan AI*)
res1=res1PLprevious;

(*Bardziej "inteligentne" tłumaczenie przy użyciu Open AI*)
res1PL=LLMSynthesize["Please translate from English to Polish the following word: "<>#<>". As a result return only the translated word."]&/@res1

Mathematica pozwala na korzystanie z bardzo wielu serwisów zewnętrznych (ta baza ciągle rośnie)

Można ściągnąć informacje z Wikipedii

res1ENG2PLwiki=TextSentences[WikipediaData[#,"SummaryPlaintext",Language->{"English"->"Polish"}],5]&/@res1[[;;5]];

Definicje dla pierwszych pięciu “trafień” z listy (res1[[;;5]]), tylko pięć linijek (funkcja TextSentences)

StringRiffle[#]&/@res1ENG2PLwiki;
Column[%]

Ściągnijmy teraz kilka rysunków dotyczących wieloryba ze strony Wikipedii

res1[[1]]
WikipediaData[res1[[1]],"ImageList"][[;;5]]

Wyniki są “interesujące”, ale można je zrozumieć odwiedzając stronę: https://en.wikipedia.org/wiki/Whale

Informacje z WikiData zawierają też liczbę odwiedzin danej strony

(*liczba odwiedzin strony o wielorybach*)
dpagehits=WikipediaData["Whale","DailyPageHits"]

DateListPlot[dpagehits,PlotRange->Full,ImageSize->500]

Z powyższego wykresu wynika, że zainteresowanie wielorybami było największe 21 marca 2016 r., czy wydarzyło się wtedy coś ciekawego?

Ewentualnie:

Inny przykład, wybory prezydenckie w Stanach Zjednoczonych

dpagehits=WikipediaData["United States presidential election","DailyPageHits"]

DateListPlot[dpagehits,PlotRange->Full,ImageSize->500]

W danych występuje wyraźna korelacja o cyklu 4-letnim ;)

Wracając do wektorowej reprezentacji

Wypiszmy odległość kolejnych słów od wprowadzonego zapytania (promptu) “a very large sea mammal”.

SemanticSearch[indexNouns,"a very large sea mammal",{"Label","Distance"}]

Widać, że wieloryb ma najmniejszą odległość, dlatego powyższy prompt zwraca hasło “whale”

ListPlot[Map[Labeled[#Distance,#Label]&,%]]

Działa również dla obrazów

Obrazki zwierząt od S. Wolfram

db=CreateVectorDatabase[{,,,,,},FeatureExtractor->"ImageFeatures"]

A teraz weźmy obrazek spoza bazy

VectorDatabaseSearch[db,]

A teraz jeszcze inny obrazek spoza bazy (zagorskigroup.com/people)

VectorDatabaseSearch[db,]

To o co pytamy ma znaczenie

Algorytm będzie szukał zbliżonego wzorca to tego co ma w rozległej bazie wektorowej.

LLMSynthesize[{"Co jest na tym obrazku?",,"Odpowiedz jednym słowem."}]

LLMSynthesize[{"Co to za obrazek?",,"Odpowiedz jednym słowem."}]

LLMSynthesize[{"Co przedstawia to zdjęcie?",,"Odpowiedz jednym słowem."}]

LLMSynthesize[{"Co przedstawia to zdjęcie?",,"Odpowiedz w kilku zdaniach."}]

LLMSynthesize[{"Co przedstawia to zdjęcie?",,"Odpowiedz w kilkunastu zdaniach."}]

LLMSynthesize[{"Czy możesz zidentyfikować osobę ze zdjęcia?",,"Odpowiedz w kilku zdaniach."}]

Graficzne wyszukiwanie jest możliwe w Google, o to wyniki:

Kolejna ciekawa funkcjonalność

A to już bez użycia AI, jedynie funkcje wbudowane oraz przeszukiwanie sieci (domyślnie Google).

WordCloud[DeleteStopwords[Join@@TextWords/@WebSearch["Marcin Zagórski, UJ","Snippets",MaxItems->20]]]

WordCloud[DeleteStopwords[Join@@TextWords/@WebSearch["Jacek Golak, UJ","Snippets",MaxItems->20]]]

Używanie zmiennych w promptach

Mathematica pozwala na dodawanie dodatkowych informacji w postaci zmiennych, tu przykład odpowiedzi na pytanie czy słońce już wstało.

LLMSynthesize["Powiedz mi tak albo nie, czy słońce już wstało?",LLMEvaluator-><|"Prompts"->LLMPromptGenerator[<|"sunrise"->Sunrise[Today],"sunset"->Sunset[Today],"time"->Now|>&]|>]

Przykład, w którym chatGPT używa narzędzi z Mathematica (GeoElevationData oraz AirTemperatureData).

ChatEvaluate[ChatObject[LLMEvaluator-><|"Tools"-> {LLMTool[{"altimeter","gives the altitude at a location"},{"where"->"Location"},GeoElevationData[#where]&], LLMTool[{"thermometer","gives the current temperature at a location"},{"where"->"Location"},AirTemperatureData[#where]&]}|>],{"what are Krakow's altitude and the current temperature?"}]

Definicja funkcji przez przykład, która będzie zwracać określony typ odpowiedz.

urodziny=LLMExampleFunction[{"Einstein"->"14 March 1879","Pauli"->"April 25, 1900"},"Date"]

urodziny["Smoluchowski"]

Blisko, ale to nie to. Poprawna odpowiedź: 28 maja 1872

(*sprawdzamy w Wikipedii*)
TextSentences[WikipediaData["Marian Smoluchowski","SummaryPlaintext",Language->{"English"->"Polish"}],5]

Zobaczmy, czy potrafimy zmienić naszą funkcję.

urodziny=LLMExampleFunction[{"Albert Einstein"->"14 March 1879","Wolfgang Pauli"->"April 25, 1900"},"Date"]

urodziny["Marian Smoluchowski"]

Teraz już ok.

A teraz zobaczmy czy chatGPT rozwinie dla nas funkcję w szereg

LLMSynthesize["What is the tenth order coefficient of x*Sin[x] Taylor expansion? Give only the result"]

(*wyniki zmieniają się jak w kalejdoskopie ;), czasem (rzadko) wyniki jest poprawny *)
Table[LLMSynthesize["What is the tenth order coefficient of x*Sin[x] Taylor expansion? Give only the result"],5]//TableForm

(*zdefiniujmy narzędzie "LLMTool" liczące dany współczynnik rozwinięcia Taylora*)
series=LLMTool[{"series expand","compute Taylor series of a Wolfram Expression"},
{"input"->"Expression","order"->"Integer","variable"->"Expression"},ToString[Normal@Series[#input,{#variable,0,#order}],InputForm]&]

LLMSynthesize["What is the tenth order coefficient of x*Sin[x] Taylor expansion? Give only the result.","CompletionText",LLMEvaluator->LLMConfiguration[<|"Tools"->series|>]]

Dla wyższych współczynników chatGPT stwierdza, że to 0

LLMSynthesize["What is the 20th order coefficient of x*Sin[x] Taylor expansion? Give only the result"]

Posiłkując się funkcją z Mathematica odpowiedź jest już prawidłowa

LLMSynthesize["What is the 20th order coefficient of x*Sin[x] Taylor expansion? Give only the result.","CompletionText",LLMEvaluator->LLMConfiguration[<|"Tools"->series|>]]

1/Factorial[19]

(*rozwinięcie w szereg*)
Series[x*Sin[x],{x,0,20}]

Przyjrzyjmy się co robi LLMTool:

??LLMTool

Narzędzie LLMTool jest zazwyczaj używane do dostarczania dokładnych odpowiedzi lub aktualnych informacji do dużego modelu językowego (LLM).

Użycie LLMTool modyfikuje prompt LLM, aby wyjaśnić, jak używać narzędzia, co ono robi i jakie są jego argumenty.

Model językowy może użyć narzędzia, określając jego „nazwę” (“name”), która powinna być opisowa w stosunku do rzeczywistej funkcji narzędzia, aby skutecznie wywołać użycie modelu językowego. Dodatkowe szczegóły dotyczące narzędzia można podać w „opisie” (“description”).

Format params oraz fun (funkcji) jest analogiczny do (RefLink[APIFunction, paclet:ref/APIFunction]).

??APIFunction

Co to jest API?

API to skrót od Application Programming Interface. W kontekście programowania API to zestaw reguł i specyfikacji, które pozwalają jednemu programowi komputerowemu na interakcję z innym programem. API definiuje, w jaki sposób programy komunikują się ze sobą, wymieniają dane i współdzielą funkcjonalności.

Można to porównać do kelnera w restauracji (porównanie przez Google Gemini):

  >  Ty, jako klient, jesteś jednym programem.
  >  Kuchnia to inny program, z którym chcesz się skomunikować (np. żeby złożyć zamówienie).
  >  Kelner (API) to pośrednik, który przekazuje Twoje zamówienie do kuchni i przynosi Ci posiłek.

API pozwala programistom na wykorzystanie gotowych funkcji i danych z innych programów, bez konieczności  rozumienia, jak te programy działają wewnętrznie.

Wracając do LLMTool

Co to jest Interpreter?

??Interpreter

Interpreter["Color"]["blue"]

(*Lokalizacja Zamku na Wawelu*)
position=Interpreter["Location"]["Wawel castle"]

(*Pozycja naniesiona na mapę*)
GeoGraphics[GeoMarker@position,ImageSize->Medium,GeoRange->(Quantity[0.2`, "mi", miles, "Miles"])]

(*to samo dla Kampusu UJ*)
position=Interpreter["Location"]["Kampus UJ"]

GeoGraphics[GeoMarker@position,ImageSize->Medium,GeoRange->(QuantityUnit[0.5])]

Dygresja nr 1, korzystamy z Wikipedii

(*odległość zabytków (dokładnie to wpisów w Wikipedii) od Zamku na Wawelu*)
WikipediaData["Wawel Castle","GeoNearbyDataset",MaxItems->15]

Dygresja nr 2, Jesteśmy na Wydziale Fizyki, Astronomii i Informatyki Stosowanej: GeoGraphics to nie tylko Ziemia

GeoGraphics[(Entity["Olympus Mons", Entity["SolarSystemFeature","OlympusMonsMars"], "Entity[\"SolarSystemFeature\", \"OlympusMonsMars\"]", "solar system feature"]),GeoRange->Quantity[400,"Miles"]]

Kratery na piątym co do wielkości księżycu Saturna (Tetyda)

Tworzymy mapę z opisami

{names,coords,sizes}=Transpose[SolarSystemFeatureData[EntityClass["SolarSystemFeature","TethysCrater"],{"CanonicalName","Position","Size"}]];
disks=MapThread[GeoDisk,{coords,sizes/2}];

Podpisy

text=MapThread[Text[Style[SolarSystemFeatureData[{##}[[1]],"Name"],Medium],{##}[[2]],{0,2}]&,{names,coords}];

Mapa kraterów na Tetydzie

GeoGraphics[{GeoStyling[Red,Opacity[.3]],disks, Red,Point[coords],White,text},GeoRange->All,GeoGridLines->True,Frame->True,GeoModel->Entity["PlanetaryMoon","Tethys"],ImageSize->800]

Dygresja 3, przykład użycia w praktyce, wizualizacja liczby uczestników Jagiellońskiego Turnieju Fizycznego

autor: dr Mateusz Łącki
        modyfikacje: MZ

(*zaimportowane lokalizacje szkół uczestników Jagiellońskiego Turnieju Fizycznego jako locs*)

locs={{"34-400","Nowy Targ"},{"20-054","Lublin"},{"33-100","Tarnów"},{"50-209","Wrocław"},{"33-100","Tarnów"},{"31-116","Kraków"},{"33-100","Tarnów"},{"35-010","Rzeszów"},{"27-200","Starachowice"},{"25-033","Kielce"},{"39-200","Dębica"},{"66-400","Gorzów Wielkopolski"},{"81-405","Gdynia"},{"15-840","Białystok"},{"50-370","Wrocław"},{"31-116","Kraków"},{"61-862","Poznań"},{"31-116","Kraków"},{"31-116","Kraków"},{"31-116","Kraków"},{"41-206","Sosnowiec"},{"35-010","Rzeszów"},{"40-097","Katowice"},{"40-097","Katowice"},{"31-116","Kraków"},{"02-010","Warszawa"},{"50-370","Wrocław"},{"25-366","Kielce"},{"31-116","Kraków"},{"31-116","Kraków"},{"11-100","Lidzbark Warmiński"},{"31-116","Kraków"},{"31-116","Kraków"},{"31-116","Kraków"},{"31-128","Kraków"},{"35-010","Rzeszów"},{"23-400","Biłgoraj"},{"33-100","Tarnów"},{"39-200","Dębica"},{"25-365","Kielce"},{"43-300","Bielsko-Biała"},{"40-097","Katowice"},{"02-010","Warszawa"},{"35-010","Rzeszów"},{"33-100","Tarnów"},{"60-476","Poznań"},{"31-116","Kraków"},{"20-054","Lublin"},{"61-862","Poznań"},{"02-010","Warszawa"},{"31-128","Kraków"},{"02-010","Warszawa"},{"33-100","Tarnów"},{"20-075","Lublin"},{"22-400","Zamość"},{"35-010","Rzeszów"},{"15-840","Białystok"},{"42-400","Zawiercie"},{"35-010","Rzeszów"},{"15-840","Białystok"},{"25-365","Kielce"},{"44-300","Wodzisław Śląski"},{"15-840","Białystok"},{"31-116","Kraków"},{"33-100","Tarnów"},{"33-100","Tarnów"},{"35-010","Rzeszów"},{"01-884","Warszawa"},{"97-300","Piotrków Trybunalski"},{"31-116","Kraków"},{"31-116","Kraków"},{"02-010","Warszawa"},{"02-010","Warszawa"},{"33-100","Tarnów"},{"15-840","Białystok"},{"31-116","Kraków"},{"33-100","Tarnów"},{"38-400","Krosno"},{"97-300","Piotrków Trybunalski"},{"20-117","Lublin"},{"97-300","Piotrków Trybunalski"},{"20-117","Lublin"},{"97-200","Tomaszów Mazowiecki"},{"97-300","Piotrków Trybunalski"},{"20-054","Lublin"},{"31-116","Kraków"},{"85-014","Bydgoszcz"},{"33-100","Tarnów"},{"15-840","Białystok"},{"40-097","Katowice"},{"33-100","Tarnów"},{"42-600","Tarnowskie Góry"},{"97-300","Piotrków Trybunalski"},{"33-100","Tarnów"},{"61-862","Poznań"},{"97-410","Kleszczów"},{"02-010","Warszawa"},{"40-092","Katowice"},{"35-010","Rzeszów"},{"41-206","Sosnowiec"},{"35-010","Rzeszów"},{"20-054","Lublin"},{"15-840","Białystok"},{"33-100","Tarnów"},{"35-225","Rzeszów"},{"31-948","Kraków"},{"15-840","Białystok"},{"43-300","Bielsko-Biała"},{"33-100","Tarnów"},{"33-100","Tarnów"},{"31-101","Kraków"},{"02-010","Warszawa"},{"97-300","Piotrków Trybunalski"},{"81-405","Gdynia"},{"31-116","Kraków"},{"50-370","Wrocław"},{"34-700","Rabka-Zdrój"},{"33-100","Tarnów"},{"71-413","Szczecin"},{"15-840","Białystok"},{"02-010","Warszawa"},{"35-010","Rzeszów"},{"35-010","Rzeszów"},{"80-842","Gdańsk"},{"31-116","Kraków"},{"31-116","Kraków"},{"02-010","Warszawa"},{"97-300","Piotrków Trybunalski"},{"59-300","Lubin"},{"35-010","Rzeszów"},{"31-116","Kraków"},{"34-400","Nowy Targ"},{"02-010","Warszawa"},{"15-840","Białystok"},{"97-300","Piotrków Trybunalski"},{"61-862","Poznań"},{"37-450","Stalowa Wola"},{"02-520","Warszawa"},{"20-005","Lublin"},{"34-400","Nowy Targ"},{"38-404","Krosno"},{"97-300","Piotrków Trybunalski"},{"34-700","Rabka-Zdrój"},{"02-010","Warszawa"},{"15-840","Białystok"},{"61-845","Poznań"},{"33-100","Tarnów"},{"33-101","Tarnów"},{"26-639","Radom"},{"43-300","Bielsko-Biała"},{"58-500","Jelenia Góra"},{"42-217","Częstochowa"},{"31-531","Kraków"},{"31-531","Kraków"},{"62-800","Kalisz"},{"02-010","Warszawa"}};

assoc=Counts[Map[#[[2]]&,locs]](*tworzy Association, miasto -> ile wystąpień*)

krotn=DeleteDuplicates[Values[assoc]];(*wartości nie powtarzające się*)
krotn[[;;5]](*wypisujemy 5 pierwszych*)
fa[list_,k_]:=Select[list,#[[2]]==k&][[1]](*fukncja szukająca w liście*)

(*doprecyzowanie, że chodzi o Polskę poprawi wyszukiwanie*)
klist=Table[{k,Map[StringRiffle[#[[1]],", "]<>", Poland"&,Select[Map[{fa[locs,#[[1]]],#[[2]]}&,Transpose[{Keys[assoc],Values[assoc]}]],#[[2]]==k&]]},{k,krotn}];
klist=Reverse[SortBy[klist,First]](*wypisujemy listę posortowaną po liczbie uczestników*)

(*tworzymy mapę lokalizacji na podstawie nazwy miast*)
klocs=Map[{#[[1]],Map[FindGeoLocation,#[[2]]]}&,klist];

(*średnica koła jest proporcjonalna do liczby uczestników*)
uczestnicy=GeoListPlot[Map[#[[2]]&,klocs],PlotMarkers->Table[Graphics[{Red,PointSize[.04+0.002*k[[1]]],Point[{0,0}]}],{k,klocs}],PlotLegends->None,GeoZoomLevel->8];

(*mapa Polski*)
polska=GeoListPlot[Entity["Country","Poland"],PlotStyle->Gray];

(*efekt końcowy*)
Show[polska,uczestnicy]

Funkcjonalność Mathematica w różnych dziedzinach związanych z fizyką

https://writings.stephenwolfram.com/2024/07/yet-more-new-ideas-and-new-functions-launching-version-14-1-of-wolfram-language-mathematica/)

Stabilność punktów stałych

??DFixedPoints

Dalej mamy definicję punktu stałego oraz punktu stałego asymptotycznie.

W skrócie, punkt jest stały, jeśli układ zaczynając z punktu x = x* pozostaje w punkcie x*.

DFixedPoints[{
x'[t]==−x[t]+2x[t] y[t],
y'[t]==y[t]−((x[t])^2)−((y[t])^2)},
{x,y},t]

Oto wykres strumieniowy rozwiązań naszych równań, wraz ze znalezionymi punktami stałymi:

StreamPlot[{−x+2x y,y−(x^2)−(y^2)},{x,-1.5,1.5},{y,-.5,1.5},StreamPoints->Fine,Epilog->Style[Point[%],Red,PointSize[Large]]]

Punkty (czerwone kropki) po lewej i prawej stronie są stabilne , tzn.  rozwiązania, które zaczynają się w ich pobliżu, zawsze pozostają w ich pobliżu. 

W przypadku punktów stałych na górze i na dole małe zaburzenie powoduje utratę ich stabilności. Wbudowana funkcja sprawdza to:

DStabilityConditions[{x'[t]==−x[t]+2x[t] y[t],y'[t]==y[t]−((x[t])^2)−((y[t])^2)},{x,y},t]

Bardziej złożone przykłady

Zbiór dodatnio niezmienniczy: Zbiór ten ma specjalną właściwość w odniesieniu do danego układu dynamicznego : jeśli trajektoria układu zaczyna się w tym zbiorze, to pozostaje w nim na zawsze (dla dodatnich wartości czasu) 

W przypadku wahadła bez tarcia, zbiór wszystkich punktów o energii mniejszej od pewnej wartości granicznej jest dodatnio niezmienniczy. Wahadło o energii mniejszej od tej wartości nigdy nie osiągnie punktów o wyższej energii.

Układ strukturalnie stabilny to taki, którego zachowanie jakościowe nie zmienia się znacząco pod wpływem małych perturbacji (zaburzeń). Innymi słowy, jeśli lekko zmienimy parametry układu lub dodamy małe zaburzenia, to układ nadal będzie wykazywał podobne zachowanie, takie jak te same typy punktów stałych i orbit.

Układy strukturalnie stabilne, są odporne na małe zmiany i szumy, a więc bardziej przewidywalne i łatwiejsze do modelowania.

Bifurkacja transkrytyczna to rodzaj bifurkacji, czyli jakościowej zmiany w zachowaniu układu dynamicznego, która występuje, gdy parametr kontrolny przekracza wartość krytyczną. W bifurkacji transkrytycznej dwa punkty stałe “zamieniają się” stabilnością.

Równanie Duffinga to nieliniowe równanie różniczkowe drugiego rzędu, które opisuje oscylator z nieliniową siłą sprężystości.

Wizualizacja powyższych

fields=({{"Zbiór dodatnio niezmienniczy", {y,-x+y(1-x^2-2y^2)}}, {"structurally stable system", {2x+y-x(x^2+y^2),-y-y(x^2+y^2)}}, {"Bifurkacja transkrytyczna", {x^2,-y}}, {"Równanie Duffinga", {y,x-x^3}}});

fieldIcon[f_]:=Image[StreamPlot[f,{x,-3,3},{y,-3,3},Axes->False,Frame->False,StreamPoints->20,StreamStyle->Thick],ImageSize->40]


TabView[Table[Tooltip[fieldIcon[f[[2]]],f[[1]]]->StreamPlot[f[[2]],{x,-3,3},{y,-3,3},StreamScale->0.2,PlotLabel->TraditionalForm[Column@f[[2]]]],{f,fields}]]

Układy dynamiczne z parametrem

Bifurkacja transkrytyczna. Rozważmy układ dynamiczny opisany równaniem:

 (dx/dt)= μx - x²

gdzie :
x - zmienna stanu
μ - parametr kontrolny

Zbadajmy punkty stałe

DStabilityConditions[{x'[t]==μ x[t]-x[t]^2},{x},t]//Simplify

Intuicja fizyka, gdybym miał krajobraz energetyczny o zadanym kształcie

Integrate[-(μ x - x^2),x];(*całkuję z minusem, dlaczego?*)
f[x_,μ_]=%
D[-f[x,μ],x](*sprawdzenie; siła równa się F = -(dE/dx), tylko w oryginalnym problemie mamy ruch przetłumiony, x'[t] == F, zamiast x''[t] == F*)

Table[Plot[f[x,μ],{x,-2,2},PlotRange->{{-2,2},{-1,1}}],{μ,{-1,0,1}}]

Punkty stałe tego układu to x = 0 i x = μ . 

Dla μ < 0, punkt stały x = 0 jest stabilny, a x = μ jest niestabilny.
Dla μ > 0, punkt stały x = 0 jest niestabilny, a x = μ jest stabilny.
Dla μ = 0, oba punkty stałe zlewają się w jeden, który jest pół-stabilny .

Inny przykład z użyciem Region Plot

(*warunki na stabilność punktów stałych*)
DStabilityConditions[
{x'[t]==a  x[t]+y[t],
y'[t]==-x[t]+b y[t]},
{x,y},t]

RegionPlot[%[[1,2]],{a,-5,5},{b,-5,5}]

Ten rodzaj analizy stabilności jest ważny w wielu dziedzinach, w tym w teorii układów dynamicznych, teorii sterowania, mechanice i ekologii obliczeniowej .

Modelowanie mikroukładów elektromechanicznych

MEMS to skrót od Microelectromechanical Systems, co po polsku oznacza mikroukłady elektromechaniczne.

Są to maleńkie urządzenia, które łączą w sobie elementy mechaniczne i elektroniczne. MEMS są często o rozmiarach od kilku mikrometrów do kilku milimetrów.

Zastosowania MEMS są niezwykle szerokie i obejmują wiele dziedzin:

    > Elektronika: akcelerometry w smartfonach (wykrywanie ruchu i orientacji), mikrofony, czujniki ciśnienia, gyroskopy (stabilizacja obrazu), drukarki atramentowe.
    > Motoryzacja: czujniki airbag, systemy kontroli trakcji, czujniki ciśnienia w oponach.
    > Medycyna: implanty medyczne (np. stymulatory serca, pompy insulinowe), laboratoria na chipie (do diagnostyki medycznej), endoskopy.
    > Przemysł: czujniki w urządzeniach przemysłowych, systemy monitorowania stanu maszyn.

Zadajemy fragment geometrii reprezentujący spiralną cewkę indukcyjną, taką jaka może być używana w nowoczesnym urządzeniu MEMS:

Ω=;

Graphics3D[Ω]

W Mathematica

Ω=RegionUnion[Cuboid[{0,0,0},{2,1,1}],Cuboid[{1,1,0},{2,8,1}],Cuboid[{2,7,0},{8,8,1}],Cuboid[{7,7,0},{8,0,1}],Cuboid[{7,0,0},{3,1,1}],Cuboid[{3,1,0},{4,6,1}],Cuboid[{4,6,0},{6,5,1}],Cuboid[{6,5,0},{5,2,1}],Cuboid[{5,2,1},{6,3,1.2}],Cuboid[{5,2,1.2},{10,3,2.2}]]

Graphics3D[Ω]

W Mathematica, będziemy szukać rozwiązania na potencjał elektryczny V(x,y,z), a następnie prąd w cewce, J = - σ ∇V, gdzie σ przewodnictwo właściwe materiału (tutaj miedź)

vars={V[x,y,z],{x,y,z}};
pars=<|"Material"->(Entity["copper", Entity["Element","Copper"], "Entity[\"Element\", \"Copper\"]", "element"])|>;

Warunki brzegowe, źródło prądu po lewej (x == 0), uziemienie po prawej (x == 10)

(Subscript[Γ, source])=ElectricCurrentDensityValue[x==0,vars,pars,<|"Current"->1|>];

(Subscript[Γ, ground])=ElectricPotentialCondition[x==10,vars,pars,<|"ElectricPotential"->0|>];

Definiujemy równanie różniczkowe cząstkowe (PDE - partial differential equation), UWAGA: dla materiałów przewodzących, gdy efekty magnetyczne i indukcyjne są pomijalne.

pde={ElectricCurrentPDEComponent[vars,pars]==(Subscript[Γ, source]),(Subscript[Γ, ground])};

Rozwiązujemy równanie na potencjał

Vfun=NDSolveValue[pde,V,{x,y,z}∈Ω]

Szukamy prądu (przepływu ładunków) wynikającego z różnicy potencjałów.

Jfield=-QuantityMagnitude[pars["Material"]["ElectricalConductivity"]]*Grad[Vfun[x,y,z],{x,y,z}];

Wizualizacja całkowitego prądu.

SliceContourPlot3D[Sqrt[Total[Jfield^2]],{{"XStackedPlanes",10},{"YStackedPlanes",10},{"ZStackedPlanes",5}},{x,y,z}∈Ω,BoxRatios->Automatic,ColorFunction->"TemperatureMap",PlotLegends->Automatic]

Wizualizacja całkowitego prądu. Prąd omija narożniki.

Skończmy również na AI

https://www.nobelprize.org/all-nobel-prizes-2024/

Struktury białek

Hepsyna to białko należące do rodziny proteaz serynowych typu II, o strukturze transbłonowej.  Jej główną funkcją jest aktywacja innych białek poprzez rozcinanie ich w specyficznych miejscach. Funkcja m.in. w krzepnięciu krwi, rozwoju nowotworów, zapłodnieniu, funkcje w nerkach oraz inne

Hepsyna jest wielofunkcyjnym białkiem,  którego  aktywność proteolityczna  wpływa na  różnorodne procesy biologiczne.  Ze względu na  jej  zaangażowanie w  rozwój nowotworów,  hepsyna jest  intensywnie badana  jako potencjalny  cel terapeutyczny  w  leczeniu raka.

(*reprezentuje symbolicznie, pełną strukturę białka/cząsteczki*)
BioMolecule[]

(*Reprezentacja tej cząsteczki zajmuje zbyt dużo miejsca, więc nie jest przechowywana lokalnie*)
Molecule[%]

BioMolecule przechwytuje również „strukturę wyższego rzędu” cząsteczki, na przykład to, jak jest zbudowana z odrębnych łańcuchów, gdzie w nich występują struktury takie jak α-helisy i inne podobne. Na przykład oto dwa łańcuchy (sekwencje biologiczne), które pojawiają się w tym przypadku:

BioMolecule[]["BioSequences"]

α-helisy to powszechne struktury drugorzędowe występujące w białkach. Powstają one w wyniku regularnego zwijania się łańcucha polipeptydowego w prawoskrętną helisę.

A to pozycje α-helis :

BioMolecule[]["Helices"]

Wizualizacja

BioMoleculePlot3D[BioMolecule[]]

Wizualizacja powierzchni dostępnej dla innych cząsteczek.

Renderuje powierzchnię dostępną dla rozpuszczalnika (SAS) cząsteczki. SAS to gładka powierzchnia, która reprezentuje granicę między cząsteczką a otaczającym ją rozpuszczalnikiem, takim jak woda. Ten styl graficzny jest szczególnie przydatny do wizualizacji kształtu i dostępności cząsteczki dla interakcji z innymi cząsteczkami, takimi jak leki lub białka.

BioMoleculePlot3D[BioMolecule[],PlotTheme->"SolventAccessibleSurface"]

A to widok struktury atomowej.

BioMoleculePlot3D[BioMolecule[],PlotTheme->"Tubes",ImageSize->800]

Podsumowanie

Podobnie jak fizykę, programu Mathematica można użyć jako narzędzia do badani otaczającego nas świata.

W dobie dostępu do dużych zbiorów danych oraz integracji różnych nauk, Mathematica pozwala efektywnie eksplorować i używać te zasoby.

Mathematica pozwala realizować bardzo kreatywne projekty.

Integracja Mathematica z AI daje nowe możliwości.