pgfplots: 区分関数(立ち上がりエッジと立ち下がりエッジを持つ鋸歯状関数)を宣言するためのより効率的な方法

pgfplots: 区分関数(立ち上がりエッジと立ち下がりエッジを持つ鋸歯状関数)を宣言するためのより効率的な方法

鋸歯状関数に似た繰り返し関数を描きたいのですが、これまではこれポストと手動で定義された3つの歯:

% starting https://tex.stackexchange.com/questions/132476/piecewise-function-using-pgfplots

\documentclass[tikz,border=3mm]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}[
  declare function={
    func(\x) = 
    % 1st tooth
        % shifted by 0    
        (\x<=1) * (3*(\x-0))   +
        % shifted by 1
     and(\x>1, \x<=4) * (-1*(\x-1)+3) + 
    % 2nd tooth
        % shifted by 4    
     and(\x>4, \x<=5) * (3*(\x-4)) +
        % shifted by 5     
     and(\x>5, \x<=8) * (-1*(\x-5)+3) +
    % 3rd tooth
        % shifted by 8    
     and(\x>8, \x<=9) * (3*(\x-8)) +
        % shifted by 9     
     and(\x>9, \x<=12) * (-1*(\x-9)+3);     
  }
]
\begin{axis}[
  axis x line = middle, 
  axis y line = middle,
  samples = 1200, % I need sharp edges
  grid,
]
\addplot[red, 
        thick, 
        domain=0:12,
        mark=none,
        sharp plot
        ]
        {func(x)-1}; % y shift by -1
\end{axis}
\end{tikzpicture} 
\end{document}

ここに画像の説明を入力してください

私の質問は次のとおりです:

1番目の質問(最も重要な質問)

すべての歯を手動で定義せずに、任意の数の歯の機能を定義する賢い方法はありますか?

modulo物が入らないジェイクの答えここ- おそらくこれが鍵です。

2番目の質問(あれば便利です)

上昇勾配は +1、下降勾配は -3 です。この例の周期は +4、振幅は +3 です。これらは関数のパラメータになるのでしょうか? もちろん、4 つのパラメータは接続されています。

3番目の質問(これもあれば便利です)

図のように最大値と最小値に番号を付けたいのですが、これは実際には「先進国の問題」です。

ここに画像の説明を入力してください

アップデート

LaTeX ソリューションが得られるまで、私は Excel を使用して貧乏人のソリューションを作成しました。

テキストはドイツ語で、トルク角度図のような意味です。

ここに画像の説明を入力してください


percusseの回答に関する追加情報

  • 1つのとして期間そしてbとして立ち上がりエッジの割合(0.1 --> 10%)。
  • 私はドイツのシステムを持っているので、小数点コンマ次の図の(、)を参照してください。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

答え1

これは、関数を実装する 1 つの方法です。パラメータは、歯の周波数周期と、歯の上昇に費やされる割合を定義するパーセンテージです。

この関数はマップするように定義されている[0,1]ため、加算によってシフトしたり、乗算によってスケールしたりできます。

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\begin{document}
\begin{tikzpicture}[
  declare function={func(\x,\a,\b) = (mod(\x,\a)/\a<\b? % If 
                                      mod(\x,\a)/\b/\a: % Yes
                                      (\a-mod(\x,\a))/(\a-\b*\a));} % No
]
\begin{axis}[axis x line = middle,axis y line = middle,
    samples = 301,grid,ymax=1.1,ymin=0,domain=0:4, no marks,thick]
\addplot {func(x,1,0.75)};
\addplot {func(x,2,0.1)};
\end{axis}
\end{tikzpicture} 
\end{document}

ここに画像の説明を入力してください

関連情報