我正在尝试用循环对图中的几个函数求和(因为我试图使该过程自动化),但 foreach 似乎无法帮助我。
不幸的是,这个问题已经问过了 pgfplots:在 addplot 中使用 foreach 通过循环内的 addplot 提供与它所说的相反的内容。
\foreachitem\i\in\alistlst[]{
\addplot [domain=\i,samples=50]
{ \GainPurGdB{\GainTot}
+\IntegrGdB*\NbItegr
+\PremOrdrLieuReelGdB{\WcArray[1]}
+\PremOrdrLieuReelGdB{\WcArray[2]}
%\foreach \k in {1,...,\WcArraylen} {
% \ifnum\OrdrArray[\k]=1
% +\PremOrdrLieuReelGdB{\WcArray[\k]}
% \fi
% \ifnum\OrdrArray[\k]=2
% +\DeuxOrdrLieuReelGdB{\WcArray[\k]}{\ZArray[\k]}
% \fi
%}
}[LieuReel,#4];
该代码有效,但如果我尝试使用注释部分,它就不会编译。
你有主意吗?这是徒劳无功吗?
无论如何,感谢您花时间阅读本文。
编辑:添加 MWE
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots,listofitems}
\pgfplotsset{compat=1.16}
\newcommand*{\GainPurGdB}[1]{ 20*log10(#1) }
\newcommand*{\IntegrGdB}{
-20*(log10(x)) }
\newcommand*{\PremOrdrLieuReelGdB}[1]{
-(10*(log10(#1^2*x^2+1))) }
\newcommand*{\DeuxOrdrLieuReelGdB}[2]{
-10*(log10((1-(x/#1)^2)^2+4*(#2^2)*(x/#1)^2)) }
\newcommand*{\TracQUnGdB}{
\xdef\alist{(\Wmin):}
\foreachitem\i\in\WcArray[]{
\xdef\alist{\alist(0.5*1/\i),(0.5*1/\i):(2*1/\i),(2*1/\i):}
}
\xdef\alist{\alist(\Wmax)}
\foreach \i in \alist {
\addplot [domain=\i,samples=50]
{ \GainPurGdB{\GainTot}
+\IntegrGdB*\NbItegr
+\PremOrdrLieuReelGdB{\WcArray[1]}
+\PremOrdrLieuReelGdB{\WcArray[2]}
%\foreach \k in {1,...,\WcArraylen} {
% \ifnum\OrdrArray[\k]=1
% +\PremOrdrLieuReelGdB{\WcArray[\k]}
% \fi
% \ifnum\OrdrArray[\k]=2
% +\DeuxOrdrLieuReelGdB{\WcArray[\k]}{}
% \fi
%}
};
}
}
\newcommand*{\NbItegr}{1}
\newcommand*{\GainTot}{10}
\readlist\WcArray{10,0.1}
\readlist\OrdrArray{1,1}
\readlist\ZArray{0,0}
\begin{document}
\begin{center}
\begin{tikzpicture} % Inverses
\def\Wmax{10^(2)}
\def\Wmin{10^(-2)}
\begin{semilogxaxis}
[ymin=-90,ymax=80]
\TracQUnGdB
\end{semilogxaxis}
\end{tikzpicture}
\end{center}
\end{document}
答案1
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots,listofitems}
\pgfplotsset{compat=1.16}
\newcommand*{\GainPurGdB}[1]{ 20*log10(#1) }
\newcommand*{\IntegrGdB}{
-20*(log10(x)) }
\newcommand*{\PremOrdrLieuReelGdB}[1]{
-(10*(log10(#1^2*x^2+1))) }
\newcommand*{\DeuxOrdrLieuReelGdB}[2]{
-10*(log10((1-(x/#1)^2)^2+4*(#2^2)*(x/#1)^2)) }
\pgfplotsset{mysum/.code={%
\ifnum\OrdrArray[#1]=1
\edef\mysum{\mysum+\PremOrdrLieuReelGdB{\WcArray[#1]}}%
\fi
\ifnum\OrdrArray[#1]=2
\edef\mysum{+\DeuxOrdrLieuReelGdB{\WcArray[#1]}}%
\fi
}}
\newcommand*{\TracQUnGdB}{
\xdef\alist{(\Wmin):}
\foreachitem\i\in\WcArray[]{
\xdef\alist{\alist(0.5*1/\i),(0.5*1/\i):(2*1/\i),(2*1/\i):}
}
\xdef\alist{\alist(\Wmax)}
\foreach \i in \alist {
\edef\mysum{}
\pgfplotsset{mysum/.list={1,...,\WcArraylen}}
%\typeout{\mysum}
\expanded{\noexpand\addplot [domain=\i,samples=50]
{ \GainPurGdB{\GainTot}
+\IntegrGdB*\NbItegr
+\PremOrdrLieuReelGdB{\WcArray[1]}
+\PremOrdrLieuReelGdB{\WcArray[2]}
\mysum
};}
}
}
\newcommand*{\NbItegr}{1}
\newcommand*{\GainTot}{10}
\readlist\WcArray{10,0.1}
\readlist\OrdrArray{1,1}
\readlist\ZArray{0,0}
\begin{document}
\begin{tikzpicture} % Inverses
\def\Wmax{10^(2)}
\def\Wmin{10^(-2)}
\begin{semilogxaxis}
[ymin=-90,ymax=80]
\TracQUnGdB
\end{semilogxaxis}
\end{tikzpicture}
\end{document}