目前,我正在尝试将使用 python 和 matplotlib 制作的图转换为 pgfplot,但该图为常数零。我检查了公式,它似乎是正确的,所以我不知道为什么这些图不同。这是 tex 和 python 代码:
\begin{tikzpicture}
\pgfmathsetmacro{\r}{4}
\pgfmathsetmacro{\l}{(20e-6)}
\pgfmathsetmacro{\c}{((1/20)*1e-6)}
\begin{axis}[
xmin=1,
xmax=2e6,
samples=5000,
xlabel=$\omega$]
\addplot[domain=2:2e6, black, thick] {1/(1 + ((x*\l)/\r - 1/(x*\r*\c))^2)};
\end{axis}
\end{tikzpicture}
def frac(a, b):
return a / b
def h(w, r, l, c):
return frac(1, 1 + (frac(w*l, r) - frac(1, w*r*c))**2)
我很高兴得到任何帮助!
答案1
您的问题是 正在对\pgfmathsetmacro{}
数字进行四舍五入,并且 的数字范围pgfmath
非常有限(参见注释 2)。我添加了一个调试节点来向您显示您的\l
(参见注释 1)是0.0
...
我建议使用这种declare function
工具(此外,语法要好得多)。数字范围仍然会受到限制,而且dimension too large
很容易出错,但它更稳定。
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,positioning,calc}
\usepackage{pgfplots}\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro{\l}{(20e-6)}
\tikzset{declare function={
L=20e-6;
R=4;
C=(1/20)*1e-6;
}
}
\node[red] at (3,3) {l is \l}; % just to debug
\begin{axis}[
xmin=1,
xmax=2e6,
samples=150,
xlabel=$\omega$]
\addplot[domain=2:2e6, black, thick] {1/(1 + (x*L/R - 1/(x*R*C))^2)};
\end{axis}
\end{tikzpicture}
\end{document}
注1:尽量不要使用单字母宏。这非常危险,因为核心 LaTeX 中有很多宏是为重音符定义的,事情可能会以难以想象的方式爆发。
笔记2:pgfplots
手册上说:
但请注意,使用fpu
手动操作可能比较棘手。
还有其他数学引擎,例如xfp
,它们更“标准”,但与其他引擎的集成度不是很好pgf
。对于非常复杂的计算,最好使用外部工具,然后导入数据点。