KodHTML
czwartek, 5 marca 2020
Moja pierwsza próba z obrazami pseudotrójwymiarowymi
Ciekawe, czy ta technologia pozwoli na ułatwienie rozumienia trójwymiarowej struktury cząsteczek?
czwartek, 20 lutego 2020
Zebrane procedury rysowania przekrojów orbitali atomowych
Poniżej zebrałem procedury, które rysują przekroje orbitali atomowych. Interesowało mnie kiedyś, jak to zrobić, ale nie umiałem znaleźć w podręcznikach odpowiednich programów komputerowych. Dzięki temu, że nauczyłem się podstaw programowania na Wydziale Chemicznym Politechniki Śląskiej, byłem w stanie sam takie programiki napisać. W tamtym czasie używałem języka QBASIC. W wydaniu poniżej jest to Small Basic. W procedurach usunąłem wszelkie stałe, które zaciemniają wzory użyte do obliczeń. Zawsze można te stałe dodać, wówczas zmienią się niektóre proporcje rysunków, ale generalnie obraz pozostanie taki sam.
Pierwszy jest orbital (a właściwie jego część kątowa) 3dz2:
Procedura, która znajduje się poniżej umożliwia również narysowanie części kątowych innych orbitali. Wystarczy tylko usunąć znak komentarza (apostrof) przed odpowiednimi wzorami:
'program - Angle part of 2p or 3d orbitals written originally in 1994 (QBASIC)
'Author, Wojciech Szczepankiewicz. Silesian University of Technology
'Gliwice, Poland
'Start of BlockData
GraphicsWindow.BackgroundColor="White"
pi2= 2*Math.Pi
scale = 100
trans_x = 320
trans_y = 210
'End of BlockData
' Main part
For theta = 0 To pi2 Step 0.001
'psi = math.Cos(theta) 'orbital 2px
'psi=math.Sin(theta) 'orbital 2py
'psi=math.Sin(theta)*math.Cos(theta) 'orbital 3dxy
'below - orbital 3dz2
psi=math.Cos(theta)* math.Cos(theta)-2*math.Sin(theta)*math.Sin(theta)
'Calculation of cartesian coordinates from angle data
x = math.Abs(psi)*math.Cos(theta)
y = math.Abs(psi)*math.Sin(theta)
'Fitting screen coordinates
x_screen = x * scale + trans_x
y_screen = y * scale + trans_y
'Plotting set of points
GraphicsWindow.SetPixel(x_screen, y_screen, "Black")
EndFor
GraphicsWindow.DrawText(10,400,"End of plot")
Orbital 2px z rozróżnioną za pomocą kolorów częścią dodatnią i ujemną. Kolor niebieski pokazuje część dodatnią, a czerwony ujemną:
'program orbital 2px, contour plotting
'Author, Wojciech Szczepankiewicz. Silesian University of Technology
'Gliwice, Poland
'Start of BlockData
GraphicsWindow.BackgroundColor="White"
e = 2.7182818 'Natural log base
scale = 50
trans_x = 320
trans_y = 200
psi_value = .123
start_x = -10.5
end_x = 10.5
start_y = -5
end_y = 5
net_step = .02
'End of BlockData
' Main part
For x = start_x To end_x Step net_step
For y = start_y To end_y Step net_step
radius = math.SquareRoot(x * x + y * y)
100 orbital_2p = x*math.Power(e, -radius) 'change 'x' on 'y'
If orbital_2p >= psi_value Then
x_screen = x * scale + trans_x
y_screen = y * scale + trans_y
GraphicsWindow.SetPixel(x_screen, y_screen, "Blue")
EndIf
If orbital_2p <= -psi_value Then
x_screen = x * scale + trans_x
y_screen = y * scale + trans_y
GraphicsWindow.SetPixel(x_screen, y_screen, "Red")
EndIf
EndFor
EndFor
GraphicsWindow.DrawText(10,400,"End of plot")
W celu uzyskania orbitalu 2py wystarczy w wierszu 100 zmienić zmienną x na y.
Orbital 2s uzyskuje się w analogiczny sposób, tyle że funkcja orbitalowa jest inna, ale niezbyt skomplikowana. Rysunek poniżej pokazuje wynik działania odpowiedniego programu:
'program orbital 2s, contour plotting
'Author, Wojciech Szczepankiewicz. Silesian University of Technology
'Gliwice, Poland
'Start of BlockData
GraphicsWindow.BackgroundColor="White"
e = 2.7182818 'Natural log base
scale = 30
trans_x = 320
trans_y = 200
psi_value = .02
start_x = -9.0
end_x = 9.0
start_y = -5.0
end_y = 5.0
net_step = .02
'End of BlockData
' Main part
For x = start_x To end_x Step net_step
For y = start_y To end_y Step net_step
radius = math.SquareRoot(x * x + y * y)
orbital_2s = (2-radius)*math.Power(e, -radius)
If orbital_2s >= psi_value Then
x_screen = x * scale + trans_x
y_screen = y * scale + trans_y
GraphicsWindow.SetPixel(x_screen, y_screen, "Blue")
EndIf
If orbital_2s <= -psi_value Then
x_screen = x * scale + trans_x
y_screen = y * scale + trans_y
GraphicsWindow.SetPixel(x_screen, y_screen, "Red")
EndIf
EndFor
EndFor
GraphicsWindow.DrawText(10,400,"End of plot")
Powinienem zacząć od tego orbitalu, mianowicie 1s, ale niech nie będzie takie to wszystko ułożone. Program daje rysunek koła. Jrst ono niebieskie, gdyż wszystkie wartości tego orbitalu są nieujemne:
'Początek bloku danych dla orbitalu 1s
GraphicsWindow.BackgroundColor="White"
e = 2.7182818 'Podstawa logarytmu naturalnego
scale = 50 'Dopasowanie wielkości rysunku do ekranu
'Ustalenie początku ukł. współrzędnych względem narożnika ekranu
trans_x = 320
trans_y = 200
psi_value = .123 'Przyjęta wartość orbitalu 1s
start_x = -2.5 'Współrzędna x początku przeszukiwania obszaru
end_x = 2.5 'Współrzędna x końca przeszukiwania obszaru
start_y = -5 'Współrzędna y początku przeszukiwania obszaru
end_y = 5 'Współrzędna y końca przeszukiwania obszaru
net_step = .02 'Krok siatki przeszukiwania
'Koniec bloku danych
'Pętla główna
For x = start_x To end_x Step net_step
For y = start_y To end_y Step net_step
'Obl. promienia wodzącego elektronu
radius = math.SquareRoot(x * x + y * y)
'Obl. wartości funkcji psi
orbital_1s = math.Power(e, -radius)
'Warunek postawienia punktu na ekranie
If orbital_1s >= psi_value Then
x_screen = x * scale + trans_x
y_screen = y * scale + trans_y
'Rysowanie punktu na ekranie
GraphicsWindow.SetPixel(x_screen, y_screen, "Blue")
EndIf
EndFor
EndFor
Kolejny to przekrój orbitalu 3dxy. Przekrój na płaszczyźnie xy tworzy cztery "gałęzie" pomiędzy osiami x oraz y:
'program orbital 3dxy, contour plotting
'Author, Wojciech Szczepankiewicz. Silesian University of Technology
'Gliwice, Poland
'Start of BlockData
GraphicsWindow.BackgroundColor="White"
e = 2.7182818 'Natural log base
scale = 50
trans_x = 320
trans_y = 200
psi_value = .123
start_x = -9.0
end_x = 9.0
start_y = -5
end_y = 5
net_step = .02
'End of BlockData
' Main part
For x = start_x To end_x Step net_step
For y = start_y To end_y Step net_step
radius = math.SquareRoot(x * x + y * y)
orbital_3dxy = x*y*math.Power(e, -radius)
If orbital_3dxy >= psi_value Then
x_screen = x * scale + trans_x
y_screen = y * scale + trans_y
GraphicsWindow.SetPixel(x_screen, y_screen, "Blue")
EndIf
If orbital_3dxy <= -psi_value Then
x_screen = x * scale + trans_x
y_screen = y * scale + trans_y
GraphicsWindow.SetPixel(x_screen, y_screen, "Red")
EndIf
EndFor
EndFor
GraphicsWindow.DrawText(10,400,"End of plot")
Orbital 3dx2y2 jest podobny do powyższego, ale jego "gałęzie" znajdują się na osiach i oraz y. Nie daję rysunku, a jedynie tekst programu poniżej:
'program orbital 3dx2-y2, contour plotting
'Author, Wojciech Szczepankiewicz. Silesian University of Technology
'Gliwice, Poland
'Start of BlockData
GraphicsWindow.BackgroundColor="Black"
e = 2.7182818 'Natural log base
scale = 30
trans_x = 320
trans_y = 200
psi_value = .123
start_x = -8.0
end_x = 8.0
start_y = -8
end_y = 8
net_step = .02
'End of BlockData
' Main part
For x = start_x To end_x Step net_step
For y = start_y To end_y Step net_step
radius = math.SquareRoot(x * x + y * y)
orbital_3dx2y2 = (x*x-y*y)*math.Power(e, -radius)
If orbital_3dx2y2 >= psi_value Then
x_screen = x * scale + trans_x
y_screen = y * scale + trans_y
GraphicsWindow.SetPixel(x_screen, y_screen, "Blue")
EndIf
If orbital_3dx2y2 <= -psi_value Then
x_screen = x * scale + trans_x
y_screen = y * scale + trans_y
GraphicsWindow.SetPixel(x_screen, y_screen, "Red")
EndIf
EndFor
EndFor
GraphicsWindow.DrawText(10,400,"End of plot")
Wracam teraz do pierwszego orbitalu, czyli 3dz2, ale w pełnej wersji, czyli razem z częścią radialną:
'program orbital 3dz2, contour plotting
'Author, Wojciech Szczepankiewicz. Silesian University of Technology
'Gliwice, Poland
'Start of BlockData
GraphicsWindow.BackgroundColor="White"
e = 2.7182818 'Natural log base
scale = 30
trans_x = 320
trans_z = 220
psi_value = .123
start_x = -8.0
end_x = 8.0
start_z = -8
end_z = 8
net_step = .02
'End of BlockData
' Main part
For x = start_x To end_x Step net_step
For z = start_z To end_z Step net_step
radius = math.SquareRoot(x * x + z * z)
orbital_3dz2 = (3*z*z-radius*radius)*math.Power(e, -radius)
If orbital_3dz2 >= psi_value Then
x_screen = x * scale + trans_x
y_screen = z * scale + trans_z
GraphicsWindow.SetPixel(x_screen, y_screen, "Blue")
EndIf
If orbital_3dz2 <= -psi_value Then
x_screen = x * scale + trans_x
y_screen = z * scale + trans_z
GraphicsWindow.SetPixel(x_screen, y_screen, "Red")
EndIf
EndFor
EndFor
GraphicsWindow.DrawText(10,400,"End of plot")
Orbitale można również rysować z użyciem współrzędnych biegunowych. Rysunki te wykazują jednak pewną wadę. Im dalej od jągra, tym punktów jest mniej. Tym niemniej i taki sposób rysowania jest możliwy. Poniżej przekrój orbitalu 3s:
'program orbital 3s, contour plotting in polar coordinates
'Author, Wojciech Szczepankiewicz. Silesian University of Technology
'Gliwice, Poland
'Start of BlockData
GraphicsWindow.BackgroundColor="White"
e = 2.7182818 'Natural log base
scale = 40
trans_x = 320
trans_z = 220
psi_value = .123
radius_end = 5
radius_step = 0.01
phi_step=0.01
'End of BlockData
' Main part
For phi = 0 To 2*Math.pi Step phi_step
For radius = 0 To radius_end Step radius_step
orbital_3s = (6-6*radius-6*radius*radius)*math.Power(e, -radius)
If orbital_3s >= psi_value Then
x_screen = (radius*Math.cos(phi)) * scale + trans_x
y_screen = (radius*Math.sin(phi)) * scale + trans_z
GraphicsWindow.SetPixel(x_screen, y_screen, "Blue")
EndIf
If orbital_3s <= -psi_value Then
x_screen = (radius*Math.cos(phi)) * scale + trans_x
y_screen = (radius*Math.sin(phi)) * scale + trans_z
GraphicsWindow.SetPixel(x_screen, y_screen, "Red")
EndIf
EndFor
EndFor
GraphicsWindow.DrawText(10,400,"End of plot")
czwartek, 6 lutego 2020
Przykładowa hybryda orbitali atomowych
Hybrydyzacja to procedura matematyczna, której użył Linus Pauling do wyjaśnienia wyznaczonych doświadczalnie kątów między wiązaniami w prostych cząsteczkach np. metanu, etenu, wody czy amoniaku. Hybrydyzacja to procedura sumowania orbitali, czyli dodawania (i odejmowania oczywiście) funkcji. Zrobił to bo orbitale 2s i 2p dawały dziwaczny obraz wiązań w tych cząsteczkach. Sumy orbitali odtwarzały rozsądnie dane doświadczalne. Jak się sumuje funkcje. Zupełnie prosto. Bierzemy dwie (albo więcej) funkcji i dodajemy je do siebie. Czasem mnożymy je przez współczynniki. To wszystko.
Zrealizujmy praktycznie dodawanie funkcji 2s oraz 2px, ale z pominięciem współczynników, które są konieczne w obliczeniach szczegółowych, ale zaciemniają istotę zagadnienia. Wynik i tak będzie sensowny. Dodawanie realizują programy, których wydruki są na końcu tego wpisu zamieszczony poniżej.
Wynik działania programu z zaznaczeniem na fioletowo części ujemnej orbitalu, a na kolor niebieski części dodatniej.
Proszę o dokonanie doświadczeń z mnożeniem poszczególnych orbitali przez współczynniki, aby zorientować się, co do wpływu wartości tych stałych na kształt hybrydy. Proszę sprawdzić, jak wpływa usunięcie apostrofu sprzed zmiennej orbital3 na orientację "hantli" hybrydy. Czy powstanie wtedy jedno z ramion hybrydy sp2? Jeszcze tylko małe usprawiedliwienie. Wybrałem hybrydę sp, dlatego że bez żadnych kłopotów daje się narysować na płaszczyźnie ekranu. Podobnie jest z hybrydą sp2. Inne hybrydy rozmieszczone są często między osiami (np. hybryda sp3). Rysowanie przekrojów w jednej płaszczyźnie daje mocno zubożony obraz takiej funkcji. W celu uzyskania poprawnych obrazów należy stosować przekroje trójwymiarowe.
Starsza wersja programu w QBASICu:
Starsza wersja programu w QBASICu:
'-------------- poczatek danych
skala = 45
ustawx = 300
ustawy = 230
kontur = .15
startx = -4.2
koniecx = 3.2
starty = -4.2
koniecy = 4.2
boksiatki = .02
'-------------- koniec danych
screen 12
for x = startx to koniecx step boksiatki
for y = starty to koniecy step boksiatki
r = sqr(x * x + y * y)
orbital1 = (2 - r) * exp(-r)
orbital2 = x * exp(-r)
'orbital3 = y * exp(-r)
hybryda = orbital1 + orbital2 '+ orbital3
xekran = x * skala + ustawx
yekran = y * skala + ustawy
if hybryda >= kontur then pset (xekran, yekran), 3
if hybryda <= -kontur then pset (xekran, yekran), 5
next y
next x
Nowsza wersja (2020) programu w SmallBasicu:
dane() for x = startx to koniecx step boksiatki for y = starty to koniecy step boksiatki r = Math.SquareRoot(x * x + y * y) orbital1 = (2 - r) * Math.Power(exp, -r) orbital2 = x * Math.Power(exp, -r) 'orbital3 = y * Math.Power(exp, -r) hybryda = orbital1 + orbital2 '+ orbital3 xekran = x * skala + ustawx yekran = y * skala + ustawy if hybryda >= kontur then GraphicsWindow.SetPixel(xekran, yekran, "blue") ElseIf hybryda <= -kontur then GraphicsWindow.SetPixel(xekran, yekran, "magenta") EndIf EndFor EndFor Sub dane skala = 45 ustawx = 300 ustawy = 230 kontur = .15 startx = -4.2 koniecx = 3.2 starty = -4.2 koniecy = 4.2 boksiatki = .02 exp = 2.71 EndSub
Miałem kiedyś taki pomysł nomenklaturowy, ale mi przeszło (2016)
Propozycja wprowadzenie przedrostka dvo dla kompaktowego określania obecności dwóch różnych podstawników w cząsteczce związku organicznego
Wojciech Szczepankiewicz
Department of Organic Chemistry, Biochemistry and Biotechnology
Silesian University of Technology
Krzywoustego 4
44-100 Gliwice
Poland
Introduction
W pewnych sytuacjach nazewniczych pojawiają się niejednoznaczności ze ścisłym określeniem nazw związków, w których chcemy za pomocą jednego przedrostka określić dwa różne podstawniki podłączone do tej samej cząsteczki macierzystej. Naturalne wydaje się dodanie przedrostka di do wyrazu „podstawionego”. Jednakże taka praktyka rozszerza zakres stosowalności przedrostka di (i ewentualnie bis) na różne podstawniki w sposób niezgodny z założonym znaczeniem, gdyż przedrostki te określają jednakowe podstawniki. Tym niemniej praktyka ta jest stosowana stosunkowo często do kompaktowego określenia dwu różnych podstawników np. w pirolidynach [1,2] benzopiranach [3] laktonach [4], poliacetylenach [5] i w wielu innych przykładach.
Proposition
W celu zwiększenia kompaktowości i poprawienia komunikatywności zapisu, proponuję wprowadzić przedrostek dvo dla określenia sytuacji ogólnej, w której chcemy opisać dwa różne podstawniki za pomocą jednego przedrostka, ale bez konieczności określania ścisłego charakteru tych podstawników. W tym kontekście przedrostek ten jest nadrzędny w stosunku do przedrostka di oraz bis i zawiera ich definicje.
Przedrostek dvo jest charakterystyczny dla niektórych języków słowiańskich i oznacza podwojenie. Wydaje się on łatwy do wypowiedzenia, krótki i niezbyt odbiegający od przedrostka di, choć wystarczająco różny, aby oba przedrostki nie były mylone podczas słuchania wypowiedzi słownych.
Examples
W kontekście przytoczonej literatury należałoby mówić dvopodstawionych pirolidynach, dvopodstawionych benzopiranach itd. W sytuacji, gdy różne podstawniki należą do jednego szeregu homologicznego, albo należą do jednej klasy związków można zasadę uściślić i mówić np. o dvoalkilowanych benzenach (1-etylo-3-metylobenzen), albo dvoalkoksylowanych polieterach, itp. Przykłady można mnożyć.
Caution
Nie wydaje mi się konieczne rozszerzanie tego typu nazewnictwa na trzy i większą liczbę podstawników, że względu na wzrost liczby możliwych kombinacji nazewniczych, np: trzy różne podstawniki albo dwa jednakowe i jeden inny. Albo dla czterech podstawników: cztery różne, trzy jednakowe-jeden inny, albo po dwa jednakowe. Te sytuacje powinny być regulowane dotychczasowymi ustaleniami IUPAC.
Conclusion
Zastosowanie przedrostka dvo powoduje uściślenie tych sytuacji nomenklaturowych, które wymagają kompaktowego określania sytuacji, w której jest konieczne opisywanie wspólnego kontekstu nazewniczego dla dwu różnych podstawników w jednym związku chemicznym.
Literature
1. J. M. Schomaker, S. Bhattachrjee, J. Yan, B. Borthan, J. Am. Chem. Soc.,
3. S. A. Worlikar, T. Kesharwani, T. Yao, R. C. Larock, J. Org. Chem.,
4. S. A. M. T. Hussain, W. D. Ollis, C. Smith, J. F. Stoddart, J. Chem. Soc., Chem. Comm., 1974, 873-874.
poniedziałek, 27 stycznia 2020
Analiza modelu atomu wodoru Gryzińskiego (model swobodnego spadku) - kwiecień 2012
Od jakiegoś czasu ciekawił mnie model atomu wodoru, opracowany przez ś.p. dr. Michała Gryzińskiego. Wyniki pracy dr. Gryzińskiego opisane w książce pt. "Sprawa atomu" były intrygujące. Fizyk zajmujący się fizyką zderzeń w mikroświecie, przedstawił obrazoburczą koncepcję ściśle określonej trajektorii elektronu w atomie wodoru (i innych atomach). Koncepcja ta była oparta o wyniki doświadczeń, które wskazywały, że moment orbitalny elektronów w atomie wodoru jest zerowy. Na tej podstawie można było wywieść, że dobrze pracujący model Bohra musi być fałszywy. W modelu Bohra zakłada się bowiem (niezgodnie z doświadczeniem) niezerowy moment o wartości będącej wielokrotnością stałej Plancka.
Wyprowadzenie równania trajektorii elektronu w atomie wodoru oparte o metodę lagranżjanu oraz metodologię Hamiltona-Jacobiego doprowadziło do zgrabnego wzoru. Trajektoria elektronu we współrzędnych biegunowych została opisana prostym równaniem:
Gdzie rmin jest promieniem przy którym następuje "odbicie" elektronu od jądra ze względu na odpychanie magnetyczne, które jest w tym miejscu większe niż siła przyciągania elektrostatycznego elektronu i protonu. Zagadnienie to jest sednem rozważań Gryzińskiego. Trajektoria ta została nazwana przez Autora radiolą.
Intrygowała mnie ta prosta postać równania opisującego trajektorię elektronu. Równanie, zapisane jak wyżej, dawało we współrzędnych biegunowych jedynie jedno ramię trajektorii elektronu (dla kąta fi zawartego między -pi/3 a pi/3 i dla znormalizowanego rmin):
pozwoliła na odtworzenie trzech ramion radioli (dla k = 0, fi od -pi/3 do pi/3, dla k = 1, fi od pi/3 do pi oraz dla k = 2, fi od pi do 5/3 pi):
W tym miejscu pojawiły się problemy. Trajektorię można opisać za pomocą trzech równań, przy założonych warunkach brzegowych dotyczących kąta we współrzędnych biegunowych. Przyczyną tego stanu rzeczy jest fakt, że trajektoria posiada miejsca nieciągłości. To spostrzeżenie zmartwiło mnie i zmusiło do pogłębionej analizy radioli.
Ramiona krzywej posiadają asymptoty. Oznacza to, że elektron poruszający się wzdłuż jednego ramienia musiałby po dotarciu do miejsca zwrotu (wtedy Ekin=0) "przeskoczyć" na drugie ramię a potem znów przeskoczyć na trzecie ramię aby zbliżyć się do punktu wyjścia. Dopiero kolejny skok w punkcie ekstremalnym spowodowałby znalezienie się elektronu w punkcie wyjścia (czyli zamknięcie orbity).
Wydaje się, że ten szczegół został zaniedbany w opisie radioli. Powstaje sytuacja, w której zamknięcie orbity wymaga założenia przeskoku elektronowego lub jakiegoś ruchu nieradialnego między ramionami. Obie możliwości wydają się niezgodne z ideą Gryzińskiego. Pierwsza, bo ociera się o mechanikę kwantową (a ta podlega niezwykle ostrej krytyce Autora) a druga skutkuje przyjęciem elementów teorii Bohra, która to teoria była uważana przez Autora za błędną. Z impasu tego daje się wybrnąć przez przyjęcie, że elektron porusza się tylko po trajektorii jednego ramienia. W takim wypadku powstało by coś w rodzaju "kolebania" się elektronu od jednego ekstremum do drugiego. Wolno jednak założyć, że elektron spada swobodnie i "próbuje" przejść do następnego ramienia. W tym wypadku wydaje się, że należy się spodziewać precesji trajektorii, którą jakościowo przedstawiłem na rysunku poniżej.:
Gdyby dopuścić taką precesję, ruch elektronu można by opisać nie tylko w postaci presesującej radioli, ale jednocześnie w formie kołowego ruchu orbitalnego. Wydaje mi się (należałoby to udowodnić), że funkcja dystrybucji radialnej takiego ruchu kołowego może mieć maksimum przy wartości promienia pierwszej orbity Bohra (maksymalny promień atomu wodoru Gryzińskiego wynosi dwa promienie Bohra). Gdyby tak było, model Gryzińskiego sprowadziłby się w mocno zawoalowany sposób do modelu Bohra, choć z zerowym momentem orbitalnym. Ten wniosek budzi rozczarowanie i żal.
Od fizyki do chemii (maj 2012)
Wpis ten jest wynikiem swego rodzaju rozczarowania, jakie powstawało w mojej świadomości w ciągu lat przypatrywania się kierunkom rozwoju fizyki. Jestem chemikiem i mam świadomość, że chemia jest nauką fizyczną w tym sensie, że posługuje się tylko i wyłącznie prawami fizyki, tymi prawami, które są fundamentem praw chemii. Spróbuję obrazowo porównać relacje między fizyką i chemią. Jeśli obie te nauki są dorodnym drzewem, to fizyka przypomina korzenie, pień i gałęzie a chemia podobna jest do liści i kwiatów tego drzewa:
![]() |
| Zdjęcie drzewka owocowego z obszaru ekologicznie czystego |
Fizyka zasila chemię odżywczymi sokami teorii. Chemia, poprzez własną metodologię, tworzy rzeczy piękne i potrzebne ludziom, aby podnieść ich poziom i wygodę życia. Ten sielski obrazek zakłóca jednak pewien niepokój. Na poziomie podstawowym chemia jest ciągle klientem teorii fizycznych. Równanie Schrödingera jest podstawą większości rozważań teoretycznych, którymi próbuje się opisać cząsteczki i reakcje chemiczne. Nie twierdzę, że tylko to równanie, bo zawęziłbym pole badawcze chemików, ale na poziomie podstawowym alternatywy, póki co, nie ma.
Sytuacja ta powoduje, że chemia kwitnie, wydaje wspaniałe owoce, które konsumuje nasza cywilizacja. Cykl powtarza się. Tak jak co roku jesteśmy zachwyceni pięknem okwieconych drzew, tak cyklicznie wpadamy w zdumienie i zachwyt nad nowymi osiągnięciami chemii. Gdzie jest więc ten niepokój, skoro wszystko wspaniale funkcjonuje. Pytanie jest proste, co z teorią, co z podstawami fizycznymi. Czyżby mechanika kwantowa powiedziała wszystko na temat chemii, a my - chemicy - powinniśmy tylko szukać nowych dróg i sposobów jej zastosowania. Nowe procedury, nowe funkcje falowe - wszystko nowe, ale w ramach starej, choć urzekającej (nie wszystkich, o ile wiem) teorii kwantowej. Tu właśnie leży powód do niepokoju. Doskonalenie narzędzi i metod jest zajęciem fascynującym, ale czy wpływa na pojawianie się nowych, fundamentalnych odkryć? Czy pozwala na postawienie pytań, które otworzą nowe poziomy wiedzy? Myślę, że nie.
Problem leży w fizyce. Polega on na tym, że nauka ta fascynuje się zjawiskami, które już niewiele mają wspólnego z chemią. Zaawansowana fizyka nakierowana jest na teorie cząstek elementarnych i wydawanie miliardów euro na źle podłączone wtyczki (mógłbym przeprosić za sarkazm, ale tego nie zrobię). Fizyka zdaje się zjadać własny ogon (dodajmy - potwornie drogi ogon). Chemia nie może już oczekiwać nowych, przełomowych idei fizycznych w obszarze badania atomów, cząsteczek i reakcji chemicznych. Chemikom musi wystarczyć mechanika kwantowa. Bez rewolucji w dziedzinie opisu atomów i cząsteczek, chemia będzie (właściwie już jest) nauką dla epigonów. Właściwie już nie nauką, ale przedmiotem wysublimowanych działań rzemieślniczych i artystycznych. Czy jest sposób na przywrócenie chemii statusu nauki odkrywającej fizyczne podstawy świata?
Wierzę, że istnieje pozytywna odpowiedź na powyższe pytanie. Wracając do analogii z drzewem, chciałbym, żeby chemia dołożyła nowe słoje do pnia nauki i spowodowała wzmocnienie korzeni owego wspólnego drzewa. Jak to zrobić? Sprawa jest prosta. Wystarczy wzbudzić wśród chemików potrzebę nowego spojrzenia na fizyczne podstawy własnej nauki. Wystarczy zadać trudne pytania na temat teorii atomu, cząsteczek i reakcji chemicznych i szukać odpowiedzi z zastosowaniem nowej matematyki. Innymi słowy, powinniśmy zastąpić fizyków w domenach, które opuścili w pogoni za sprawdzaniem teorii wszystkiego. Jeśli fizyków to nie interesuje, to powinni się tym zając chemicy - mamy do tego prawo i mamy możliwości. Być może jesteśmy w stanie dołożyć fundamentalną cegiełkę do budowli wiedzy o naszym świecie. Przewiduję, że tak się stanie...
Algorytm rysowania nanorurek o zadanej średnicy oraz długości (wrzesień 2016)
Zainteresował mnie w pewnej chwili następujący problem. Jak narysować nanorurkę? W sieci znajduje się ogromna liczba wspaniałych wizualizacji nanorurek. Chciałem zrobić podobny obrazek, który byłby edytowalny za pomocą popularnych programów do grafiki molekularnej.
Początkowo myślałem, że najłatwiej będzie stworzyć zbiór współrzędnych atomów węgla z wykorzystaniem macierzy Z, czyli zbioru współrzędnych wewnętrznych. Pierwsze próby pokazały, że nie jest to takie proste, jak mi się wydawało. Miałem nie tylko problem z ustaleniem kątów dwuściennych, które organizują skręcenie się płaszczyzny grafenu w rurkę. Nie umiałem zautomatyzować dobudowywania kolejnych elementów nanorurki. Następny pomysł był szczęśliwszy. Zastanawiając układami współrzędnych, wymyśliłem, że nanorurki ładnie można opisać za pomocą walcowego układu współrzędnych. Poszedłem w tym kierunku i po kilku godzinach miałem program, który liczył współrzędne atomów węgla nanorurki. Algorytm napisany w VBA ma postać:
Sub rurka()
Pi = 3.14159265358979
ro = 1.984638463 'dla dziesięciokąta promień nanorurki
'ro = 3.21414489359589 'dla szesnastokąta
'ro = 4.538637648 'dla dwudziestokąta
lat_w_warstwie = 10 'liczba atomów w warstwie
krokfi = 2 * Pi / lat_w_warstwie 'krok zmiany kąta we współrzednych walcowych
l_warstw = 20 'liczba warstw
lat = lat_w_warstwie * l_warstw 'całkowita liczba atomów tworząctych nanorurkę
h = 0.71 'różnica współrzędnej z w warstwie
fi = 0 'początkowy kąt wsp. walcowych
Cells(1, 1) = lat 'zapis liczby atomów w arkuszu
przesuniecie = h + 1.42
a = 0
For J = 1 To l_warstw
fi = a * krokfi
z_warstwa = a * przesuniecie
For i = 1 To lat_w_warstwie
x = ro * Cos(fi)
y = ro * Sin(fi)
If Int(i / 2) <> i / 2 Then 'rysowanie "zygzaka" w warstwie
Z = z_warstwa + h
Else
Z = z_warstwa
End If
Cells(i + a * lat_w_warstwie + 2, 1) = "C" 'zapis symboli w i współrzędnych do arkusza
Cells(i + a * lat_w_warstwie + 2, 2) = x
Cells(i + a * lat_w_warstwie + 2, 3) = y
Cells(i + a * lat_w_warstwie + 2, 4) = Z
fi = fi + krokfi
Next i
a = a + 1
Next J
End Sub
Sub rurka()
Pi = 3.14159265358979
ro = 1.984638463 'dla dziesięciokąta promień nanorurki
'ro = 3.21414489359589 'dla szesnastokąta
'ro = 4.538637648 'dla dwudziestokąta
lat_w_warstwie = 10 'liczba atomów w warstwie
krokfi = 2 * Pi / lat_w_warstwie 'krok zmiany kąta we współrzednych walcowych
l_warstw = 20 'liczba warstw
lat = lat_w_warstwie * l_warstw 'całkowita liczba atomów tworząctych nanorurkę
h = 0.71 'różnica współrzędnej z w warstwie
fi = 0 'początkowy kąt wsp. walcowych
Cells(1, 1) = lat 'zapis liczby atomów w arkuszu
przesuniecie = h + 1.42
a = 0
For J = 1 To l_warstw
fi = a * krokfi
z_warstwa = a * przesuniecie
For i = 1 To lat_w_warstwie
x = ro * Cos(fi)
y = ro * Sin(fi)
If Int(i / 2) <> i / 2 Then 'rysowanie "zygzaka" w warstwie
Z = z_warstwa + h
Else
Z = z_warstwa
End If
Cells(i + a * lat_w_warstwie + 2, 1) = "C" 'zapis symboli w i współrzędnych do arkusza
Cells(i + a * lat_w_warstwie + 2, 2) = x
Cells(i + a * lat_w_warstwie + 2, 3) = y
Cells(i + a * lat_w_warstwie + 2, 4) = Z
fi = fi + krokfi
Next i
a = a + 1
Next J
End Sub
W arkuszu pojawiają się się wyniki zapisane we współrzędnych xyz. Wystarczy je skopiować do pliku tekstowego i zapisać na dysku. Plik można otworzyć w programie do grafiki molekularnej, który obsługuje format xyz. Ustawienia programu dają współrzędne dla rurki, która na obwodzie ma 10 atomów węgla.
![]() |
| Obraz wygenerowany za pomocą programu Jmol |
Poniżej przedstawiam jeszcze rurkę z dwudziestoma atomami węgla na obwodzie:
Subskrybuj:
Posty (Atom)








