我想使用 pgfplots 绘制一个定义为无限序列的函数。这可能吗?如何实现?该函数由以下公式给出
\[u(t,x)=\sum_{n=1}^{+\infty}\frac{\sin(2nt)\sin(nx)}{n^2}.\]
我们可以给出t
一些固定值,比如t=0.1, 0.2, 1, 4
,并尝试绘制仅的函数x
,但仍然被无限和所阻止。
事实上,我能做的是使用单个函数,比如 n=2 或 3 或 N 中的任何固定值。但对于无限和,我不知道。这是一个 mwe。
\documentclass{article}
\usepackage{xcolor,pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot3 [surf,domain=0:pi,domain y=0:1] {sin(4*deg(y))*sin(2*deg(x))/4};
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}[
axis lines=center,
enlargelimits=true,]
\addplot[thick, red, domain=0:pi, smooth, samples=300] {sin(4)*sin(2*deg(x))/4};
\addplot[thick, green ,domain=0:pi, smooth, samples=300] {sin(8)*sin(2*deg(x))/4};
\addplot[thick, blue, domain=0:pi, smooth, samples=300] {sin(12)*sin(2*deg(x))/4};
\legend{$t=1$, $t=2$, $t=3$};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
您可以通过将无穷级数截断为一定数量的项来近似无穷级数。实际上,您应该选择合理的高项数以获得良好的近似值。在这种情况下,我将向您展示如何将级数截断为 10 个项。您可以根据需要轻松调整项数。
为了使代码更简洁,您可以使用循环来生成总和中的项。以下是使用 t=0.1、0.2、1 和 4 的函数的示例:
\documentclass[margin=3mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\RepeatFunction}{mm}{\int_step_function:nnN{#1}{#2}\RepeatFunction:n}
\pgfplotsset{repeatable~function/.code=\DeclareExpandableDocumentCommand{\RepeatFunction:n}{m}{#1}}
\ExplSyntaxOff
\pgfplotsset{
/pgf/declare function={sinsin(\n,\t,\x)=sin(2*\n*\t)*sin(\n*\x)/(\n*\n);},
repeatable function={+sinsin(#1,\t,x)},
sinsin terms/.initial=10,
sinsin terms/.code={\pgfplotsset{sinsin terms/.initial=#1}}
}
\begin{document}
\foreach \t in {0.1, 0.2, 1, 4}{
\begin{tikzpicture}
\begin{axis}[
trig format plots=rad,
axis lines=center,
enlargelimits,
xtick = {0, pi/4, pi/2, 3*pi/4, pi},
xticklabels = {0, $\pi/4$, $\pi/2$, $3\pi/4$, $\pi$},
domain=0:pi,
samples=201,
no marks,
title={t = $\t$},
legend pos={outer north east},
sinsin terms=10 % Set the number of terms here
]
\addplot[blue] {\RepeatFunction{1}{\pgfkeysvalueof{/pgfplots/sinsin terms}}};
\end{axis}
\end{tikzpicture}
}
\end{document}
答案2
1/N
这个无穷和收敛得非常慢,因为如果使用项,你预计绝对误差为 阶N
。这大致意味着如果你想要多一位小数,你需要十倍的项。对于假设1
地图为 的图形1cm
,你应该瞄准 的精度0.1mm
,但要知道如果连续的最终绘图将使用贝塞尔曲线应用一些插值(使用直线段将显示明显的斜率变化)。这意味着(我没有太认真地估计)你开始知道你需要大约 100 个项。由于隐含常数很重要,也许 20 个项就足够了。然后,注意计算的数值精度。
正如其他答案所解释的那样,您似乎需要使用 TikZ 做一些工作,并且没有简单的类型语法add(sin(2n*t)sin(n*x)/n^2, n from 1 to N)
。
u(t,x) = (v(2t-x)-v(2t+x))/2
后台部门的一位同事曾指出,他有一定程度的弦理论经验,在这种情况下,你可以用一个精确的公式来表达和(显然数学家并不总是能够做到这一点)。首先
v(y) = \sum_{n=1}^\infty \frac{\cos(n y)}{n^2}
我们都知道这v(2\pi u)
是由一个因子决定的,该因子在区间上[0,1]
有值,B_2(u)
其中B_2
是第二个伯努利多项式,B_2(u) = u^2 - u + 1/6
。准确地说
\sum_{n=1}^\infty \frac{\cos(2\pi n u)}{n^2} = \pi^2B_2(\{u\})
其中\{u\}
是分数部分。这实际上是基于欧拉求值的傅里叶级数的著名证明之一,\sum 1/n^2 = \pi^2/6
我们可以通过代入 看到u=0
。
总结
\sum_{n=1}^\infty \frac{\sin(2n t)\sin(nx)}{n^2} =
\frac{\pi^2}2\left(B_2(\{\frac{2t-x}{2\pi}\})-
B_2(\{\frac{2t+x}{2\pi}\})\right)
左边\pi
在 中是 -周期的,在 中是 -周期的,t
并且是奇数的。所以我将假设和。还设使得和。我将在这里简化以与其他图片中的图进行比较,并假设 不仅如此并且并且 的第二个贡献是。(人们可以使用 中的奇数来始终简化为这种情况)。所以2\pi
x
0<x<\pi
0<t<\pi
x'=x/2\pi
0<x'<1/2
t' = t/2\pi
0<t'<1/2
0<t'<1/4
0<2t'+x' < 1
B_2
B_2(2t'+x')
t
0<t<\pi/2
0<x'<2t'<1/2
:我们得到(2t'-x')^2 - (2t'-x') + 1/6 - (x'+2t')^2 + (x'+2t') - 1/6 = -8x't'+2x' = (2 - 8t') x'
,我们不要忘记乘法因子\pi^2/2
。因此线性增长达到 处2\pi^2(1 - 4t')t'
的值x'=2t'
。由于t'=t/2\pi
,这是t(\pi - 2t)
。例如对于t=0.1
我们得到0.294159...
。希望我计算正确,如果不是以后,我会改正并悔改,但这超出了我的 TeX 知识范围。2t'<x'<1/2
:现在2t'-x'<0
我们使用的均匀度B_2(\{u\})
并将其替换为,x'-2t'
以便可以应用公式,我们得到(直到\pi^2/2
:(x'-2t')^2 - (x'-2t') + 1/6 - (x'+2t')^2 + (x'+2t') - 1/6 = -8t'x' +4t' = 4t'(1 - 2x')
它是线性减少的,朝着0
在的值x'= 0.5
并且从x'=2t'
在4t'(1-4t')
(倍)开始\pi^2/2
,所以t(\pi-2t)
(在它应该)是与之前找到的值相同的值。
因此,我们可以用无穷多项式来解释极限图的确切形状:它在(0,\pi)
(对于t<\pi/2
)上由两条直线段组成,它们在笛卡尔坐标的点处相交,并在和(2t,(\pi - 2t)t
处为零纵坐标。我试图从我的物理学博士同事那里重新构建解释,所以不要在没有独立咨询的情况下将其用作家庭作业。x=0
x=\pi
答案3
正如其他人所说,不,你无法计算无穷大的总和。
但是,您可以计算出直到特定点的总和。
宏应该可以帮到你。它只是对所有整数值重复给定的函数\RepeatFunction{s}{e}
n之间。s
e
可以使用代表值的函数来指定repeatable function
它应该使用的函数#1
n。
由于您的函数也是参数化的,因此我还添加了sinsin t
可重复函数使用的值键。
如果你只想绘制此函数一次(对于给定的吨)你需要自己弄清楚n停止。
代码
\documentclass[tikz]{standalone}
\usepackage{pgfplots}\pgfplotsset{compat=1.18}
\usepgfplotslibrary{groupplots}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\RepeatFunction}{mm}{\int_step_function:nnN{#1}{#2}\RepeatFunction:n}
\pgfplotsset{repeatable~function/.code=\DeclareExpandableDocumentCommand{\RepeatFunction:n}{m}{#1}}
\ExplSyntaxOff
\pgfplotsset{
/pgf/declare function={sinsin(\n,\t,\x)=sin(2*\n*\t)*sin(\n*\x)/(\n*\n);},
repeatable function={+sinsin(#1,\pgfkeysvalueof{/pgfplots/sinsin t},x)},
sinsin t/.initial=1}
\begin{document}
\begin{tikzpicture}[
mini legend/.style={at={(rel axis cs:.5,0)}, above, node contents={$t = #1$}}]
\begin{groupplot}[
group style={group size = 2 by 2},
%
trig format plots=rad, axis lines=center, enlargelimits,
xtick = {0, pi/4, pi/2, 3*pi/4, pi},
xticklabels = {0, $\pi/4$, $\pi/2$, $3\pi/4$, $\pi$},
domain=0:pi, samples=129, no marks,
every axis legend/.append style={
at={(1,1)}, anchor=north west, path only,
/tikz/column 2/.append style={anchor=west}},
style 10+/.style={path only},
style 10/.style={thick, densely dashed, black}
]
\nextgroupplot
\pgfplotsinvokeforeach{1,...,5,10}{
\addplot+[style #1+/.try, forget plot, very thin] {sinsin(#1,1,x)};
\addplot+[style #1/.try] {\RepeatFunction{1}{#1}};
}
\node[mini legend=1];
\nextgroupplot[sinsin t=2]
\pgfplotsinvokeforeach{1,...,5,10}{
\addplot+[style #1+/.try, forget plot, very thin] {sinsin(#1,2,x)};
\addplot+[style #1/.try] {\RepeatFunction{1}{#1}};
\addlegendentry{$n = #1$}
}
\node[mini legend=2];
\nextgroupplot[sinsin t=.2]
\pgfplotsinvokeforeach{1,...,5,10}{
\addplot+[style #1+/.try, forget plot, very thin] {sinsin(#1,.2,x)};
\addplot+[style #1/.try] {\RepeatFunction{1}{#1}};
}
\node[mini legend=0.2];
\nextgroupplot[sinsin t=.5]
\pgfplotsinvokeforeach{1,...,5,10}{
\addplot+[style #1+/.try, forget plot, very thin] {sinsin(#1,.5,x)};
\addplot+[style #1/.try] {\RepeatFunction{1}{#1}};
}
\node[mini legend=0.5];
\end{groupplot}
\end{tikzpicture}
\end{document}
输出
答案4
我发现你的问题很难解释,所以我需要进一步解释我的方法。首先,你的问题是“我想使用 pgfplots 绘制一个定义为无限级数的函数。这可能吗?怎么做?”。正如 Zarko 所指出的,答案必然涉及有限数量的项。它不会是精确的。所以我将解释如何在假设 的情况下绘制 1 个无限级数t=.1
。
当你开始研究更复杂的数学时,重要的是要意识到你的计算和绘图的准确性可能不正确;pgfplots
毕竟不是计算机代数系统 (CAS)。我发现首先使用 CAS 确定答案应该是什么很有帮助。之后,使用 sagetex 包将 CAS 绘图/计算合并到你的 LaTeX 文档中。你谈到t
首先修复一个值,所以我选择了t=.1
并转到了一个Sage 单元服务器您可以在其中复制/粘贴以下代码:
def f(t,n):
return (sin(2*n*t)*sin(n*x))/(n^2)
g(x)=sum(f(.1,n) for n in range(1,21))
h(x)=sum(f(.1,n) for n in range(1,201))
P1=plot(g(x),(x,0,3.14))
P2=plot(h(x),(x,0,3.14),color="red")
(P1+P2).show()
按下Enter
按钮,您将获得以下输出:
从这个输出中,我看到绘制该系列的 20 个项可以给我一个相当不错的估计值,这就是我将在我的 LaTeX 文档中使用它。你应该尝试找到n
你认为最有效的值。为什么我说 20 个项?因为range(1,21)
是 Python,它不会运行最后一个值,所以我使用的图总结了前 20 个项。还要注意,我已经定义了 f(t,n) 的一般形式。你可以轻松地将其更改t
为你想要的任何形式。我们pgfplots
现在要绘制的是g(x)
但由于我们不能相信这个复杂数学的数值准确性,我们将使用鼠尾草将 Sage CAS 计算链接到我们的文档。代码如下:
\documentclass{article}
\usepackage{sagetex,xcolor,pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{sagesilent}
def f(t,n):
return (sin(2*n*t)*sin(n*x))/(n^2)
g(x)=sum(f(.1,n) for n in range(1,21))
x_coords = [x for x in srange(0,6.28,.01)]
y_coords = [g(x).n(digits=4) for x in x_coords]
output = r"\begin{tikzpicture}"
output += r"\begin{axis}[xmin=0,xmax=6.28,ymin= -.5,ymax=.5,"
output += r"xlabel=$x$,ylabel=$y$,axis x line=middle,axis y line=middle,"
output += r"grid style=dashed]"
output += r"\addplot[thin, blue] coordinates {"
for i in range(0,len(x_coords)-1):
output += r"(%f , %f) "%(x_coords[i],y_coords[i])
output += r"};"
output += r"\end{axis}"
output += r"\end{tikzpicture}"
\end{sagesilent}
\sagestr{output}
\end{document}
在 Cocalc 中运行的输出如下所示:
注意,我更改了图表,使其约为 2pi(约 6.28)。该行将x_coords = [x for x in srange(0,6.28,.01)]
设置要绘制的 x 值,即 0、.01、....、6.27。该行y_coords = [g(x).n(digits=4) for x in x_coords]
表示,计算每个 x 值的 g(x),但我们强制将答案设为小数(有 4 个有效数字),以便 pgfplots 可以处理它。请注意,使用Sage
along withsagetex
可以避免在 sin(2(1)(.1))*sin((1)x))/(1^2)+....+sin(2(20)(.1))*sin((20)x))/(20^2) 中输入 20 项。最后,将代码作为原始字符串插入似乎很奇怪;之所以这样做,是因为在幕后处理文档需要 3 步:首先,LaTeX 代码必须按原样运行,然后 Python/Sage 代码必须无错误运行,然后再处理文档一次,将 Python/Sage 输出放入 LaTeX 文档中。如果没有字符串,代码很可能在第一遍就无法在 LaTex 下运行。
智者是一款免费的 CAS,不属于 LaTeX。您可以将其下载到您的计算机并使其与 LaTeX 配合使用,但最简单的入门方法是打开一个免费的可钙帐户,在那里创建一个 LaTeX 文档,复制/粘贴代码,然后按Build
。