CSC336 Numerical Methods 是多伦多大学 CS 和 Math 专业的数学密集型必修课,融合了数学分析、线性代数和编程实现,是很多留学生感到最"痛苦"的课程之一。
为什么 CSC336 这么难?
CSC336 难在以下三点:
- 数学证明要求高:需要推导误差界(Error Bound)、证明收敛性
- 编程实现精度要求:MATLAB/Python 代码必须数值稳定,不能用"直觉"编程
- 理论和实现双考:期末既考数学证明,又考代码实现题
核心模块详解
1. 浮点数和误差分析(Floating Point & Error Analysis)
这是 CSC336 的基础,也是最容易被忽视的部分:
浮点数表示: $$x = \pm(1.d_1d_2...d_t) \times 2^e$$
机器精度(Machine Epsilon): $$\varepsilon_{mach} = 2^{-52} \approx 2.22 \times 10^{-16}$$(双精度)
绝对误差 vs 相对误差:
- 绝对误差:$|x - \hat{x}|$
- 相对误差:$\frac{|x - \hat{x}|}{|x|}$
灾难性相消(Catastrophic Cancellation):
# 错误写法:当 x 很小时精度损失严重
def bad_sqrt_diff(x):
return math.sqrt(x + 1) - math.sqrt(x)
# 正确写法:有理化分子
def good_sqrt_diff(x):
return 1.0 / (math.sqrt(x + 1) + math.sqrt(x))
2. 线性方程组(Linear Systems)
高斯消元法(Gaussian Elimination):
import numpy as np
def gaussian_elimination(A, b):
n = len(b)
# 前向消元(Forward Elimination)
for k in range(n):
for i in range(k+1, n):
factor = A[i,k] / A[k,k]
A[i,k:] -= factor * A[k,k:]
b[i] -= factor * b[k]
# 后向代入(Back Substitution)
x = np.zeros(n)
for i in range(n-1, -1, -1):
x[i] = (b[i] - np.dot(A[i,i+1:], x[i+1:])) / A[i,i]
return x
主元选取(Pivoting):
- Partial Pivoting(部分主元):每步选当前列最大元素作为主元,减少舍入误差
- Complete Pivoting(完全主元):选全矩阵最大元素,更稳定但代价更高
LU 分解:$A = LU$
- L:下三角矩阵(主对角为1)
- U:上三角矩阵
- 优势:一次分解,多次求解不同右侧向量
条件数(Condition Number): $$\kappa(A) = |A| \cdot |A^{-1}|$$
- $\kappa(A)$ 大 → 矩阵病态(ill-conditioned),小的误差被放大
- 期末必考:给出条件数,估算解的精度损失
3. 非线性方程求根(Root Finding)
二分法(Bisection):收敛慢但保证收敛
def bisection(f, a, b, tol=1e-10):
while (b - a) / 2 > tol:
c = (a + b) / 2
if f(c) == 0:
return c
if f(a) * f(c) < 0:
b = c
else:
a = c
return (a + b) / 2
收敛速度:线性收敛,每步误差减半
牛顿法(Newton's Method): $$x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}$$
- 二次收敛(当初值靠近根时)
- 需要计算导数,根附近导数为0时失败
割线法(Secant Method):不需要导数,超线性收敛
考试必考:给出函数,选择合适求根方法并分析收敛阶数(Order of Convergence)。
4. 多项式插值(Polynomial Interpolation)
拉格朗日插值(Lagrange Interpolation): $$L(x) = \sum_{i=0}^{n} y_i \prod_{j \neq i} \frac{x - x_j}{x_i - x_j}$$
牛顿插值(Newton's Divided Differences): 计算效率更高,添加新节点时无需重新计算。
龙格现象(Runge's Phenomenon): 均匀分布节点的高次多项式在边界附近剧烈振荡。 解决方案:使用切比雪夫节点(Chebyshev Nodes): $$x_k = \cos\left(\frac{(2k-1)\pi}{2n}\right), \quad k = 1, ..., n$$
样条插值(Cubic Spline):
- 分段三次多项式,在节点处保证 $C^2$ 连续
- 更稳定,实际应用中首选
5. 数值积分(Numerical Integration)
复合梯形法(Composite Trapezoidal): $$\int_a^b f(x)dx \approx \frac{h}{2}\left[f(x_0) + 2\sum_{i=1}^{n-1}f(x_i) + f(x_n)\right]$$ 误差:$O(h^2)$
辛普森法(Simpson's Rule): $$\int_a^b f(x)dx \approx \frac{h}{3}\left[f(x_0) + 4f(x_1) + 2f(x_2) + ... + f(x_n)\right]$$ 误差:$O(h^4)$,精度更高
高斯积分(Gaussian Quadrature): 选取最优节点和权重,n 个节点精确积分 2n-1 次多项式。
6. 常微分方程(ODEs)
欧拉法(Euler's Method): $$y_{n+1} = y_n + h \cdot f(t_n, y_n)$$ 一阶精度,简单但误差大
龙格-库塔法(Runge-Kutta, RK4): 四阶精度,实际应用最广泛。CSC336 Assignment 几乎必用 RK4。
def rk4(f, t0, y0, h, n):
t, y = t0, y0
for _ in range(n):
k1 = h * f(t, y)
k2 = h * f(t + h/2, y + k1/2)
k3 = h * f(t + h/2, y + k2/2)
k4 = h * f(t + h, y + k3)
y += (k1 + 2*k2 + 2*k3 + k4) / 6
t += h
return y
Assignment 和 Final Exam 策略
Assignment 写作格式:
- 理论推导用 LaTeX 或手写扫描
- 代码部分注释清楚,标注数值方法名称
- 输出结果要有误差分析和收敛性讨论
Final Exam 高频考点:
- 浮点误差计算(给出运算,求相对误差)
- 矩阵条件数与解的误差估计
- 插值误差界公式
- 各积分方法的误差阶数比较
- 牛顿法收敛性分析
代写和辅导服务
CSC336 对数学推导和代码实现都有高要求,常见求助情况:
- MATLAB/Python 数值方法代码报错或精度不达标
- 误差分析证明不会写
- 不理解 LU 分解和条件数在 Assignment 里的具体应用
- Final Exam 备考不知道从哪里入手
我们提供 CSC336 专项辅导和代写服务,涵盖代码实现(MATLAB/Python/Julia)和理论推导报告撰写,由 UofT 数学/CS 背景导师负责。
通过微信 ZYFD 联系,提供 Assignment 题目后30分钟内报价,支持加急。
