我想用 tikz(如果可能的话 - 但在网上读到 tikz 可以做的所有事情,我相信它是可行的) - 或者 pstricks 或其他一些绘图程序 - 绘制一些相当简单的函数的蛛网图。为了说明我的想法,请参阅以下图片这网站。我的问题是,我解决这个问题的方法完全是错误的:我在 GeoGebra 中制作了所有的蛛网图,因为从那里我可以将它们导出到 tikz/pstricks - 但这样做之后我意识到这样做效果不太好:从 GeoGebra 图到 tikz/pstricks 的转换经常会出现小故障。
所以现在我所做的所有工作都是徒劳的 - 而且最重要的是我甚至不懂得如何仅通过代码来实现这一点。所以你能给我举个例子说明如何编写一个函数的蛛网图(为了简单起见,我们取 x^2),然后我可以将其应用于我的其他函数吗?它应该有两个参数:一个参数,我可以告诉它在函数的哪个点,从那个点开始它应该进行多少次迭代。
答案1
我不确定是否理解了这个问题。你想要一些动态的东西或类似的东西:(我有另一个带有 fp 的版本,并且可以将 gnuplot 与 tikz 一起使用) 更新我清理代码
\documentclass{article}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{tikz,fullpage}
\usetikzlibrary{arrows}
\begin{document}
\thispagestyle{empty}
\begin{figure}[htbp]
\centering
\newcounter{j}
\begin{tikzpicture}[scale=10,>=latex']
\draw[color=blue,samples at={0,0.01,...,1.07}] plot (\x,{cos(\x r)});
\draw[color=green](0,0)--(1,1);
\draw[->](0,0)--(0,1) node[above]{$y$};
\draw[->](0,0)--(1,0) node[right]{$x$};
\newcommand{\x}{.2}
\foreach \i in {1,...,7}{%
\pgfmathcos{\x r}
\let\y\pgfmathresult
\draw[color=magenta](\x,\x)--(\x,\y)--(\y,\y);
\draw[color=orange,dotted,line width=0.8pt]%
(\x,\x)--(\x,0) node[below=8pt]{$u_\i$};
\pgfmathsetcounter{j}{\i+1}
\draw[color=blue,dotted,line width=0.8pt]%
(\x,\y)--(0,\y) node[left=8pt] {$u_\thej$};
\global\let\x\y}
\end{tikzpicture}
\caption{$f(x)=\cos (x)$}
\end{figure}
\end{document}
分段
我更新了我的解决方案,因为我发现了一个大问题pgfmathdeclarefunction
。问题很简单:语法错误:
\pgfmathdeclarefunction{p}{1}{% % I keep blank spaces between the brace and %
\pgfmathparse{#1>0.5 ? 1 : 2*#1 }}
我找到了另一个解决方案, declare function
但经过修正后代码就可以了pgfmathdeclarefunction
。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows}
\begin{document}
\thispagestyle{empty}
\begin{figure}[htbp]
\centering
\newcounter{j}
\begin{tikzpicture}[>=latex',scale=10,
declare function={%
p(\t)= greater(\t,0.5) ? 1 : 2* \t ;}]
\draw[color=blue,domain=0:1.2] plot (\x,{p(\x)});
\draw[color=green](0,0)--(1.2,1.2);
\draw[->](0,0)--(0,1) node[above]{$y$};
\draw[->](0,0)--(1,0) node[right]{$x$};
\newcommand{\x}{.1}
\foreach \i in {1,...,4}{%
\pgfmathparse{(p(\x)}
\let\y\pgfmathresult
\draw[color=magenta](\x,\x)--(\x,\y)--(\y,\y);
\draw[color=orange,dotted,line width=0.8pt]%
(\x,\x)--(\x,0) node[below=8pt]{$u_\i$};
\pgfmathsetcounter{j}{\i+1}
\draw[color=blue,dotted,line width=0.8pt]%
(\x,\y)--(0,\y) node[left=8pt] {$u_\thej$};
\global\let\x\y}
\end{tikzpicture}
\caption{if $x\leq 1$ then $ f(x)= 2x$ else $ f(x)= 1$}
\end{figure}
\end{document}
答案2
尝试研究 Sage,特别是 Sage Interact 教具。有人发布了一个蜘蛛网示例这里。它允许您输入所需的函数、选择迭代等等。我修改了上面链接上的代码,以便它输出到 PDF 文件。
def cobweb(a_function, start, mask = 0, iterations = 20, xmin = 0, xmax = 1):
'''
Returns a graphics object of a plot of the function and a cobweb trajectory starting from the value start.
INPUT:
a_function: a function of one variable
start: the starting value of the iteration
mask: (optional) the number of initial iterates to ignore
iterations: (optional) the number of iterations to draw, following the masked iterations
xmin: (optional) the lower end of the plotted interval
xmax: (optional) the upper end of the plotted interval
EXAMPLES:
sage: f = lambda x: 3.9*x*(1-x)
sage: show(cobweb(f,.01,iterations=200), xmin = 0, xmax = 1, ymin=0)
'''
basic_plot = plot(a_function, xmin = xmin, xmax = xmax)
id_plot = plot(lambda x: x, xmin = xmin, xmax = xmax)
iter_list = []
current = start
for i in range(mask):
current = a_function(current)
for i in range(iterations):
iter_list.append([current,a_function(current)])
current = a_function(current)
iter_list.append([current,current])
cobweb = line(iter_list, rgbcolor = (1,0,0))
return basic_plot + id_plot + cobweb
var('x')
@interact
def cobwebber(f_text = input_box(default = "3.8*x*(1-x)",label = "function", type=str), start_val = slider(0,1,.01,.5,label = 'start value'), its = slider([2^i for i in range(0,12)],default = 16, label="iterations")):
C = Graphics()
def f(x):
return eval(f_text)
C = cobweb(f, start_val, iterations = its)
C.show()
C.save("Cobweb.pdf")
您可以免费注册 Sage 账户这里。将代码复制并粘贴到单元格中,同时按下 Shift-Enter 键,您的操作就创建好了。您可以尝试(交互)这些参数,直到得到您想要的图表。运行代码的输出如下:
使用操作工具来创建图形将大大加快创建蛛网图的进程。