我尝试使用 tikz 绘制一个函数。但是,当我稍微更改一个参数时,它看起来很糟糕(见下面的代码)。该函数只是一个 6 次多项式。我做错了什么?
可以更改的参数是\s
。如果是,0.8
我会收到一个Dimension too large!
我也不明白的错误。
第一张图片的参数\s
为0.75
。第二张图片的参数为0.65
,平滑得多,但仍然很糟糕。
(这个参数的原因是,最后我想为该参数的不同值绘制该函数。)
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[domain=0:1,scale=3]
\def \d {3};
\draw[->] (0,0) -- (1,0); %axis
\draw[->] (0,0) -- (0,1);
\draw[color=black,domain=0:1] plot[samples=100](\x,{\x});
\pgfmathsetmacro{\s}{0.75}; %the closer to 0.8, the worse (smaller = better)
\draw[color=black,domain=\s:1] plot[samples=100](\x,{\x*pow(\x-(2*\s-1),\d)*pow(\x-1,\d)/(pow(1-\s,\d)*pow(\s-1,\d))});
\end{tikzpicture}
\end{document}
答案1
您还可以使用该fpu
库来获得更高的精度。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{fpu}
\begin{document}
\begin{tikzpicture}[domain=0:1,scale=3,
/pgf/fpu,/pgf/fpu/output format=fixed % activate fpu for tikzpicture
]
\def \d {3};
\draw[->] (0,0) -- (1,0); %axis
\draw[->] (0,0) -- (0,1);
\draw[color=black,domain=0:1] plot[samples=100](\x,{\x});
\pgfmathsetmacro{\s}{0.75}; %the closer to 0.8, the worse (smaller = better)
\draw[color=black,domain=\s:1] plot[samples=100](\x,{\x*pow(\x-(2*\s-1),\d)*pow(\x-1,\d)/(pow(1-\s,\d)*pow(\s-1,\d))});
\end{tikzpicture}
\end{document}
答案2
这只是部分答案:这似乎是一个数值问题。tikz 的算法精度似乎很低。重新排列多项式中的项以增加表达式的稳定性,结果曲线更加平滑。基本上,我将表达式a^d / b^d
改为(a/b)^d
。
\pgfmathsetmacro{\s}{0.8};
\draw[color=black,domain=\s:1] plot[samples=100](\x,{\x*pow((\x-(2*\s-1))/(1-\s),\d)*pow((\x-1)/(\s-1),\d)});