Dimensión Fractal Imelda Trejo Lorenzo 8 de junio de 2011 1. Introducción Existen diferentes conceptos de dimensión fractal, por ejemplo, dimensión de Hausdorff, dimensión de auto-similitud y dimensión por conteo de cajas. Matemáticamente la dimensión de Hausdorff es la más aceptable entre la comunidad cientı́fica. Sin embargo, como esta definición requiere de otras nociones y herramientas matemáticas, esta no es muy usada en las aplicaciones. Por otro lado, la dimensión fractal de auto-similitud sólo es aplicable a conjuntos u objetos que tienen la propiedad de auto-similitud. En este trabajo presentaremos la definición de dimensión fractal por conteo de cajas e implementaremos este método en c++. Luego, presentaremos la dimensión por conteo de cajas obtenidas con el programa para algunos conjuntos. Finalizamos con las conclusiones. 2. Dimensión por conteo de cajas Para definir la dimensión por conteo de cajas (box counting) para un subconjunto A acotado de R2 , supondremos que tenemos la imagen de A. Luego, a esta imagen la colocaremos en una cuadrı́cula de 1/s2 rectángulos, con 0 < s ≤ 1. Para ser más exactos, cada rectángulo tendrá de largo la longitud de la imagen multiplicada por s y tendrá de ancho la longitud del ancho de la imagen multiplicada por s. La dimensión por conteo de cajas, la cual denotaremos con Db (A) o simplemente Db , se define como log(Ns (A)) , (1) Db (A) = lı́m s→∞ log(1/s) donde Ns (A) es el número de cubos que intersecta con A, siempre que Db (A) exista. 1 Por ejemplo, si A es un cuadrado entonces Db (A) = 2. Porque para todo 0 < s ≤ 1, Ns (A) = s12 . s (A)) para s suficientemente pequeño. Por lo tanto, Db es Observe que Db ≈ log(N log(1/s) el número tal que 1 Ns (A) ≈ D . s b 3. Implementación del método A continuación presentaremos un programa realizado en c++. Este programa da como salida una aproximación de Db (A) para cada imagen de la estructura de A y s. Este programa divide la imagen en pequeños rectángulos de dimensión ph y pw respectivamente. Cuenta el número de cuadros, N , que intersecta con la estructura s (A)) A e imprime N y Dimensión = log(N . Para esto, primero se tiene que abrir una log(1/s) imagen tipo bmp. Luego, seleccionar con el mouse el color que determina la estructura de A y finalmente dar click en el botón contar. Si se quiere visualizar la cuadrı́cula sobre A se deberá seleccionar esta opción. El código del programa se presenta en el apéndice. Interfaz gráfica del programa 4. Análisis del programa A continuación presentamos algunas corridas del programa para un cuadrado y una lı́nea. 2 Cuadrado La dimensión que arroja el programa es 2. Que como ya sabı́amos Db = 2. En este caso Db coincide con la dimensión euclidiana y por ende con la dimensión de Hausdorff, DH . Ası́ que, el programa aproxima bien a Db y no importa que tan fina sea la cuadrı́cula. Lı́nea Para la linea la dimensión euclidiana y de Hausdorff es 1. Sin embargo, como veremos en la siguiente tabla al hacer tender s a cero los resultados que obtenemos del programa difieren de 1. s Db s Db −2 2 =0.25 1 0.1 1 2−3 =0.125 1 0.01 1.150514... 2−4 =0.03125 1 0.001 1.301029 2−5 =0.015625 1 0.0001 1.471622.. 2−6 =0.0078125 1.142857.. 3 De los datos obtenidos, podemos concluir que el programa no aproxima a DH cuando s tiende a 0. Esto seguramente se debe a los errores de cálculo que almacena la maquina, pues está trabajando con cantidades muy pequeñas. Por otro lado, si s va disminuyendo en potencias de dos entonces tenemos una mejor precisión hasta n ≤ 5. 5. Dimensión de ciertos objetos En esta sección presentaremos algunas aproximaciones de la dimensión de ciertos conjuntos con s =0.03125. Los cuales los comparamos con la dimensión de Hausdorff. Conjunto DH Db Curva de Koch ln 4 /ln 3 = 1.26186... 1.4370 Triı́gulo de Sierpinski ln 3/ ln 2 = 1.58496... 1.716992.. A continuación mostramos las corridas del programa para otros objetos con mayor irregularidad. 4 6. Conclusiones El programa que se implemento no aproxima bien a la dimensión de Hausdorff. Sin embargo, este programa proporciona una cantidad que de alguna manera mide la irregularidad de los objetos. A. Código Código del programa principal. TForm1 *Form1; //--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } 5 //--------------------------------------------------------------------------- void __fastcall TForm1::BitBtn1Click(TObject *Sender) { if (OpenPictureDia\log1->Execute()){ Image1->Picture->LoadFromFile(OpenPictureDia\log1->FileName); // Label1->Caption=IntToStr(Image1->Picture->Bitmap->Width)+"x"+IntToStr(Image1->Pic } } //--------------------------------------------------------------------------void __fastcall TForm1::BitBtn2Click(TObject *Sender) { long double d,s,com,pw,ph,x0,y0,x1,y1; int Bh,Bv,i,j,k,h,ii,jj; int p0w,p1w,p0h,p1h; long int cont=0; Graphics::TBitmap *C1; Image1->Picture->LoadFromFile(OpenPictureDia\log1->FileName); Memo1->Lines->Clear(); B1 = new Graphics::TBitmap(); B1->Width=Image1->Picture->Bitmap->Width; B1->Height=Image1->Picture->Bitmap->Height; B1->Assign(Image1->Picture->Bitmap); C1 = new Graphics::TBitmap(); C1->Width=B1->Width; C1->Height=B1->Height; C1->Assign(B1); s = StrToFloat(Edit1->Text); d = 1/s; // Tomando los cuadros desde pixel ... a pixel .... --------pw = B1->Width/(d*1.0); ph = B1->Height/(d*1.0); 6 x0 = 0.0; x1 = pw; y0 = 0.0; y1 = ph; h=1; do { ++h; p0h = int(floor(y0)); p1h = int(ceil(y1)); x0 = 0.0; x1 = pw; k=1; do { k++; p0w = int(floor(x0)); p1w = int(ceil(x1)); // Dibujo de las lı́neas <--------------------------if (CheckBox1->Checked){ C1->Canvas->MoveTo(p1w,p0h); C1->Canvas->LineTo(p1w,p1h); C1->Canvas->MoveTo(p0w,p1h); C1->Canvas->LineTo(p1w,p1h); } // Contar cuadros ----------------------------------for (i=p0h;i<p1h;++i){ for (j=p0w;j<p1w;++j){ if (B1->Canvas->Pixels[j][i]==color){ if (CheckBox2->Checked) Memo1->Lines->Add(IntToStr(h-1)+","+IntToStr(k-1)); cont++; i=p1h; break; } } } x0=x1; x1=pw*k; } while (x1<=B1->Width); 7 y0=y1; y1=ph*h; } while (y1<=B1->Height); // -----------------------------------------------------Label2->Caption=("N="+IntToStr(cont)); Label3->Caption=("Dimensión="+FloatToStr(\log(cont)/\log(1.0/s))); Image1->Picture->Bitmap->Assign(C1); delete B1; delete C1; } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { Shape1->Brush->Color=Image1->Canvas->Pixels[X][Y]; color=Shape1->Brush->Color; } //--------------------------------------------------------------------------- 8