Long Luo's Life Notes

每一天都是奇迹

By Long Luo

PID 算法 是自动控制领域中很重要的算法。

\[ u(t) = K_Pe(t) + K_I \int e(t) \mathrm{d}t + K_D \frac{\mathrm{d}e(t)}{\mathrm{d}t} \]

Simple PID Controller

非常简单的 PID 算法在线互动式模拟器,传送门 →

PID Algorithm

之前这个是 PID v1.0 版本,最近重构了代码,增加了一些新功能:

  1. 增加机器人速度 \(v\) 及加速度 \(a\) 显示;
  2. 增加 2 个图表展示 PID X 轴方向及 Y 轴方向的 P、I、D \(3\) 个分量随时间变化显示;
  3. 之前代码将时间及速度固定了,但这不符合实际,增加随 \(dt\) 变化积分和微分项;

pid_track

阅读全文 »

By Long Luo

在数学、物理学、工程和计算机领域中,泰勒级数( \(\textit{Taylor Series}\) )1 是一种广泛使用的分析方法,用来计算函数的近似值。在实践中,很多函数非常复杂,而且某些函数是不可积的,想求其某点的值,直接求无法实现。

泰勒公式可以将复杂的函数近似地表达为简单的多项式函数,用一个多项式函数去逼近一个给定的函数(即尽量使多项式函数图像拟合给定的函数图像)。注意在逼近的时候一定是从函数图像上的某个点展开。

下图所示就是不同项数的泰勒公式对 \(\sin x\) 的逼近:

图1. 泰勒公式对 \sin x 的逼近

泰勒级数的定义为:

\[ f(x) = \sum _{n=0}^{\infty}{\frac{f^{(n)}(a)}{n!}}(x-a)^{n} = f(a) + {\frac {f'(a)}{1!}}(x - a) + {\frac {f''(a)}{2!}}(x - a)^{2} + {\frac {f'''(a)}{3!}}(x - a)^{3} + \cdots \]

这里, \(n!\) 表示 \(n\) 的阶乘,而 \(f^{(n)}(a)\) 表示函数 \(f\) 在点 \(a\) 处的 \(n\) 阶导数。如果 \(a = 0\) ,这个级数也被称为麦克劳林级数( \(\textit{Maclaurin series}\) )2

泰勒展开式有很多,那么如何记忆呢?首先我们需要明白,泰勒公式之间都是有相互关联的,我们可以通过推导来理解性记忆这些公式。泰勒公式的具体推导过程可以参考数学分析教材或者网络3

下面我们就推导这些公式,以便更好的记忆4

几何级数 Geometric series

对于 \(-1 < x < 1\) 的情况,几何级数( \(\textit{Geometric series}\) )5 由等比数列求和公式可得:

\[ \frac{1}{1 - x} = \sum _{n=0}^{\infty}x^{n} = 1 + x + x^{2} + \cdots + x^{n} \]

\(-x\) 代入 \(x\) 上式,则:

\[ \frac{1}{1 + x} = \sum _{n=0}^{\infty}(-1)^nx^{n} = 1 - x + x^{2} - x^3 + \cdots + (-1)^n x^{n} \]

\(x^2\) 替代 \(x\) , 由于 \(\arctan x = \int_{0}^{x} \dfrac{1}{1 + x^2} \mathrm{d}x\) ,对于 \(-1 \le x \le 1, x \neq \pm i\)

\[ \arctan x = \sum _{n=0}^{\infty }{\frac {(-1)^{n}}{2n + 1}}x^{2n + 1} = x - {\frac {x^3}{3}} + {\frac {x^5}{5}} - \cdots + \frac{(-1)^n}{2n + 1}x^{2n + 1} \]

因为 \(\dfrac {1}{(1 - x)^2} = (\dfrac {1}{1 - x})'\) ,则:

\[ \begin{aligned} \frac {1}{(1 - x)^2} & = \sum _{n=1}^{\infty }n x^{n-1} \\ & = 1 + 2x + 3x^2 + \cdots + n x^{n-1} \end{aligned} \]

\(\dfrac {1}{(1 - x)^3} = \dfrac {1}{2} (\dfrac {1}{(1 - x)^2})'\) ,则有:

\[ \frac {1}{(1 - x)^3} = \sum _{n=2}^{\infty }{\frac {n(n - 1)}{2}}x^{n - 2} \]

指数函数 Exponent function

由于 \(\dfrac {\mathrm{d} e^x}{\mathrm{d} x} = e^x\)\(e^0 = 1\) 那么:

\[ e^x = \sum _{n=0}^{\infty }{\frac {x^n}{n!}} = 1 + x + {\frac {x^2}{2!}} + {\frac {x^3}{3!}} + \cdots + {\frac {x^n}{n!}} \]

很明显:

\[ \begin{aligned} (e^x)' & = (\frac {1}{0!} + \frac {x}{1!} + \frac {x^2}{2!} + \frac {x^3}{3!} + \cdots)' \\ e^x & = 0 + 1 + \frac {x}{1} + \frac {x^2}{2!} + \frac {x^3}{3!} \cdots \\ & = 1 + x + \frac {x^2}{2!} + \frac {x^3}{3!} + \cdots \end{aligned} \]

对于普通指数函数 \(a^x\) , 由于 \(a^x=e^{x \ln a}\) ,如果将 \(x\) 换为 \(x \ln a\) ,那么 \(a^x\) 的泰勒展开式:

\[ \begin{aligned} a^x & = e^{x \ln a} \\ & = 1 + x \ln a + \frac {(x \ln a)^2}{2!} + \frac {(x \ln a)^3}{3!} + \cdots + \frac {(x \ln a)^n}{n!} \\ \end{aligned} \]

阅读全文 »

By Long Luo

昨天在B站看到一个数学视频1 ,比较 \(2^{100!}\)\(2^{100}!\) 的大小。直观感受就是这 \(2\) 个数都非常非常大,但哪个更大无法一眼看出来。

虽然指数爆炸,但阶乘实际上增长的速度比指数更快,如下图 1 所示:

图1. 函数增长示意图

可以看出阶乘图像 \(y = x!\) 实际上比指数 \(y = e^x\) 要快很多,而 \(y = x^x\) 是最快的。

但具体哪个更大呢?

这个问题有很多种方法,这里展示了 \(4\) 种方法。

对数放缩法

由于对数( \(\textit{Logarithm}\) ) 2 函数 \(y = \log_{a}{b}\)\(a > 1\) 是单调递增函数,所以比较两个数大小时,可以通过比较两者对数值来实现大小比较。

两边同取对数 \(\log_{2}{x}\)

左边:

\[ A = \log_{2}{(2^{100!})} = 100! \]

右边:

\[ B = \log_{2}{2^{100}!} = \log_{2}{2^{100}} + \log_{2}{(2^{100} - 1)} + \dots + 1 + 0 \]

共有 \(2^{100}\) 项,值从 \(0\)\(\log_{2}{2^{100}} = 100\) ,所以

\[ B < 100 \cdot 2^{100} < 128 \cdot 2^{100} = 2^7 \cdot 2^{100} = 2^{107} \]

综合上式,我们只需要比较 \(100!\)\(2^{107}\) 的大小即可。

\(100!\) 至少有 \((100 - 64 + 1) = 37\) 项是大于等于 \(64 = 2^6\) ,也就是 \((2^6)^{37} = 2^{222}\)

显然可得 \(100! \gg 2^{222} \gg 2^{107}\)

故有虽然两个数都非常大,但 \(2^{100!}\) 仍然远远大于 \(2^{100}!\)

阅读全文 »

By Long Luo

安全界大牛 袁哥 在微博上发布了一道 数学挑战题

计算 \((3+ \sqrt{5})^n\) 的整数末三位数,给出能口算或者可以用计算器计算的算法的第一个人,免费给一个价值 1000 元的 A9 投资分享群入群名额。

我的解答

刷微博时看到这道题目时,我觉得很简单啊,于是马上给出了下面的解答:

\(y = (3 + \sqrt{5})^n\) ,两边同取对数, \(\log_{10}{y} = n \log_{10}{(3 + \sqrt{5})}\)\(y = 10^{n \log_{10}{5.23607}}\)\(\log_{10}{5} \approx 0.7\) ,所以 \(y \approx 10^{0.7n}\)

但问题没有这么简单,因为上述解答只在 \(n = 1\) 是正确的,\(n = 2\)\(y = 10^{1.4} \approx 25\) 就不对了,因为精度不够!

之后根据微博评论中其他人给的构造共轭数思路,分析出 \(3\) 位数是周期性的,于是又提交了下面的答案:

图1. 证明周期性

但问题仍然没有这么简单,因为即使循环周期 \(p = 100\) ,而 双精度浮点数 的有效位数也只有 \(15\) 位,而 \(\sqrt{5}\) 是无理数,同时由于舍入误差, \(\log_{10}{(3 + \sqrt{5})}\) 很快就出现精度不够的问题,得到错误的结果。

之后袁哥发布了 解答 ,图片太大,大家可以点开 图片链接 查看详细解答。

袁哥的题解省略了很多东西,对数学不熟悉的人可能看不太明白,我当时也没有完全看明白。根据袁哥解答我重新写了份题解,整理了思路及缺失的步骤,外加证明,有中学数学水平即可看懂,题解第一部分如下:

阅读全文 »
0%