编辑
代码几乎完成了,但我有一个小而棘手的问题,实线应该从 y=3 开始(就像虚线一样),现在略高于 3。这是我的图:
这是预期的:
我已经检查了代码好几个小时,但我找不到导致这种差异的错误,而这种差异对我来说太重要了,有人能帮我吗?这是我的代码:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\pgfplotsset{every non boxed x axis/.append style={x axis line style=-},
every non boxed y axis/.append style={y axis line style=-}}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}
\begin{axis}[xlabel={signal},
ylabel={equilibrium bid},
axis lines=left,
declare function={H(\x,\n,\a,\b,\R)=
pow(\R,(\b*(\n-1)+1))*%0
pow(((\n*\b)+\a-1),(\b*(\n-1)))*%0
pow(((\n*\b)+\a),(-\b*(\n-1)))*%0
pow((\x),(-\b*(\n-1)))+(((\n*\b)+\a)/((\n*\b)+\a-1))*\x*%1
((\n-1)*\b)/((((\n-1)*\b)+1))*%0
(1-pow(\R,((\b*(\n-1))+1))*%1
pow(((\n*\b)+\a-1),(\b*(\n-1)+1))*%0
pow(((\n*\b)+\a),((-\b*(\n-1))-1))*%0
pow((\x),((-\b*(\n-1))-1)));},%-1
domain=2.1:2.7,no marks,samples=11
,smooth, ytick distance=0.01, ymin=2.995, ymax=3.055, xmin=2.1, xmax=2.7]
\addplot[color=black, domain=2.1429:2.7]{H(x,2,2.5,0.5,3)};
\addplot[color=black, dashed, domain=2.25:2.7]{H(x,3,2.5,0.5,3)};
\end{axis}
\end{tikzpicture}
\end{figure}
\end{document}
我检查了括号和乘法符号很多次,但确实找不到我的错误。
我很感激任何建议或修改,因为我真的需要得出这个结果。函数公式在文章的开头,也许那里有错误,但我找不到它。
答案1
您可以定义多个变量的函数,并将其中一个变量(或它们的组合)作为绘图变量,就像在任何(其他)计算机代数系统中一样。我没有动力输入您的完整函数,而只是“只”输入第一个项,但这足以说明这一点。
\documentclass[tikz,border=3mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\begin{document}
\begin{tikzpicture}
\begin{axis}[declare function={H(\x,\n,\a,\b,\R)=pow(\R,\b*(\n-1)+1)*
pow(\n*\b+\a-1,\b*(\n-1))*pow(\n*\b+\a,-\b*(\n-1))*pow(\x,-\b*(\n-1));},
domain=2:2.7,no marks]
\addplot{H(x,2,2.5,0.5,3)};
\addplot[color=red]{H(x,2,2.5,0.5,4)};
\end{axis}
\end{tikzpicture}
\end{document}
如您所见,在第二个图中,参数3
被更改为4
。
附录:至于您评论中的代码,如果您添加缺少的乘法符号,此代码将起作用。例如\b(\n-1)
需要变成\b*(\n-1)
。
\documentclass[tikz,border=3mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\begin{document}
\begin{tikzpicture}
\begin{axis}[declare function={H(\x,\n,\a,\b,\R)=pow(\R,\b*(\n-1)+1)*%
pow(\n*\b+\a-1,\b*(\n-1))*pow(\n*\b+\a,-\b*(\n-1))*pow(\x,-\b*(\n-1))+%
(\n*\b+\a)/(\n*\b+\a-1)*\x*(((\n-1)*\b)/((\n-1)*\b+1))*%
(1-pow(\R,\b*(\n-1)+1)*pow(\n*\b+\a-1,\b*(\n-1)+1)*%
pow(\n*\b+\a,-\b*(\n-1)-1)*%
pow(\x,-\b*(\n-1)-1));},
domain=2.1:2.7,no marks,samples=11,smooth]
\addplot[color=black]{H(x,2,2.5,0.5,3)};
\addplot[color=red]{H(x,2,2.5,0.6,3)};
\end{axis}
\end{tikzpicture}
\end{document}
需要补充的是,这个函数可能已经超出了pgfplots
单独使用时可以合理完成的范围。如果你增加样本,你就会明白为什么。
答案2
如果可以的话,我想用一个有用的技巧(他教我的)来完成@Schrodingerscat。
当你想绘制一个参数少于 9 个的函数时,将其包装tikzpicture
在\newcommand
:
\documentclass[tikz,export]{standalone}
% convert -density 300 -delay 12 -loop 0 -alpha remove MyGraph.pdf MyGraph.gif
\usepackage{animate}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\tikzset{
declare function={
H(\x,\n,\a,\b,\R)= pow(\R,\b*(\n-1)+1)*
pow(\n*\b+\a-1,\b*(\n-1))*
pow(\n*\b+\a,-\b*(\n-1))*
pow(\x,-\b*(\n-1));}}
\newcommand{\MyGraphWithParameters}[4]{
% \def\ParOne{#1}
% \def\ParTwo{#2}
% \def\ParThree{#3}
% \def\ParFour{#4}
\begin{axis}[domain=2:2.7,no marks,clip=true, ymin=1,ymax=5]
% \addplot{H(x,\ParOne,\ParTwo,\ParThree,\ParFour)};
\addplot{H(x,#1,#2,#3,#4)};
\addplot[color=red]{H(x,2,2.5,0.5,4)};
\end{axis}
}
\begin{document}
\foreach \i in {1,...,10} %each will be an independant frame in pdf you can call with `\includegraphics{}`
{\begin{tikzpicture}
\MyGraphWithParameters{\i}{2.5}{0.5}{3}
\end{tikzpicture}
}
\end{document}
然后,您可以按照说明轻松创建动画或 gif这里