Sivut

Kommentit (134)

Kyttääjä
Seuraa 
Viestejä1076

Löysin auttavan tavan kuvata 4D-avaruus tasossa.

Jaetaan yksikköympyrän kehälle kahdeksan pistettä askeleella 2*pii/8.

Saadaan pisteet (x0, y0), (x1, y1), (x2, y2), ..., (x7, y7)

Tämän jälkeen, jos tasosta on valittu piste (x, y), niin 4D -> 2D muunnos toimitetaan:

u0 = sqrt((x-x0)^2 + (y-y0)^2)

v0 = sqrt((x-x4)^2 + (y-y4)^2)

Nyt 4D-recomplex luvun ensimmäinen akseli saa arvon u0-v0.

u1 = sqrt((x-x1)^2 + (y-y1)^2)

v1 = sqrt((x-x5)^2 + (y-y5)^2)

Toinen akseli saa arvon u1-v1,

jne.

Kyttääjä
Seuraa 
Viestejä1076

Epäonnistunut otos ja tulokseton 4D -> 2D muunnos. Kuvasta voi päätellä, ettei 4D muunnos tasoksi oikein toimi. Hyvä leikkaus minun fraktaaliharrastuksestani, useimmiten kuvat epäonnistuvat. Näyttää varmaan helpolta, kun julkaisee vain onnistuneita otoksia, mutta arki on paljon karumpi.

Tuon 4D -> 2D muunnoksen suhteen on palattava sorvin ääreen fundeeraamaan ongelmaa lisää.

Sisältö jatkuu mainoksen alla
Sisältö jatkuu mainoksen alla
Kyttääjä
Seuraa 
Viestejä1076

Tuossa on puolestaan onnistunut otos recomplex luvuilla toteutetusta zoomauksesta.

Tutkin kauan sitten 4D -> 2D muunnoksen mahdollisuutta, ja totesin sen silloin ilmeisesti mahdottomaksi, mutta algebran mahdollisuudet ovat rajattomat. Ko. muunnos on pakko olla olemassa. Ainakaan ei kannata heittää hanskoja tiskiin, ennen kuin on tutkinut kaikki mahdollisuudet uudelleen.

Kyttääjä
Seuraa 
Viestejä1076

4D-recomplex luku muodostuu r (=reaali), i (=imaginaari), j ja k -akseleista. Tuollainen fraktaali syntyy, kun Mandelbrotin joukon iteroinnin suorittaa j ja k -akseleilla. Symmetria akseleita on kaksi, kun r ja i -akseleilla iteroitu Mandelbrotin joukko tuottaa yhden symmetria-akselin.

Neutroni
Seuraa 
Viestejä32920

Kyttääjä kirjoitti:
lreal hidastaa laskentaa marginaalisesti, jolloin doublen ja lrealin välillä ei ole mainittavaa eroa. Prosessori käsittelee liukulukukäskyt muutenkin 80 bittisinä. 64 bittinen double muunnetaan siis 80 bittiseksi, kun koodi törmää liukulukuyksikköä vaativan käskyn.

Tuo on ihan OK niin kauan kun luvut pysyvät rekistereissä. AVX:llä nuo eivät toimi, ne laskevat doubleilla. Mutta se on muutenkin vähän hankalaa puljata liukulukuja AVX:n ja perinteisen liukulukuyksikön välillä. Taitaa muistin kautta käyminen olla ainoa tapa.

Lainaus:
Jos nuo AVX-käskyt tuovat nelinkertaisen nopeuden, niin se ei ole paljon. Pitäisi saada 1 000 kertainen nopeus, mutta pitää perehtyä AVX-tutorialiin.

En edelleenkään tajua mistä moinen hoppu. 1000 kertaisella nopeudella laskisi jo HD-videota reaaliajassa.  Voitko sanoa, miltä aluelta esimerkiksi nuo viimeiset esimerkkikuvat ovat ja mikä on maksimi iteraatiosyvyys ja keskimääräinen iteraatioiden määrä (yleensä paljon pienempi kuin maksimi)?

Kyttääjä
Seuraa 
Viestejä1076

8D-recomplex luvun l ja m -akseleilla iteroitu Mandelbrotin joukko tuottaa puolestaan neljä symmetria-akselia. (Kokeillaan nyt vielä n ja o -akseleilla, jolloin tulee ilmeisesti kahdeksan symmetria-akselia.)

Sitten on vielä kiinnostavaa iteroida kaikki samaan kuvaan ja katsoa miten ne toistensa suhteen asettuvat ja limittyvät.

Kyttääjä
Seuraa 
Viestejä1076

Neutroni kirjoitti:
En edelleenkään tajua mistä moinen hoppu. 1000 kertaisella nopeudella laskisi jo HD-videota reaaliajassa.  Voitko sanoa, miltä aluelta esimerkiksi nuo viimeiset esimerkkikuvat ovat ja mikä on maksimi iteraatiosyvyys ja keskimääräinen iteraatioiden määrä (yleensä paljon pienempi kuin maksimi)?

Joskus 80 tai 90 -luvulla tuli Yleltä ohjelma, jossa oli laskettu Mandelbrotin joukon zoomausvideo. Jos olisi käytettävissä laskutehoa, suunnittelisin ja värittäisi fraktaalizoomausvideon ajan kanssa. Näillä laskutehoilla kaaokseen sisältyvää järjestystä saisi laskea kymmenen vuotta, jotta saisi aikaiseksi muutaman minuutin zoomausvideon.

Maksimi-iteraatiosyvyyteen tarvitsee harvoin mennä, mutta se on 2048 tai 4096, jotta mustia aukkoja ei tule. Jos Maksimi-iteraatiosyvyys on esimerkiksi 256, kuva täyttyy mustista aukoista jo muutaman zoomauksen jälkeen. Keskimääräinen iteraatiosyvyys on (värien perusteella) jotain 256-512 luokkaa.

Kyttääjä
Seuraa 
Viestejä1076

Kyttääjä kirjoitti:
8D-recomplex luvun l ja m -akseleilla iteroitu Mandelbrotin joukko tuottaa puolestaan neljä symmetria-akselia. (Kokeillaan nyt vielä n ja o -akseleilla, jolloin tulee ilmeisesti kahdeksan symmetria-akselia.)

Sitten on vielä kiinnostavaa iteroida kaikki samaan kuvaan ja katsoa miten ne toistensa suhteen asettuvat ja limittyvät.

Näemmä n ja o -akseleilla iteroitu Mandelbrotin joukko on samanlainen kuin l ja m -akseleilla iteroitu kuva. Pitäisi ilmeisesti siirtyä 16D-recomplex lukuun, jos mielisi kahdeksaa symmetria-akselia.

Neutroni
Seuraa 
Viestejä32920

Kyttääjä kirjoitti:
Joskus 80 tai 90 -luvulla tuli Yleltä ohjelma, jossa oli laskettu Mandelbrotin joukon zoomausvideo. Jos olisi käytettävissä laskutehoa, suunnittelisin ja värittäisi fraktaalizoomausvideon ajan kanssa. Näillä laskutehoilla kaaokseen sisältyvää järjestystä saisi laskea kymmenen vuotta, jotta saisi aikaiseksi muutaman minuutin zoomausvideon.

Siinä videossa ei menty kovin syvälle, ja sen laskisi nykyaikaisella PC:llä (joka on tehokkaampi kuin senaikaiset supertietokoneet) tunnissa. En edelleen tajua mitä ihmettä haluat laskea, jos tarvitset vuosia prosessoriaikaa. Niin kuin tuossa linkitetyssä videossa näkyy, Mandelbrot toistaa itseään ikuisesti. Saat hyvin kauniita videoita varsin maltillisilla ajoilla. Ilmeisesti sinulla on jokin oleellisesti suorituskykyä rampauttava ongelma jossain.

Lainaus:
Maksimi-iteraatiosyvyyteen tarvitsee harvoin mennä, mutta se on 2048 tai 4096, jotta mustia aukkoja ei tule.

Jos lasketaan 1080 x 720 HD videota ja käytetään 2*2 antialiasointia ja 4096 maksimisyvyyttä, yksi frame tarvitsee maksimissaan 13 miljardia iterointia (jos koko kuva-ala on joukon alueella, mikä on sinänsä epämielenkiintoinen alue). Jos nyt arvioidaan maltillisesti, että PC pystyy miljardiin iterointiin sekunnissa, se tekee 13 sekuntia per frame. Tunnissa laskee siis 276 frametta eli 4.6 s 60p videota. Yön yli 10 tunnissa laskee jo melkein minuutin ja vuorokaudessa vajaat kaksi minuuttia. Ja tuo siis jos ollaan koko ajan mustalla alueella.  Käytännössä näyttävimmät rakenteet ovat joukon ulkopuolella ja sinun arvioimalla keskimääräisellä iteraatiomäärällä (jonka voin vahvistaa omasta kokemuksesta päteväksi kiinnostavalla alueella) frameja tulee liki kymmenkertainen määrä. Vartin videon renderöi vuorokaudessa, ja pitempään täytyy jo keksiä jotain erikoista, jotta se ei alkaisi toistaa itseään liikaa.

Lainaus:
Jos Maksimi-iteraatiosyvyys on esimerkiksi 256, kuva täyttyy mustista aukoista jo muutaman zoomauksen jälkeen. Keskimääräinen iteraatiosyvyys on (värien perusteella) jotain 256-512 luokkaa.

Tuokin on minusta erikoinen kuvaus asialle. Minä koen, että se (yleensä musta) joukko levähtää jos iteraatiomäärä on liian pieni.

Kyttääjä
Seuraa 
Viestejä1076

Neutroni kirjoitti:
En edelleen tajua mitä ihmettä haluat laskea, jos tarvitset vuosia prosessoriaikaa. Niin kuin tuossa linkitetyssä videossa näkyy, Mandelbrot toistaa itseään ikuisesti. Saat hyvin kauniita videoita varsin maltillisilla ajoilla. Ilmeisesti sinulla on jokin oleellisesti suorituskykyä rampauttava ongelma jossain.

Voi olla niinkin päin, ettet ole koskaan yrittänyt laskea tarkasti kaaokseen sisältyvää järjestystä, etkä sen vuoksi hahmota, kuinka paljon prosessointia se vaatii. Kyllä sen kaaoksen laskee sekunneissa, jos tarvitsee vain yksi iteraatioluuppi per pixeli.

Vertaa oheista mössöä viestissä 47 laskettuun kaaoksen järjestykseen. Mittakaava on sama:

xmin=-0.76006996596715525880, xmax=-0.76006996304403351420
ymin=+0.08282731035370781425, ymax=+0.08282731320668973440

Kyttääjä
Seuraa 
Viestejä1076

Ohessa on laskettu samaan kuvaan kompleksitason, j ja k -akselin sekä l ja m -akselin Mandelbrotin joukot. Kuvat menevät limittäin niin, että luultavasti zoomauksessa ne eivät leikkaa. Pitää laskea niitä zoomauksia paremmalla ajalla.

Neutroni
Seuraa 
Viestejä32920

Kyttääjä kirjoitti:
Voi olla niinkin päin, ettet ole koskaan yrittänyt laskea tarkasti kaaokseen sisältyvää järjestystä, etkä sen vuoksi hahmota, kuinka paljon prosessointia se vaatii. Kyllä sen kaaoksen laskee sekunneissa, jos tarvitsee vain yksi iteraatioluuppi per pixeli.

Vertaa oheista mössöä viestissä 47 laskettuun kaaoksen järjestykseen. Mittakaava on sama:

xmin=-0.76006996596715525880, xmax=-0.76006996304403351420
ymin=+0.08282731035370781425, ymax=+0.08282731320668973440

Yritätkö keskiarvoistaa tuota hienodetaljia? Sitten se menee harmaaksi (tai keskiarvoksi niistä väreitä mitä käytät). Käytä ennemmin jotain sopivaa funktiota, joka saturoituu kohti maksimia. Esim. juuria, logaritmeja tai rationaalifunktiota tai niiden yhdistelmiä. Se siistii tuota ylihienojen detaljien aluetta paljon paremmin ja antialiasointiin riittää 2*2 näytteen keskiarvoistus (tai 3*3, jos haluat hifistellä tai laskea yksittäisiä kuvia).

Minun esimerkkikuvassa maksimi on 4096. Iteraatioarvoihin käytetään funktiota 0.5*pow(i,0.3) ja tuloksen desimaaliosa määrää värin, joka käy punaisesta valkoisen kautta siniseen ja taas valkoisen kautta punaiseen. En ole kovin hyvä luomaan hienoimpia mahdollisia väripaletteja, kuten ehkä huomaa, mutta tuon funktion vaikutus pitäisi näkyä. Tuon kuvan laskemiseen ja näytölle piirtämiseen tuon kokoisna menee ehkä noin kolmasosasekunti.

Antialiasointi tehdään sitten niin, että lasketaan joka pikselille 2 x 2 väriarvoa (r, g ja b), ja keskiarvoistetaan ne. Ei iteraatioiden määrää tai välituloksia. Minä teen niin, että lasken iteraatioiden määrän taulukkoon ja säädän sitten värit erikseen, niin ei tarvitse laskea fraktaalia joka kerta erikseen.

outo
Seuraa 
Viestejä606

HuuHaata kirjoitti:
Satunnaisuudella tarkoitan tässä siis termistä fluktuaatiota fysiikassa, tai jotain muutakin satunnaisuuden muotoa, joka aiheuttaa sen ettei kaksi simulaatiota koskaan ole samanlaisia.

Onpas upeita kuvia fraktaaleista, kiitos, suorastaan aiheuttavat myönteisiä elämyksiä.

Siihen aikaan kun tietokoneiden laskureilla jo jotain teki, kiinnosti ohjelmoida Mooseksen kirjoissa mainitut tähtitieteelliset maininnat ja verrata siihen, mitä mainittiin tapahtuneen kansan historiassa. Jos tapahtumat olisivat ristiriidassa tähtitieteen kanssa, kriitikot olisivat oikeassa uskotellessaan, että tapahtumat ovat keksittyjä tai kirjoitettu jälkeenpäin.

Esim ohjelmointi laskuriin sukuluetteloiden aika Jeesuksesta Aabrahamiin. Laskuri näytti, että Egyptistä lähtö oli 1513 eaa, ja niisankuun 14 päivästä, jolloin oli täysikuu, kului tietty määrä päiviä jolloin mannaa alkoi tulla ja sen oli oltava tietty viikonpäivä suhteessa pääsiäisyönä tapahtuneen lähdön viikonpäivän kanssa. Ei ollut ristiriitaa.

Samalla metodilla saattoi laskea sen vuoden, jolloin Jeesus syntyi ja jolloin teloitettiin, koska Raamatussa ja sen ulkopuolisessa historiassa mainitaan, millaisia ilmiöitä (mm. auringon pimennykset) kyseisinä aikoina tapahtui. Nehän oli merkitty muistiin, koska niiden yhteydessä mainittiin tunnettujen hallitsijoiden hallitusvuosien aika, suhteessa Jeesuksen syntymävuoteen.

Tietokoneella oli helppo laskea, mitä auringonpimennykset olivat täysiä, mitkä osittaisia, ja nähdä niistä, mikä oli oikea, ja siten todeta, että Jeesuksen maanpäällä olemisen aika voidaan helposti tarkistaa 2000 vuotta myöhemmin tähtitieteen ja tietokoneen laskurin avulla.

Myös se oli kiinnostava aihe laskea väestönlaskentakaaviolla, montako ihmistä kuului kansaan Egyptistä lähdettäessä ja todeta, että väkimäärää ei oltu liioiteltu, kuten jotkut väittävät.

Kyttääjä
Seuraa 
Viestejä1076

Neutroni kirjoitti:
Minun esimerkkikuvassa maksimi on 4096. Iteraatioarvoihin käytetään funktiota 0.5*pow(i,0.3) ja tuloksen desimaaliosa määrää värin, joka käy punaisesta valkoisen kautta siniseen ja taas valkoisen kautta punaiseen

Voisi mennä jakeluun paremmin, jos laitat iterointifunktion näytille? Ymmärrän  asioita enemmän vasta sen jälkeen, kun on itse tehnyt (debugannut koodin) ja testannut.

Eusa
Seuraa 
Viestejä17606

Kivahan näitä on kokeilla. Vuonna 1983 oli varsin kärsivällisyyttä vaativaa puuhaa.

Hienorakennevakio vapausasteista: (1+2¹+3²+5³+1/2¹*3²/5³)⁻¹ = 137,036⁻¹

Neutroni
Seuraa 
Viestejä32920

typedef struct frame_str {
double kx,ky; //keskipiste
double koko; //koko (lyhyempi sivu keski-koko - keski+koko)
double dx,dy; //derivaatan suunta
double jx,jy; //piste julian laskemista varten
unsigned int w,h; //framen koko
unsigned int maxit; //iteraatioiden määrä
unsigned int tyyppi;
unsigned int antialias;
unsigned int framenum; //framen numero animaatiossa
unsigned int w4,br; //4:llä jaollinen leveys ja bitmapin rivin pituus tavuina
unsigned int liput; //liput kertovat laskentathreadeille mitä halutaan
unsigned char *bmap; //kuva bitmap -formaatissa
double *data; //data raakana (antialiasoinnin verran suurempana kuin koko)
struct vari_str *vari; //väristruktuuri
} str_frame;

Neutroni
Seuraa 
Viestejä32920

//Laskee rivin Mandelbrotia eksponentilla 2
//26.9.2015
void frakMandelbrot2(str_frame *fr, unsigned int rivi, double *data)
{
  __m256d ix0={0.5,1.5,2.5,3.5},ix,x0,xker;
  __m256d ax,ay,bx,by,bx2,by2,t,cnt;
  __m256d v1={1.0,1.0,1.0,1.0},v4={4.0,4.0,4.0,4.0};
  double a,b,lx,ly;
  unsigned int x,y,xm,tst;
  int i;

  if(fr->w > fr->h) {                                                //lasketaan koko pitemmässä suunnassa
    ly=fr->koko; lx=fr->w*ly/fr->h;
  } else {
    lx=fr->koko; ly=fr->h*lx/fr->w;
  }

  xm=(fr->w*fr->antialias+3) & (~3);                                  //x-rivin pituus 4:lle jaolliseksi
  a=2.0*lx/xm;   xker=_mm256_broadcast_sd(&a);
  a=fr->kx-lx;   x0=_mm256_broadcast_sd(&a);

  for(y=0;y<fr->antialias;y++) {                                     //lasketaan antialiasoinnin verran rivejä
    a=fr->ky+ly*(-1.0+2.0*(rivi+(0.5+y)/fr->antialias)/fr->h);   //y-koordinaatti
    ay=_mm256_broadcast_sd(&a);
    ix=ix0;
    for(x=0;x<xm;x+=4) {
      ax=_mm256_mul_pd(xker,ix);
      ax=_mm256_add_pd(ax,x0);

      bx=ax; by=ay;
      i=0; cnt=_mm256_xor_pd(ax,ax);
      do {
        bx2=_mm256_mul_pd(bx,bx);
        by2=_mm256_mul_pd(by,by);
        t=_mm256_add_pd(bx2,by2);
        t=_mm256_cmp_pd(t,v4,_CMP_LT_OQ);
        tst=_mm256_movemask_pd(t) & 15;
        if(tst==0) goto Valmis;
        i++; if(i>fr->maxit) goto Valmis;
        t=_mm256_and_pd(t,v1);
        cnt=_mm256_add_pd(t,cnt);

        by=_mm256_mul_pd(bx,by);
        by=_mm256_add_pd(by,by);
        by=_mm256_add_pd(by,ay);
        bx=_mm256_sub_pd(bx2,by2);
        bx=_mm256_add_pd(bx,ax);
      } while(1);
Valmis:
      _mm256_store_pd(data,cnt); data+=4;
      ix=_mm256_add_pd(v4,ix);
    }
  }
}

Sivut

Suosituimmat

Uusimmat

Sisältö jatkuu mainoksen alla

Uusimmat

Suosituimmat