pgfplots: Более эффективный способ объявления кусочной функции (пилообразная функция с нарастающим и нисходящим фронтом)

pgfplots: Более эффективный способ объявления кусочной функции (пилообразная функция с нарастающим и нисходящим фронтом)

Я хочу нарисовать повторяющуюся функцию, похожую на пилообразную функцию. До сих пор я начинал сэтотпост и вручную определены три зуба:

% 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. Могут ли они каким-то образом быть параметрами функции? Конечно, четыре параметра связаны.

3-й вопрос (тоже приятно)

Я бы хотел пронумеровать максимумы и минимумы, как на картинке. Но это действительно «проблема первого мира».

введите описание изображения здесь

Обновлять

Пока у меня нет решения LaTeX, я делаю жалкое решение с помощью Excel.

Текст на немецком языке и означает что-то вроде диаграммы крутящего момента и угла.

введите описание изображения здесь


Дополнительная информация относительно ответа percusse

  • Сакакпериодибкакдоля восходящего фронта(0,1 --> 10 %).
  • У меня немецкая система, поэтомудесятичный разделительэтозапятая(,) на следующих фотографиях.

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

решение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}

введите описание изображения здесь

Связанный контент