Saltar al contenido

Trazado de la función de Weierstrass

Recuerda que en las ciencias un error suele tener más de una resoluciones, pero nosotros te enseñamos lo más óptimo y eficiente.

Solución:

los pst-func el paquete sabe psWeierstrass(x0,x1)[a]a or b. Utiliza la función de http://mathworld.wolfram.com/WeierstrassFunction.html o, si se proporciona el argumento opcional, el original, que se ve aquí http://en.wikipedia.org/wiki/Weierstrass_function:

documentclass[pstricks,border=10pt]standalone
usepackagepst-func   
begindocument

pssetyunit=10,xunit=5
beginpspicture(-0.1,-0.5)(2.1,0.5)
psaxes[Dx=0.2,Dy=0.1,ticksize=-4pt 0,labelFontSize=scriptstyle]->(0,0)(0,-0.5)(2.1,0.5)
psWeierstrass[linecolor=red](0,2)2
psWeierstrass[linecolor=green](0,2)3
psWeierstrass[linecolor=blue](0,2)4
endpspicture

enddocument

Ejecute el ejemplo con xelatex o latex->dvips->ps2pdf. Necesita la última versión de pst-funx.tex desde http://texnik.dante.de/tex/generic/pst-func/ o la actualización de mañana de TeX Live / MiKTeX.

producción

y lo mismo con la definición original de Weierstraß y un número de interacción variable:

documentclassarticle
usepackageifxetex 
ifxetexusepackagefontspecelseusepackage[utf8]inputencfi
usepackagepst-func   
begindocument

The original Weierstraß function
[ f(x)= sum_n=0^infty a^n cos(b^n pi x) ]

pssetunit=2cm,linewidth=0.5pt,plotpoints=5000
beginpspicture(-2.1,-2.1)(2.1,2.1)
psaxes[Dx=0.5,Dy=0.5,ticksize=-2pt 0,labelFontSize=scriptstyle]->(0,0)(-2,-2)(2,2)
psWeierstrass[linecolor=red](-2,2)[0.5]3
psWeierstrass[linecolor=blue!70](-2,2)[0.5]10
endpspicture

enddocument

ingrese la descripción de la imagen aquí

Y ahora una versión de LuaTeX con pgf que también tiene un número variable de iteraciones:

documentclass[tikz,border=0.125cm]standalone
usepackagepgfplots
pgfplotssetcompat=1.9
usepackageluacode
beginluacode
function weierstrass(x0, x1, n, a, b, epsilon)
 local dx = (x1-x0)/n 
 local x = x0
 local out=assert(io.open("tmp.data","w"))
 local y,k,dy
 while (x <= x1) do
   y = 0
   k = 0
   repeat
      dy = math.pow(a,k) * math.cos(math.pow(b,k)*math.pi*x)
      y = y + dy
      k = k + 1
   until (math.abs(dy) < epsilon)
   out:write(x, " ", y, "stringn") 
   x = x + dx
 end
 out:close()
end
endluacode

begindocument

begintikzpicture
directluaweierstrass(-2,2,5000,0.3,5,1.e-12)%
beginaxis[axis lines=middle,domain=-2:2]
addplot [thick, black, line join=round] table tmp.data;
endaxis
endtikzpicture

enddocument

Aquí está un pgfmath definición de función de la función original de Weierstrass: weierstrass(x,a,b,i). i es el número de iteraciones que se utilizará para aproximar la función.

documentclassarticle
usepackagepgfplots

makeatletter
pgfmathdeclarefunctionweierstrass4%
    [email protected]#4%
    afterassignment[email protected]%
    expandafter[email protected]@countapgfmathresult ptrelax%
    pgfmathfloatcreate10.00%
    let[email protected]@TMPr=pgfmathresult
    [email protected]%
    let[email protected]@TMPp=pgfmathresult%
    edef[email protected]@TMPx#1%
    edef[email protected]@TMPa#2%
    edef[email protected]@TMPb#3%
    pgfmathloop
        ifnum[email protected]@counta>-1relax%
            pgfmathfloatparsenumberthe[email protected]@counta%
            let[email protected]@TMPn=pgfmathresult%
            pgfmathpow[email protected]@TMPa[email protected]@TMPn%
            let[email protected]@TMPe=pgfmathresult%
            pgfmathpow[email protected]@TMPb[email protected]@TMPn%
            pgfmathmultiplypgfmathresult[email protected]@TMPp%
            pgfmathmultiplypgfmathresult[email protected]@TMPx%
            pgfmathdegpgfmathresult%
            pgfmathcospgfmathresult%
            pgfmathmultiplypgfmathresult[email protected]@TMPe%
            pgfmathaddpgfmathresult[email protected]@TMPr%
            let[email protected]@TMPr=pgfmathresult
            advance[email protected]@counta by-1relax%
    repeatpgfmathloop%


begindocument
begintikzpicture
beginaxis[axis lines=middle, axis equal image, enlarge y limits=true]
addplot [thick, black, samples=301, line join=round, domain=-2:2] weierstrass(x,0.5,3,10);
endaxis
endtikzpicture
enddocument

Y aquí está la versión de MathWorld que está implementada en PSTricks:

documentclassarticle
usepackagepgfplots

makeatletter
pgfmathdeclarefunctionweierstrass3%
    [email protected]#3%
    afterassignment[email protected]%
    expandafter[email protected]@countapgfmathresult ptrelax%
    pgfmathfloatcreate10.00%
    let[email protected]@TMPa=pgfmathresult
    [email protected]%
    let[email protected]@TMPd=pgfmathresult%
    edef[email protected]@TMPb#1%
    edef[email protected]@TMPc#2%
    pgfmathloop
        ifnum[email protected]@counta>0relax%
            pgfmathfloatparsenumberthe[email protected]@counta%
            pgfmathpowpgfmathresult[email protected]@TMPc%
            [email protected]pgfmathresult[email protected]@TMPd%
            let[email protected]@TMPe=pgfmathresult%
            pgfmathmultiplypgfmathresult[email protected]@TMPb%
            pgfmathdegpgfmathresult%
            pgfmathsinpgfmathresult%
            pgfmathdividepgfmathresult[email protected]@TMPe%
            pgfmathaddpgfmathresult[email protected]@TMPa%
            let[email protected]@TMPa=pgfmathresult
            advance[email protected]@counta by-1relax%
    repeatpgfmathloop%

makeatother

begindocument
begintikzpicture
beginaxis[axis lines=middle,
    xmin=0, xmax=2,
    ymin=-0.5, ymax=0.5,
    axis equal image
]
addplot [red, samples=300, domain=0:2] weierstrass(x,2,15);
addplot [green, samples=300, domain=0:2] weierstrass(x,3,15);
addplot [blue, samples=300, domain=0:2] weierstrass(x,4,15);
endaxis
endtikzpicture

enddocument

El método de Jake usando lualatex con pgfplots. Parece que se requieren algunas tonterías para convertir hacia y desde la representación interna de los números utilizados por pgfplots lo que hace que este molesto sea ineficaz.

documentclass[tikz,border=0.125cm]standalone
usepackagepgfplots
directlua%
  function weierstrass(x, a, b, N)
    local y, n
    y = 0
    for n = 0,N do
      y = y + math.pow(a,n) * math.cos(math.pow(b, n)*math.pi*x)
    end
    return y
  end


pgfmathdeclarefunctionweierstrass4%
  begingroup%
    pgfkeys/pgf/number format/.cd,assume math mode,verbatim%
    pgfmathprintnumberto#1xpgfmathprintnumberto#2a%
    pgfmathprintnumberto#3bpgfmathprintnumberto#4N%
    edefpgfmathresultdirectluatex.print("" .. weierstrass(x,a,b,N))%
   expandafterendgroupexpandafter%
    pgfmathfloatparsenumberexpandafterpgfmathresult%

begindocument

begintikzpicture
beginaxis[axis lines=middle, axis equal image, enlarge y limits=true]
addplot [thick, black, samples=301, line join=round, domain=-2:2] 
  weierstrass(x,0.5,3,100);
endaxis
endtikzpicture

enddocument

ingrese la descripción de la imagen aquí

Si eres capaz, eres capaz de dejar un enunciado acerca de qué le añadirías a este post.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *