使用 addplot 中的 foreach 来计算总和

使用 addplot 中的 foreach 来计算总和

我正在尝试用循环对图中的几个函数求和(因为我试图使该过程自动化),但 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}

在此处输入图片描述

相关内容