Saturday 27 May 2023

gnuplot palette for interference pictures

My shitty codes, part 1.

Suppose you want to visualize some complicated superpositions of sine (or other) waves, spot their constructive and destructive interference, keep track of the sign of the result and not care too much about the actual value. Linear color map or "palette" is rather useless here—in order to get a readable picture, you'd have to send a very weak wave, its amplitude would be very close to the zero (white) regions of your map.

I found no examples of built-in gnuplot palettes that would give something nice according to my taste and needs, so here's what I did: (1) fire Inkscape and create a gradient rectangle (the svg file cannot be added here, but png would work just as good):

and (2) add a bunch of numbers every step. Then comes (3) which is the stupidest part of the job: rescaling the rectangle so that these numbers are adjusted to the horizontal scale (nevermind the units) in Inkscape's window (I guess it's standard for programs for vector graphics to have such a ruler somewhere),  making it comfortable (and boring/frustrating!) to "loop" over the rectangle and collect the 33 color codes, using some other rectangle and setting its fill color using the pick-color selection. If you're into numerology, 33 is purely accidental.

Then I wrote a shitty script in an even more shitty language, and got a linear palette, like

set palette defined(-10.0 '#0301fe', -9.393939393939394 '#021cdf', -8.787878787878787 '#0237bf', -8.181818181818182 '#01539e', -7.575757575757576 '#016e7f', -6.969696969696971 '#008a5e', -6.363636363636363 '#04a545', -5.757575757575758 '#1db857', -5.151515151515151 '#36ca6a', -4.545454545454545 '#37cb6a', -3.9393939393939394 '#6af190', -3.333333333333333 '#83ffa3', -2.727272727272727 '#9effb6', -2.121212121212121 '#b5ffc8', -1.5151515151515158 '#ceffda', -0.9090909090909083 '#e6ffec', 0.0 '#ffffff', 0.9090909090909083 '#ffffde', 1.5151515151515158 '#fffebe', 2.121212121212121 '#fffe9f', 2.727272727272727 '#fffd7d', 3.333333333333333 '#fffd7e', 3.9393939393939394 '#ffe74a', 4.545454545454545 '#ffcb37', 5.151515151515151 '#ffaf24', 5.757575757575758 '#ff9311', 6.363636363636363 '#ff7800', 6.969696969696971 '#ff6400', 7.575757575757576 '#ff5000', 8.181818181818182 '#ff3c00', 8.787878787878787 '#ff2800', 9.393939393939394 '#ff1400', 10.0 '#ff0000')

supposing that my z-axis-to-be range would be [–10,10]. The script expects a symmetric interval of float numbers, divides it evenly and selects white (#ffffff) to represent z = 0. Such naive (linear) mapping suffers from the above described problem—the near-to-white region of the z-axis is too wide for my purposes, like here—waves with amplitudes smaller than, say 4 or 5, would be barely visible:


To save myself the pain of changing the gradient using mouse (and perhaps clicking through it again and copying and pasting color codes. as I said, it's boring but probably faster even for 33 colors than finding some appropriate program that would do that quickly), I thought about changing my shitty script a little—to make the map non-linearand got something better, 

set palette defined(-10.0 '#0301fe', -8.426272039497363 '#021cdf', -7.203207828070985 '#0237bf', -6.2169434823154734 '#01539e', -5.3977002712995725 '#016e7f', -4.7002706840325805 '#008a5e', -4.094018979439592 '#04a545', -3.5573892333332457 '#1db857', -3.074714348928315 '#36ca6a', -2.6342728999643885 '#37cb6a', -2.2270573040626522 '#6af190', -1.845964683787546 '#83ffa3', -1.4852476934266692 '#9effb6', -1.1401297208707324 '#b5ffc8', -0.8065261428492804 '#ceffda', -0.48083469544786817 '#e6ffec', 0.0 '#ffffff', 0.48083469544786817 '#ffffde', 0.8065261428492804 '#fffebe', 1.1401297208707324 '#fffe9f', 1.4852476934266692 '#fffd7d', 1.845964683787546 '#fffd7e', 2.2270573040626522 '#ffe74a', 2.6342728999643885 '#ffcb37', 3.074714348928315 '#ffaf24', 3.5573892333332457 '#ff9311', 4.094018979439592 '#ff7800', 4.7002706840325805 '#ff6400', 5.3977002712995725 '#ff5000', 6.2169434823154734 '#ff3c00', 7.203207828070985 '#ff2800', 8.426272039497363 '#ff1400', 10.0 '#ff0000')

and the following picture:


Now even the originally emitted waves are well-visible, before they interfere with some reflected waves. The trick is to use e.g. the tan function for z-range. (Which means we apply arctan to colors—a well-known and easy to use smooth approximation for the sign function that goes steeply through zero and later becomes flat, using the engineers' language.)

This is the result in action—the original wavefronts have just passed the figure of a bee or fly or whatever fucking insect is there at the center, and there's a bunch of reflected waves, interfering with themselves and with the incoming waves:


 

Here goes the shitty code in an even more shitty language. Works for me, but it's very basic and probably buggy. Enjoy, modify etc.:

# only tan is used at the moment.

from math import atan, pi, tan, sin, fabs

# the 33 colors from the palette gradient. 
# perhaps could have been extracted by some program 
# which I don't know of - ...
 
colors = [
    '0301fe',
    '021cdf',
    '0237bf',
    '01539e',
    '016e7f',
    
    '008a5e',
    '04a545',
    '1db857',
    '36ca6a',
    '37cb6a',

    '6af190',
    '83ffa3',
    '9effb6',
    'b5ffc8',
    'ceffda',

    'e6ffec',
    'ffffff', # this is white!
    'ffffde',
    'fffebe',
    'fffe9f',

    'fffd7d',
    'fffd7e',
    'ffe74a',
    'ffcb37',
    'ffaf24',

    'ff9311',
    'ff7800',
    'ff6400',
    'ff5000',
    'ff3c00',

    'ff2800',
    'ff1400',
    'ff0000'    
]

# makes no sense if f is non-monotonic.
def map(f, x, A):
    return float(f(k*x)/f(k*A))

a = 10.
 
# prevents tan(x) from blowing up:
k = (2./pi+0.5)/a
 
# z-range step
da = (2.*a) /float(len(colors))
 
# find the position of white in the gradient:
i0 = colors.index('ffffff')
 
# value-color pairs:
palette = {)
 
# choose any monotonic function you like.
f = lambda x: tan(x)
 
# fill the "left" (i.e. z < 0) half of the palette
for i in range(0, i0):
    value = a*map(f, -a + float(i)*da, a)
    palette[value] = colors[i]
 
# assign white to z = 0;
palette[0.] = colors[i0]
 
# fill the "right" half of the palette (z > 0)
right = len(colors) - i0

for i in range(1, right):
    value = a* map(f, a - float(right - i - 1)*da, a)
    palette[value] = colors[i0 + i] 
 
# create gnuplot set palette command:
print('set palette defined(', end='')
for x in palette:
    print(str(x) + " '#" + palette[x] + "', ", end='')
 
# delete the last space and comma, add the closing parenthesis:
print('\b\b)')

Friday 26 May 2023

Mimino

W styczniu zmarł Wachtang "Buba" Kikabidze. Genialny aktor ("Mimino", "TASS upołnomoczien zajawit'") i gawędziarz, w tym opowiadacz zacnych żartów. W jednej czwartej mój rodak, do końca mówiący po rosyjsku z silnym akcentem.

Да нэт, лэтающий тарэлка только у мэня и у Гоги...

Wednesday 24 May 2023

czaty i inne graty

TL;DR

Długo się wahałem i zabierałem. Wysłuchałem tych i owych, w debatach i marzycielskich bredniach (tu zwłaszcza zagubiony Leksiu Fridman) o świadomych maszynach etc.

Jako projekt pewnie jest znaczącym osiągnięciem - długo musiałbym się uczyć, żeby targnąć się na takie coś, a czasu nie cofnę. Jestem stanowczym przeciwnikiem wprowadzania ej-aj do zastosowań w codziennym życiu, ponieważ widzę potencjalne negatywne strony dla ludzkości i człowieczeństwa ludzi. Odrobinę paradoksalne, biorąc pod uwagę skalę własnego odczłowieczenia i niechęci do ludzkości, z sympatią do ludzi pojedynczych.

Ale pretensji o oddalanie się od pędzącego świata, pozostawanie w tyle czy dziadzienie nie mam. Wpychający mnie do elit (niechby i dawnych) mechanizm równania w dół większości dookoła jest niezasłużony i mogę mu się przyglądać z dystansem. Nie mój cyrk, nie moje małpy. Liczyłem na coś innego jeszcze 20 lat temu - poszło inaczej.

Krytykom takiego spojrzenia doradzam wnikliwe przyjrzenie się fałszywej analogii - odwołują się mianowicie do dawnych przeciwników postępu czysto technicznego i praktycznego, w produkcji, transporcie itp. Być może kiedyś robotnicy protestowali przeciwko wprowadzaniu maszyn. Nie wiem, jak z rolnikami - czy przerażała ich perspektywa wyręczenia w fizycznej robocie przez kombajn ze snopowiązałką. Pewnie ktoś bardzo wolał napęd konny zamiast parowego itp. Rezygnacja (np. wymuszona) z wysiłku fizycznego mogła spowodować, że ktoś np. zaczął obrastać w tłuszcz, ew. jeśli to odpowiednio szybko zauważył, mógł zająć się wysiłkiem dla samego wysiłku. Tu sprawa jest o tyle groźniejsza, że dużej porcji ludziny grozi gratisowe zwolnienie z dwóch stanów umysłu: "wiem"  i "myślę". Przy czym jako niedouk i posiadacz jako tako półsprawnej mózgownicy - drugie cenię o wiele bardziej niż pierwsze. AI to prosta droga do całkowitego przyzwolenia na intelektualne lenistwo. Ale nie oczekuję, że w tej kwestii ktoś zadba akurat o mój komfort (tj. chętnie otaczałbym się ludźmi, od których można się czegoś nauczyć, ale bez sięgania po elektryczną pomoc; i chciałbym, żeby nie byli oni w coraz bardziej kurczącej się mniejszości - a wszak demokracja, dobro najwyższe, deklaruje, że decyduje większość).

Tak więc śrubokręt w druty czatom i innym pożytecznym pożeraczom danych z papki zwanej internetem. Jest to ćwierćinteligentne echo nas samych i jako takie grozi fatalną wsobnością. Wolę niedoskonałą i nielubianą przez siebie ludzkość niż maszyny, które miałyby wpływać na tak dużo, z tak dużą porcją hype'u i ultra-naiwnych podążaczy. Nie wspomnę o biznesach robionych z pomocą maszyn i nabijających kabzę "zaradnym". Ale kijem rzeki nie zawrócę. Ino od tych kompuntrów trzymię się na odległość kija od szczotki do porcelanowego krateru. Co innego kodowanie w pracy czy hobbystyczne. Przecież i tak korzystam z dorobku wielu, choćby via osławiony SO czy gugiel. Jeśli mi "produktywność" spadnie poniżej ileś tam, w obliczu presji do korzystania z czatów itp. - zmienię pracę. Są granice poniżenia, których przekroczyć nie wolno.

Chuj w dupę fanbojom i entuzjastom. Całe szczęście, że za 10-15 lat zejdę śmiertelnie i nie będę musiał oglądać tego burdelu, tj. bałaganu.

Friday 19 May 2023

Impą der inabilia

Prowadzący, miejscami tak wybitnie niegramotny, że do parodii Tyma o sprawozdawcach sportowych by się nadał, zapytuje prezydenta Aleksandra:

Co kusi prezydenta, będąc na urzędzie?

Kurty(za)na! Orkiestra tusz! (wieprzowych).

Wednesday 17 May 2023

reaktywacja Lisa

Pewnie spóźnione, bo śledzę sprawy sporadycznie i z doskoku.

Ciekawie się słucha, choć przejmujący jest widok walki człowieka z trudnościami w wymowie (kolejny udar), plus jakieś niesamowitości ze strony wymiaru sprawiedliwości i prawa - kto chce, niech wstawi cudzysłowy, gdzie uważa za stosowne.

Nawalałem kiedyś w Lisa za jego straszliwe wstępniaki w NW, finału czy kulis odejścia stamtąd nie znam, bo nie czytam prasy plotkarskiej. Widząc część pełnych katołeckiej miłości bliźniego komentarzy - zastanawiam się, wśród kogo żyję.

Zdrowia, panie redaktorze, bo co jeszcze zostało?

Tuesday 9 May 2023

z dziewiątym maja

O zwycięstwie pamiętamy. A czasy się zmieniły. Reszta jest milczeniem.