Пакет tzplot: проблемы с расчетом площади

Пакет tzplot: проблемы с расчетом площади

Я начал использовать tzplotpackage вместо tikzpackage. Есть много полезных сокращений. Но теперь у меня проблема (возможно, это моя ошибка). Из этого кода:

\documentclass[12pt,a4paper]{article}
\usepackage{tzplot}
\def \N {50} % <-- change to higher/lower number if You want a more/less accurate shading
\begin{document}
    \begin{tikzpicture}[font=\scriptsize,scale=1.5]
        % axex, grid and ticklabels
        \tzhelplines[thick](-2,-4)(2,2)
        \tzshoworigin
        \tzaxes(-2,-4)(2,2)
        \tzticks{-2,-1,,1,2} % x-ticks
        {-4,-3,-2,-1,1,2} % y-ticks
        % plotting
        \clip (-2,-4) rectangle (2,2);
        \def\Fx{.3*(\x)^3-2} % <-- def cubic (F)
        \tzfn\Fx[-2:2]       % <-- naming the path F
        \def\Gx{-2*(\x)^2+2} % <-- def parabola (G)
        \tzfn\Gx[-2:2]       % <-- naming the path G
        \tzXpoint*{Fx}{Gx}(P){$A$}[0]{2pt}
        \tzdot(P-2){$B$}[0]{2pt}  
        \tzgetxyval(P){\Px}{\Py}% <-- coordinate of first point of intersection between F and G
        \tzgetxyval(P-2){\Qx}{\Qy}% <-- coordinate of second point of intersection between F and G
        \pgfmathsetmacro{\dx}{(\Qx-\Px)/\N};
        \def \t {0}; % <-- initial Riemann area
        \foreach \n in {0,1,...,\N}{% <-- loop for shading area
            \pgfmathsetmacro{\x}{\Px+\n*\dx};
            \tzvXpointat{Fx}{\x}(R)%{$R_\n$}[b]
            \tzgetxyval(R){\Rx}{\Ry} % <-- IT SEEMS DONT WORK IN THIS CASE
            \tzvXpointat{Gx}{\x}(S)%{$S_\n$}[t]
            \tzgetxyval(S){\Sx}{\Sy} % <-- IT SEEMS DONT WORK IN THIS CASE
            \pgfmathsetmacro{\t}{\t+(\Sy-\Ry)*\dx} %<-- temporary Riemann area
            \draw[blue!50,opacity=.3] (R)--(S);
        }
        \tzfn[very thick,magenta]\Fx[-2:2]
        \tzfn[very thick,cyan]\Gx[-2:2]
        \draw (0,-3.5) node[fill=yellow,font=\ttfamily] {Area|,=\;\t}; % <-- final Riemann area
    \end{tikzpicture}
\end{document}

У меня такой вывод:

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

С нужным мне кодом:...

  1. построить график двух функций;
  2. заштриховать область между двумя функциями (для этого я могу задать параметр \N)
  3. вычислите одно приблизительное значение (метод Римана) заштрихованной площади.

Для первых двух точек проблем нет. Для третьей точки результат всегда равен нулю (см. на рисунке желтую зону). Если в той же зоне я пытаюсь напечатать не значение площади, а любое из \Rx, \Ry, \Sx, \Syпредварительно вычисленных, у меня возникают ошибки. Поэтому я думаю, что проблемы возникают из-за исчисления этих переменных. Есть какие-нибудь предложения? (Извините за мой английский)

Примечание: в случае рисунка значение заштрихованной площади должно быть равно 7,68 единиц площади.

Примечание 1: Возможно, нельзя использовать одну переменную внутри цикла вне цикла! Но я не могу найти одно решение...

решение1

Я думаю, что ваш расчет полностью в порядке, но вы сталкиваетесь с проблемами области действия, поскольку все внутри \foreachцикла имеет область действия. Поэтому вам нужно вынести вычисленное значение за пределы цикла, используя \global\letили что-то вроде этого:

\documentclass[12pt,a4paper]{article}
\usepackage{tzplot}
\def\N{50} % <-- change to higher/lower number if You want a more/less accurate shading
\begin{document}
    \begin{tikzpicture}[font=\scriptsize,scale=1.5]
        % axex, grid and ticklabels
        \tzhelplines[thick](-2,-4)(2,2)
        \tzshoworigin
        \tzaxes(-2,-4)(2,2)
        \tzticks{-2,-1,,1,2} % x-ticks
        {-4,-3,-2,-1,1,2} % y-ticks
        % plotting
        \clip (-2,-4) rectangle (2,2);
        \def\Fx{.3*(\x)^3-2} % <-- def cubic (F)
        \tzfn\Fx[-2:2]       % <-- naming the path F
        \def\Gx{-2*(\x)^2+2} % <-- def parabola (G)
        \tzfn\Gx[-2:2]       % <-- naming the path G
        \tzXpoint*{Fx}{Gx}(P){$A$}[0]
        \tzdot(P-2){$B$}[0]  
        \tzgetxyval(P){\Px}{\Py} % <-- coordinate of first point of intersection between F and G
        \tzgetxyval(P-2){\Qx}{\Qy} % <-- coordinate of second point of intersection between F and G
        \pgfmathsetmacro{\dx}{(\Qx-\Px)/\N}
        \def\gt{0} % <-- initial Riemann area (global variable)
        \def\t{0}  % <-- initial Riemann area (local variable inside loop)
        \foreach \n in {0,1,...,\N} { % <-- loop for shading area
            \pgfmathsetmacro{\x}{\Px+\n*\dx}
            \tzvXpointat{Fx}{\x}(R) % {$R_\n$}[b]
            \tzgetxyval(R){\Rx}{\Ry} 
            \tzvXpointat{Gx}{\x}(S) % {$S_\n$}[t]
            \tzgetxyval(S){\Sx}{\Sy} 
            \pgfmathsetmacro{\t}{\gt + (\Sy-\Ry)*\dx} % <-- temporary Riemann area
            \global\let\gt\t % <-- set global variable to new value
            \draw[blue!50,opacity=.3] (R)--(S);
        }
        \tzfn[very thick,magenta]\Fx[-2:2]
        \tzfn[very thick,cyan]\Gx[-2:2]
        \draw (0,-3.5) node[fill=yellow,font=\ttfamily] {Area\;=\;\gt}; % <-- final Riemann area
    \end{tikzpicture}
\end{document}

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

Кстати, я бы был осторожен с определением однобуквенных макросов \defна уровне документа.

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