tzplot
私は packageの代わりに packageを使い始めましたtikz
。便利なショートカットがたくさんあります。しかし、今、問題が発生しています (おそらく私のミスです)。このコードから:
\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}
次のような出力があります:
必要なコードは次のとおりです:...
- 2つの関数をプロットします。
- 2つの関数の間の領域を網掛けする(これには\Nパラメータを設定できます)
- 網掛け部分の近似値(リーマン法)を1つ計算します。
最初の 2 つのポイントについては問題ありません。3 番目のポイントの結果は常にゼロになります (図の黄色のゾーンを参照)。同じゾーンで、面積値ではなく、以前に計算された 、 、 のいずれかを印刷しようとすると、エラーが\Rx
発生します。したがって、これらの変数の計算から問題が発生していると思います。何か提案はありますか? (英語が下手で申し訳ありません)\Ry
\Sx
\Sy
注: 図の場合、網掛け部分の値は面積の 7.68 単位に等しくなければなりません。
注 1: ループ内部の 1 つの変数をループ外部で使用することはできない可能性があります。しかし、解決策が 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
ドキュメント レベルで使用する 1 文字のマクロを定義する場合は注意が必要です。