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.
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
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
Si eres capaz, eres capaz de dejar un enunciado acerca de qué le añadirías a este post.