\addplot 中的函数总和

\addplot 中的函数总和

假设我有一个函数f(x,k)取决于一个整数我现在想用 来pgfplots绘制函数g(x)= f(x,0)+ f(x,1)+ ... + f(x,n)。我该如何实现这一点?这是我的代码:

    \begin{tikzpicture}
        \begin{axis}[
        axis lines=middle,
        xmin=-3, xmax=3,
        ymin=0, ymax=0.45,
        domain=-3:3,
        samples=100,
        smooth,
        xlabel=$x$,
        ylabel=$f(x)$,
        every axis y label/.style={at=(current axis.above origin),anchor=south},
        every axis x label/.style={at=(current axis.right of origin),anchor=west},
        xtick={-3,-2,-1,0,1,2,3},
        ytick={0,0.1,0.2,0.3,0.4},
        xticklabels={-3,-2,-1,0,1,2,3},
        yticklabels={0,0.1,0.2,0.3,0.4},
        enlargelimits=upper,
        clip=false
        ]
        
        \addplot[blue,thick] {x^2};
        \end{axis}
    \end{tikzpicture}

我现在想要的是这样的:

        \addplot[blue,thick] {x^2+(x+1)^2+...+(x+100)^2};

答案1

有点晚了,但简短的答案是更改 ymin 和 ymax: ymin=305000, ymax=380000,,根据需要调整 y 轴标签,然后将函数更改为101*x^2+10100*x+338350。在 Gummi 中运行的结果是: 在此处输入图片描述

这个答案可能看起来有点奇怪,所以去Sage 单元服务器并复制/粘贴以下代码

f=x^2
for i in range(1,101):
    f+=(x+i)^2
plot(f,-100,100)

然后按Evaluate获取 在此处输入图片描述

我们正在处理看起来像抛物线的东西,如果你仔细想想,总和中的 101 项都是二次项。x^2 项的系数均为 1,因此函数为 101x^2。x 项为 2x、4x、...、200x,因此 x 的系数为 2(1+2+...+100)。有一个公式可以计算 2(100/2)(1+100)。常数项为 1^2+2^2+3^2+...+100^2。还有一个公式可以计算 (1/6)(100)(100+1)(2(100)+1)。不过,Sage 单元服务器可以完成这项工作: 在此处输入图片描述

在更一般的情况下,无法推理,你可以使用鼠尾草包,它依赖于开源计算机代数系统来完成工作。对于这个问题,我们可以写成

\documentclass{article}
\usepackage{sagetex,amsmath,amssymb,tikz,pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{sagesilent}
f=x^2
for i in range(1,101):
    f+=(x+i)^2
g=diff(f,x)
sol = solve(g==0,x)
\end{sagesilent}
Let $f(x,k)=\sum_{i=0}^{k}(x+i)^2$. For $k=100$ this becomes, after 
explanding and collecting like terms, $f(x,100)=\sage{simplify(expand(f))}$
which is a parabola. Since $f'(x)=\sage{g}$ the minimum value is when 
$x=\sage{sol[0].rhs()}$.
The plot of $f(x,100)$ looks like this over $[-3,3]$:
\begin{center}
\begin{tikzpicture}
\begin{axis}[axis lines=middle,xmin=-3,  xmax=3,ymin=305000,ymax=380000,domain=-3:3,samples=100,  smooth,xlabel=$x$,ylabel=$f(x)$, every axis y label/.style={at=(current axis.above origin), anchor=south},every axis x label/.style={at=(current axis.right of origin), anchor=west},xtick={-3,-2,-1,0,1,2,3},xticklabels={-3,-2,-1,0,1,2,3},enlargelimits=upper, clip=false]
\addplot[blue,thick] {101*x^2+10100*x+338350};
\end{axis}
\end{tikzpicture}
\end{center}
\end{document}

Cocalc 中的结果是: 在此处输入图片描述

请注意,f=x^2 for i in range(1,101):f+=(x+i)^2定义函数(最后一个数字 101 在 Python 中不执行)。我可以提取展开式\sage{simplify(expand(f))},计算其导数,g=diff(f,x)并找到最小值sol = solve(g==0,x)。然后可以将这些值放入 LaTeX 文档中。

Sage 不是 LaTeX 的一部分,因此您需要一个免费的 Cocalc 帐户或将 Sage 下载到您的计算机。

答案2

也许这是一个不错的开始,但我不确定这是否也适用于 100 这样的大数字...无论如何:你可以定义一个递归函数这将使您避免重复的代码。

在下面的代码中compfun(5)应该相当于(x+0)^2+(x+1)^2+...+(x+5)^2

\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usetikzlibrary{math}

\begin{document}
    \begin{tikzpicture}[
            evaluate={
                function basefun(\i) {
                    return pow(x+\i,2);
                };
                function compfun(\j) {
                    if \j < 1 then {
                        return basefun(0);
                    } else {
                        return compfun(\j - 1) + basefun(\j);
                    };
                };
            },
        ]
        \begin{axis}[
            axis lines=middle,
            xmin=-10, xmax=10,
            ymin=0, ymax=50,
            samples=100,
            smooth,
            xlabel=$x$,
            ylabel=$f(x)$,
            every axis y label/.style={
                at=(current axis.above origin), 
                anchor=south
            },
            every axis x label/.style={
                at=(current axis.right of origin), 
                anchor=west
            },
            enlargelimits=upper,
        ]
        \addplot[blue, thick] {compfun(5)};
        \end{axis}
    \end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容