积分求导
前言:之前也写过类似的博客,但是感觉太杂了,而且发现自己其实理解还不够,本文汇总其精华。
参考:多项式计数杂谈。
广告:有趣的题,牛顿级数,组合数学,洛必达法则,导数,自然对数 e。
无限求导
常用函数导数:
- 常数函数:$ f(x) = c $,则 $ f'(x) = 0 $。
- 幂函数:$ f(x) = x^n $,则 $ f'(x) = n x^{n-1} $。
- 指数函数:$ f(x) = e^x $,则 $ f'(x) = e^x $。
- 对数函数:$ f(x) = \ln x $,则 $ f'(x) = \frac{1}{x} $。
- 三角函数:\(sin'(x)=cos(x),cos'(x)=-sin(x)\)
偏导:
对于多元函数 F(x,y) ,对 x 取偏导相当于将 y (等其他元)看做和 x 无关的量,然后求导。
复合函数求导(链式法则):
\[\frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx}
\]
\[[F(G(x))]' = F'(G(x)) G'(x)
\]
加减法:
\[(F+G)' = F' + G'
\]
乘法:
\[[F(x)G(x)]'=F'(x)G(x) + F(x)G'(x)
\]
除法(可用乘法推):
\[(\frac {F(x)}{G(x)})' = F'(x)\frac 1{G(x)} + F(x)(\frac 1{G(x)})'=\frac{F'(x)G(x)-F(x)G'(x)}{G^2(x)}
\]
反函数:
\[F(x) = y, G(y) = x \rightarrow
G'(x)=\frac 1{F'(x)}
\]
例如:
\[\begin{aligned}
\end{aligned}
\]
小试牛刀 1,求 \((\log_ax)'\)
\[\begin{aligned}
y &= \log_ax,x=a^y\\
y'=&=\frac1{(a^y)'}\\
&=\frac1{((e^{\ln a})^y)'}\\
&=\frac1{((e^{y\ln a})'}\\
&=\frac1{((e^{y\ln a})\ln a}\\
&=\frac1{a^{y}\ln a}\\
&=\frac1{a^{log_ax}\ln a}\\
&=\frac1{x\ln a}\\
\end{aligned}
\]
小试牛刀 2,求 \(Atan'\).
\[\begin{aligned}
Atan(x) &= y, tan(y) = x\\
y' = Atan'(x) &= \frac1{tan'y}\ \text{易错点,容易写成 tan(x)} \\
& = \frac{1}{(\frac\sin\cos)'y}\\
&= \sin' y \frac1{\cos y}+\sin y(\frac1{\cos y})'\\
&= \frac 1{1+tan^2y} \\
\because y &= Atan(x)\\
\therefore y' &= \frac 1{1+x^2}
\end{aligned}
\]
无限积分
相当于求导逆运算,注意多带一个常数:
\[\int F'(x) = F(x) + C \\
\int_a^b f'(x) = f(b) - f(a)
\]
积分线性性:(类比 \(\sum\))
\[\int (F(x) + G(x)) dx = \int F(x)dx +\int G(x)dx\\
\int cF(x) = c\int F(x)
\]
链式法则(就是逆求导):
\[\int F'(G(x))G'(x) = \int [F(G(x))]' = F(G(x)) + C
\]
部分积分,注意,FG是始减末。用与解决好找 F' 的 原函数 F 和 G 的导函数 G' 的时候。
\[\begin{aligned}
(FG)' &= F'G + FG'\\
\int (FG)' &= \int F'G + \int FG'
\end{aligned}
\]
\[\therefore \int F'G = \int [FG]' - \int FG' = FG - \int FG'
\]
应用: \(Beta\) 积分:
\[\begin{aligned}
B(a,b) &= \int_0^1 x^a(1-x)^b dx\\
&= \left. \frac {x^{a+1}(1-x)^b}{a+1} \right\vert_0^1 - \int_0^1\frac {x^{a+1}(-b)(1-x)^{b-1}}{a+1} \\
&= \frac b{a+1}B(a+1,b-1)\\
B(k,0) &= \int_0^1 x^k(1-x)^0 dx = 1 \\
B(a,b) &= \frac{b!a!}{(a+b+1)!}
\end{aligned}
\]
小试牛刀.
常用的定理
\[\lim_{x \to a} \frac{f(x)}{g(x)} = \lim_{x \to a} \frac{f'(x)}{g'(x)}
\]
在遇到 \(\frac00,\frac\infty\infty\) 之类的未定义行为时使用。
泰勒展开
根据代数基本定理可推,我们能用一个 n 次多项式来表示一个 n 次函数,而像 sin 这种无限次数的函数,也可以用无限次数的多项式表示。要想得到多项式的第 i 项系数,可以求 i 次导后取常数项。因为每求一次导都会多乘上一个 x 的指数。如果通过求导,把 \(x^i\) 变为 \(x^0\),那么其系数多乘上了 \(i!\) ,原函数系数要把 \(i!\) 除掉。形式化的写出来为:
\[F(x) = \sum_{i=0}\frac{F^{(i)}(0)}{i!}x^i
\]
(注:这其实只是在 0 处的泰勒展开,不过一般只用这个。)
应用:
\[\begin{aligned}
\sin(x) &= \sum_{i=0}\frac{\sin^{(i)}(0)}{i!}x^i = \sum_{i=0}\frac{(-1)^i}{2i+1}x^{2i+1}\\
\cos(x) &= \sum_{i=0}\frac{(-1)^i}{2i}x^{2i}\\
\exp x &= e^x = \sum_{i=0}\frac{1}{i!}x^i \therefore e = \sum_{i=0}\frac{1}{i!}
\end{aligned}
\]
有限积分与差分
定义平移算子:\(E f(x) = f(x+1)\)。
定义差分算子 : \(\Delta = E-1\),即:\(\Delta f(x) = f(x+1)-f(x)\)。
定义高维差分算子 : \(\Delta^{m+1} f(n)=\Delta^{m} f(n + 1)- \Delta^mf(n)\)。
定义下降幂 :\(n^{\underline{m}}=n(n - 1)(n - 2)\cdots(n - m + 1)\)
定义上升幂 :\(n^{\overline{m}}=n(n + 1)(n + 2)\cdots(n + m - 1)\)
差分算子的运算律及其性质:
\[\begin{align*}
&\large{\Delta x^\underline k = kx^\underline{k-1}}\\
&\Delta(f+g)=\Delta f+\Delta g\\
&\Delta(cf)=c\cdot\Delta f\\
&\Delta(fg)=f\Delta g+Eg\Delta f\\
&\Delta(2^x) = 2^x\\
&\Delta\binom{x}{k}=\binom{x}{k - 1}\\
&\Delta^{m}\binom{x}{k}=\binom{x}{k - m}
\end{align*}
\]
求和运算 \(\sum\) 相当于是有限积分,是差分的逆运算。
\[\begin{aligned}
&\sum x^\underline k dx= \frac {x^\underline{k+1}}{k+1}\\
&\sum_0^{n-1}x^\underline kdx = \frac{n^\underline {k+1}}{k+1}
\end{aligned}
\]
特殊的,当 \(k = -1\) 时,
\[\sum_0^{n-1}x^\underline kdx = \sum \frac 1{i+1} = \sum_1^n \frac1i
\]
是调和级数。对比 \(\int x^{-1} = \ln x\)。
\[\begin{aligned}
&\sum\Delta(fg)=\sum f\Delta g+\sum Eg\Delta f\\
&fg=\sum f\Delta g+\sum Eg\Delta f\\
\end{aligned}
\]
可惜的是,有限积分没有类似于链式法则的东西。
应用 : 自然数 k 次方和问题 \(f_k(n)=\sum_{i=0}^{n-1}i^k\)
当 k 足够小(比如 1,2,3,4 这种小常数)的时候,可以暴力把普通幂拆成下降幂,然后用有限积分做。例如 \(x^2=x^\underline 2 + x^\underline 1\).
如果 k 不能当成常数,但是 n 远大于 k 时,那么可以推一下式子得到 \(f_k(n)=\sum_{j=0}^k\dfrac{k\brace j}{j+1}n^\underline{j+1}\),可以花 \(O(k\log k)\) 的时间预处理出一行的斯特林数,然后 \(O(k)\) 地得到一个 \(f_k(n)\),聪明一点的会发现上式可以当成 n 的 k + 1 次多项式,可以拉差出 f 的第 n 项。还更快。
如果需要求出多个甚至每一个 k 时的答案,可以考虑用伯努利数,或者直接莽一个多项式多点求值,不过前者是但 log,后者是双 log
f 在 k 上的 EGF 是 \(\dfrac{e^{nx} - 1}{e^{x}-1}\),取 \(k![x^k]\) 即可得到答案。
如果 k 固定,对不同的 n 求这个东西,那么显然有 \(f_k(n)=f_k(n-1)+(n-1)^k\),如果 n 连续并且从 0 开始,直接递推就可以了,如果 n 连续但是不从 0 开始,可以先拉差出第一项。如果 n 不连续应该可以多项式多点求值,不过我没试过,理论可行。
牛顿级数
类似于泰勒展开,我们希望得到一个用下降幂表示的类似于多项式的东西。
\[f(x) =\sum_{k=0}^n{\Delta^kf(0) \over k!}x^{\underline k}
\]
把普通多项式转组合数形式的多项式,这种组合形式的多项式就叫牛顿级数。有一个用途是转化高位差分。
已知多项式 \(f(x)=a_0 + a_1x + a_2x^2+\cdots + a_nx^n\)
因为 \(\binom xn\) 是一个关于 \(x\) 的多项式。
写成组合数的形式 \(f(x)=c_0\binom{x}{0}+c_1\binom{x}{1}+c_2\binom{x}{2}+\cdots + c_n\binom{x}{n}\)
先给结论:
\[f(x)=f(0)\binom{x}{0}+\Delta f(0)\binom{x}{1}+\Delta^{2}f(0)\binom{x}{2}+\cdots+\Delta^{n}f(0)\binom{x}{n}
\]
以下是证明:
先定义差分因子 \(\Delta\):
\[\Delta f(n)=f(n + 1)-f(n)
\]
再定义高维差分:
\[\Delta^{m+1} f(n)=\Delta^{m} f(n + 1)- \Delta^mf(n)
\]
运算律
这些运算律可以类比求导的运算律:
\[\begin{align*}
&\Delta(f(n)+g(n))=\Delta f(n)+\Delta g(n)\\
&\Delta(c(f(n)))=c\cdot\Delta f(n)\\
&\Delta(f(n)g(n))=f(n)\Delta g(n)+g(n + 1)\Delta f(n)
\end{align*}
\]
组合数的差分
由组合数的递推公式可以推出:
\[\Delta\binom{x}{k}=\binom{x}{k - 1}
\]
同理可推出:
\[\Delta^{m}\binom{x}{k}=\binom{x}{k - m}
\]
可以感觉到,组合数和差分很配。
重要结论的证明
回到原命题,对于 \(f(x)=c_0\binom{x}{0}+c_1\binom{x}{1}+c_2\binom{x}{2}+\cdots + c_n\binom{x}{n}\)
因为 :
\[f(0) = \sum c_i \binom 0i
\]
取 \(\Delta^kf(0)\) ,运用组合数差分和差分的运算律有:
\[\Delta^kf(0)=\sum c_i\binom 0{i-k} = c_k
\]
所以:
\[\begin{align}
f(x)
&=f(0)\binom{x}{0}+\Delta f(0)\binom{x}{1}+\Delta^{2}f(0)\binom{x}{2}+\cdots+\Delta^{n}f(0)\binom{x}{n}\\
&=\sum_{k=0}^n\Delta^kf(0)\binom xk\\
&=\sum_{k=0}^n{\Delta^kf(0) \over k!}x^{\underline k}
\end{align}
\]
(咋感觉最后一个有点像泰勒展开?)
牛顿级数的另一种推导:
\[\begin{align}
E &= (\Delta+1)\\
E^k &= (\Delta+1)^k = \sum_0 \binom ki\Delta^i di\\
f(x) &= E^xf(0) = \sum_0 \binom ki\Delta^if(0) di\\
\therefore c_i &= \Delta^if(0)
\end{align}
\]
把牛顿级数转普通多项式形式:
\[a_i = \sum_{k=i}^n{c_i\over k!}\\
f(x) = \sum_{i=0}^{n}(\sum_{k=i}^n{c_i\over k!})x^i
\]
上面这个不知到有没有用。
特殊地,\(a_n = {c_i \over n!}\)
重要恒等式
\[\Delta^{n}f(x)=\sum_{k = 0}^{n}\binom{n}{k}(-1)^{n - k}f(x + k)
\]
根据高维差分定义,这很好感性理解
证明:为了方便表示,我们设平移因子 \(E\),满足 \(Ef(x) = f(x+1)\),因为 \(\Delta f(n)=f(n + 1)-f(n)\),所以 \(\Delta = E - 1\)。
根据二项式定理:
\[\Delta^nf(x) = (E-1)^nf(x) = \sum_{k=0}^n \binom nk(-1)^{n-k}E^kf(x) =\sum_{k = 0}^{n}\binom{n}{k}(-1)^{n - k}f(x + k) \ \ \ \ \ \ □
\]
推论
对于 \(f(x)=a_0 + a_1x + a_2x^2+\cdots + a_nx^n\),其牛顿级数为 \(f(x)=c_0\binom{x}{0}+c_1\binom{x}{1}+c_2\binom{x}{2}+\cdots + c_n\binom{x}{n}\)
\[\Delta^nf(0) = c_n = n!a_n
\]
和上文的恒等式联立一下,得到:
\[\begin{aligned}
\Delta^nf(0)=\sum_{k = 0}^{n}\binom{n}{k}(-1)^{k}f(k)&=(-1)^{n}c_n\\
\sum_{k = 0}^{n}\binom{n}{k}(-1)^{k}f(k)&=(-1)^{n}n!a_n\\
\sum_{k = 0}^{n}\binom{n}{k}(-1)^{k}\sum^n_{i=0}a_ik^i&=(-1)^{n}n!a_n\\
\end{aligned}
\]
牛顿插值法
目的和拉插一致。
具体来说,已知 n 阶多项式 P(x) 在前 n + 1 个点处的值 P(0),P(1),· · ·,P(n),求P(x) 的值,要求 O(n)。
\[\begin{align}
P(x)&=\sum_{k\leq n}c_k\binom{x}{k}\\
&=\sum_{k\leq n}\binom{x}{k}\Delta^kP(0)\\
&=\sum_{k\leq n}\binom{x}{k}\sum_{t}(-1)^{k - t}\binom{k}{t}P(t)\\
&=\sum_{t\leq n}P(t)\sum_{t\leq k\leq n}\binom{x}{k}(-1)^{k - t}\binom{k}{t}\\
&=\sum_{t\leq n}P(t)\binom{x}{t}\sum_{t\leq k\leq n}\binom{x - t}{k - t}(-1)^{k - t}\\
&=\sum_{t\leq n}P(t)\binom{x}{t}\sum_{k\leq n - t}\binom{x - t}{k}(-1)^{k}\\
&=\sum_{t\leq n}P(t)\binom{x}{t}\binom{x - t - 1}{n - t}(-1)^{n - t}\quad \text{交错和公式}\\
&=\sum_{t\leq n}(-1)^{n - t}P(t)\frac{x^{\underline {n + 1}}}{t!(n - t)!(x - t)}
\end{align}
\]
预处理一下阶乘之类的即可。
对于 \(x - t\),\(x-t =\frac{(\prod_{t=0}^{i-1}x-i)(\prod_{t=i+1}^{n}x-i)}{\prod_{t=0}^{n}x-i}\) 处理出其前缀积和后缀积,再求一个整体的逆元即可。
应用
牛顿级数这玩意虽然看上去没上面用,但实际上也没什么用。不过为了证明这玩意还是有一点用的,我们给几个例题:
求下面式子的封闭形式:
\[1、\sum_{k} (-1)^{k}\binom{n}{k}(n - k)^{n}
\]
先用 \(j\) 替代 \(n-k\),易得上式等于:
\[\sum_{j}\binom{n}{j}(-1)^{n - j}j^{n}
\]
设 \(f(x) = x^n\)通过重要恒等式可得上式等于:
\[\Delta^nf(0)
\]
观察到,\(\Delta^nf(0)\) 就是牛顿级数的 \(x^n\) 次项系数 \(c_n\),根据之前的结论,\(c_n = n!a_n = n!\)。
实际上也可以设 \(f(x) = (n-x)^n\),但这是我过程都写一半了才意识到的。下一个题我会用这种更简洁的方法。
\[2、\sum_{k}(-1)^{k}\binom{n}{k}\binom{kn}{n}
\]
设 \(f(x) = \binom {xn}{n}\),则上式等于:
\[(-1)^n\Delta^nf(0)
\]
其中 \(\Delta^nf(0)\) 相当于 \(c_n\),又因为 \(c_n=a_n\times n!\)。
对于 \(f(x) = \binom {xn}{n} = {(nx)^{\underline n}\over n!}\),\(a_n = {n^n \over n!}\)
整理一下容易得到,答案为 \((-1)^nn^n\)
再丢一个例题:更简单的排列计数
反正我也不会做
科技
自适应辛普森法
不是所有的函数都是好积分的。
有些时候可以只求到近似值就可以了。
考虑使用好积分的函数来拟合原函数。例如二次函数。
比方说现在有一个很抽象的函数 \(F(x)\),我们认为它很接近 \(G(x) = ax^2 + bx + c\)。可得:
\[\int_l^r G(x) = \frac a3(r^3-l^3)+\frac b2(r^2 -l^2) + \frac c2(r - l)\\
=(r-l)(a(r^2+rl+l^2)/3+b(r+l)/2+c/2)\\
\]
化简可得:
\[(r-l)[G(r) + G(l)+G(l+r)]/6
\]
由于 G 是用来拟合 F 的函数,所以
\[\int_l^r F(x) \approx(r-l)[F(r) + F(l)+F(l+r)]/6
\]
不过现在的精度可能很爆炸,所以可以大概判断一下当前精度合不合格,不合格就递归下去求解。
inline double simpson(double l, double r) {return (f(r) + f(l) + 4 * f((l + r) / 2)) * (r - l) / 6;}
inline double getans(double l, double r) {
double mid = (l + r) / 2;
if (检查精度够不够) return simpson(l, r);
return getans(l, mid) + getans(mid, r);
}
例题
微积分做法明明相当自然,为什么非要去 dp?复杂度还更劣。
转化为 \([0,1]\) 时的答案然后乘上 l,这样更方便。
\[ans = \int_0^1p(x)dx
\]
\[p(x) = \sum_{i=k}^n\binom ni(2x(1-x))^i(1-2x(1-x))^{n-i}
\]
注意这里的系数 2 是指可以交换左右端点(读题!题意是撒两个点然后连线)
\[\begin{aligned}
ans =& \int_0^1\sum_{i=k}^n\binom ni(2x(1-x))^i(1-2x(1-x))^{n-i}dx \\
=& \sum_{i=k}^n\binom ni\int_0^1(2x(1-x))^i(1-2x(1-x))^{n-i}dx \\
=& \sum_{i=k}^n\binom ni\int_0^1(2x(1-x))^i\sum_{j=0}^{n-i}\binom{n-i}j(-1)^{j}(2x(1-x))^{j}dx \\
=& \sum_{i=k}^n\binom ni\sum_{j=0}^{n-i}\binom{n-i}j(-1)^{j}\int_0^1(2x(1-x))^{i+j}dx \\
=& \sum_{i=k}^n\binom ni\sum_{j=0}^{n-i}\binom{n-i}j(-1)^{j}2^{i+j}\int_0^1x^{i+j}(1-x)^{i+j}dx \\
=& \sum_{i=k}^n\binom ni\sum_{j=0}^{n-i}\binom{n-i}j(-1)^{j}2^{i+j}B(i+j,i+j) \\
\end{aligned}
\]
这里用到了上面的 Beta 积分,\(B(a,b)=\dfrac{a!b!}{(a+b+1)!}\)。
\[\begin{aligned}
ans =& \sum_{i=k}^n\sum_{j=0}^{n-i}\binom ni\binom{n-i}j(-1)^{j}2^{i+j}B(i+j,i+j) \\
=& \sum_{l=0}^{n}\sum_{j=0}^{n-k}\binom n{l-j}\binom{n-(l-j)}j(-1)^{j}2^{l}B(l,l) \ \ \ \ \ \text{(replace i + j to l in this step)}\\
=& \sum_{l=0}^{n}2^{l}B(l,l)\sum_{j=0}^{n-k}\binom n{l-j}\binom{n-(l-j)}j(-1)^{j} \\
\end{aligned}
\]
下一步需要一些注意力,可以逆用三项式版恒等式:\(\binom n{l-j}\binom{n-(l-j)}j = \binom{n}{l}\binom l{l-j}\)
\[\begin{aligned}
ans
=& \sum_{l=0}^{n}2^{l}B(l,l)\binom{n}{l}\sum_{j=0}^{n-k}\binom l{j}(-1)^{j} \\
=& \sum_{l=k}^{n}2^{l}B(l,l)\binom{n}{l}(-1)^{l-k}\binom {l-1}{l-k}
\end{aligned}
\]
中间的边界不知道是在什么地方推错的,不管了(?)。