Fenrier Lab

Delaunay 网格划分算法

将一块区域进行网格化是计算几何中的一项重要议题,基于化繁为简的思想,任何复杂的模型都能分解成简单的几何元素。在应用上,整体的非线性行为,便可以由局部的线性拼接得到。 举个简单的例子,一段向上的楼梯,老远看去就是一条斜向上的直线,但实际上是由一段段水平和竖直的线段连成的。从某种意义上讲,将斜线表述成水平线和竖直线的组合降低了描述的层次,但代价是我们需要维护大量的低层次信息。或许对于一段斜直线来讲,这种代价并不值得,但对于更高层次的复杂信息,局部简化是我们目前唯一的办法。 定义 Delaunay 网格划分不是一种具体的算法,而是一种规范,它确保了网格中的三角形的形状处于可控的状态。这是网格划分中不得不考虑的问题,如果同一个单元中的节点离得老远,那么在插值的时候,其误差便没有保证,因为...
点我阅读更多...

SMO 算法介绍

根据前面对支持向量机的介绍,需要求解的优化问题为 \[\max\limits_\alpha \quad W(\alpha) = - \frac 1 2 \sum_{i,j = 1}^n \alpha_i \alpha_j y_i y_j<x^{(i)}, x^{(j)}>+ \sum_{i=1}^n \alpha_i\] \[\begin{aligned} s.t. \quad & \sum_{i = 1}^n \alpha_i y_i = 0\\ &y_i (\omega^T x^{(i)} + b) > 1 \quad \Rightarrow \quad \alpha_i = 0\\ &y_i (\omega^T x^{(i)} + b...
点我阅读更多...

共轭梯度法解线性方程组

之前提到,求解线性方程组 \(A x = b\) 等价于求下面二次型的极小值 \[f(x) = \frac 1 2 x^T A x - x^T b\] 在最速下降算法中,迭代点沿负梯度方向移动,这就导致迭代点走位太罗嗦,具体来说,若函数的等高线是很狭窄的椭圆,如果初始点取得不好,那么将会产生如下图所示低效的迭代路径 仅仅是二阶矩阵就需要如此多的迭代显然是不可接受的,那么是否有使用极少迭代次数便成功收敛的算法呢?答案是显然的,在上一节讨论最速下降算法的时候,我们谈到了一种特殊情况,即迭代点刚好落在椭圆的轴上,便只用执行一次迭代。所以现在的想法是能不能将初始点经过一次迭代就移动到椭圆的轴上,类似于下图 虽说这是很理想的方案,但此时迭代步长和方向都是未知的,我们可以先分别假设...
点我阅读更多...

最速下降法解线性方程组

算法推导 已知待求解的线性方程组 \[A x = b\] 其中 A 为对称正定矩阵,x 为向量。上述问题等价于求解如下二次型的极小值 \[f(x) = \frac 1 2 x^T A x - x^T b\] 为了说明这种关系,考虑对 \(f(x)\) 求导 \[f'(x) = \frac 1 2 A x + \frac 1 2 x^T A - b\] 由于 A 为对称正定矩阵,所以 \[f'(x) = A x - b\] 而 \(f(x)\) 取得极小值的条件是 \(f'(x) = 0\),即 \(A x - b =0\),这就说明两个问题其实是等价的。事实上,若 A 为二阶矩阵,那么 \(f(x)\) 的图像是空间上的抛物面,且开口向上 而其等高线则如下图所示...
点我阅读更多...

数值积分 Java 实现

之前在SICP上看到一个很厉害的东西,考虑三个问题: 计算从 a 到 b 间所有整数的和 计算从 a 到 b 间所有整数的三次方之和 求解序列 \(\frac{1}{1 \cdot 3} + \frac{1}{5 \cdot 7} + \frac{1}{9 \cdot 11} + ....\) 下面的三段代码可以分别解决这三个问题 (define (sum-integers a b) (cond ((> a b) 0) (else (+ a (sum-integers (+ a 1) b))))) (define (sum-cubes a b) (define (cube k) (* k k k)) (cond ((&g...
点我阅读更多...