假设我有一个函数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)
我们正在处理看起来像抛物线的东西,如果你仔细想想,总和中的 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}
请注意,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}