我想使用 tikz 绘制模糊隶属函数。这个问题已经在 梯形解决方案对于梯形 MF,但我需要一些类似的东西来用于 S 形函数。我不知道该怎么做...
我有这个代码:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\begin{scope}[xshift=5.5cm]
\draw[->] (0,0) -- node[below] {} (5,0) node[below] {Age};
\draw[->] (0,0) -- (0,1.5) node[left] {$\mu$};
\node at (-0.2,0) {0};
\node at (-0.2,1) {1};
\draw (0,1) -- (5,1);
\draw[scale=1,domain=0:5,smooth,variable=\x,blue] plot ({\x},{1/(1+exp(-1*(\x-3)))});
\draw[scale=1,domain=0:5,smooth,variable=\x,red] plot ({\x},{1/(1+exp(-3*(\x-1.5)))});
\end{scope}
\end{tikzpicture}
\end{document}
但我不明白为什么最后一部分的红线“落”在一个不同于 1 的值上,因为考虑到“情节”中使用的数学函数,这没有任何意义
答案1
您可以自己定义会员函数,并控制如何实现它。我已经定义了三角形、梯形、高斯和广义贝尔函数、S 形函数,您可以添加更多函数,例如单边函数等。请注意函数每行末尾的百分号。如果您省略它们,每次执行函数时,您的图都会向右移动,并带有空格,因为它们会被字体拾取。
我强烈推荐pgfplots
为此。它几乎是此类用途的最佳选择。
以下是一个例子
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}
\pgfmathdeclarefunction{fuzzytrapezoid}{4}{%
\begingroup%
\pgfmathparse{max(min((x-#1)/(#2-#1),1,(#4-x)/(#4-#3)),0)}%
\pgfmathfloattofixed{\pgfmathresult}%
\pgfmathreturn\pgfmathresult pt\relax%
\endgroup%
}
\pgfmathdeclarefunction{fuzzytriangle}{3}{%
\begingroup%
\pgfmathparse{max(min((x-#1)/(#2-#1),(#3-x)/(#3-#2)),0)}%
\pgfmathfloattofixed{\pgfmathresult}%
\pgfmathreturn\pgfmathresult pt\relax%
\endgroup%
}
\pgfmathdeclarefunction{fuzzygaussian}{2}{%
\begingroup%
\pgfmathparse{exp(-0.5*((x-#1)/#2)^2)}%
\pgfmathfloattofixed{\pgfmathresult}%
\pgfmathreturn\pgfmathresult pt\relax%
\endgroup%
}
\pgfmathdeclarefunction{fuzzygenbell}{3}{%
\begingroup%
\pgfmathparse{1/(1+abs((x-#3)/#1)^(2*#2))}%
\pgfmathfloattofixed{\pgfmathresult}%
\pgfmathreturn\pgfmathresult pt\relax%
\endgroup%
}
\pgfmathdeclarefunction{fuzzysigmoid}{2}{%
\begingroup%
\pgfmathparse{1/(1+exp(-#1*(x-#2))}%
\pgfmathfloattofixed{\pgfmathresult}%
\pgfmathreturn\pgfmathresult pt\relax%
\endgroup%
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[ymajorgrids,
ytick={0,1},tick style={draw=none},xtick=\empty,domain=0:10,no marks
]
%\addplot+[no marks] {1/(1+exp(-3*(x-1.5))};
\addplot+[] {fuzzytrapezoid(1,1.5,3,4)};
\addplot+[] {fuzzytriangle(2,5,7)};
\addplot+[samples=201] {fuzzygaussian(6.5,0.7)};
\addplot+[] {fuzzygenbell(4,-2,0.6)};
\addplot+[very thick] {fuzzysigmoid(1.5,4)};
\end{axis}
\end{tikzpicture}
\end{document}