--- title: 计算力学导论 author: 赖正首 lang: zh date: 2025 年 --- # 引言 计算力学是利用数值方法求解力学问题的学科。本章将介绍有限元方法的基本概念。 ## 历史背景 有限元方法起源于 20 世纪 50 年代的航空工业。Turner 等人于 1956 年首次发表了关于有限元方法的系统性论文。 ## 本章概述 本书将按以下结构组织: - **第一章** 介绍有限元方法的基本原理 - **第二章** 讨论变分原理与弱形式 - **第三章** 探讨高阶有限元与谱方法 --- # 有限元方法基础 ## 强形式与弱形式 考虑一维泊松方程: $$-u''(x) = f(x), \quad x \in (0, 1)$$ 边界条件为 $u(0) = u(1) = 0$。 以下定理框使用 Typst 语法;`mytoolkit` 会在转 Typst 前自动包一层 raw,避免行首 `#` 被 Pandoc 转义。 #theorem(title: "解的存在唯一性")[ 设 $f \in L^2(0,1)$,则上述边值问题存在唯一弱解 $u \in H_0^1(0,1)$。 ] #proof[ 根据 Lax-Milgram 定理,双线性形式 $a(u, v) = \int_0^1 u' v' \, \mathrm{d}x$ 在 $H_0^1(0,1)$ 上是连续且强制的,线性泛函 $L(v) = \int_0^1 f v \, \mathrm{d}x$ 是连续的。因此存在唯一解。 ] ## 伽辽金方法 #example(title: "一维泊松方程")[ 取试探空间 $V_h = \mathrm{span}\{\phi_1, \phi_2, \dots, \phi_n\}$,其中 $\phi_i$ 为分段线性帽函数。则近似解可写为: $$u_h(x) = \sum_{j=1}^n u_j \phi_j(x)$$ 代入弱形式并取测试函数 $v = \phi_i$,得到线性方程组 $K u = F$。 ] --- # 变分原理 ## 极小位能原理 #lemma(title: "能量泛函的凸性")[ 定义能量泛函 $J(v) = \frac{1}{2} a(v, v) - L(v)$,则 $J$ 是严格凸的。 ] ## 拉格朗日乘子法 对于有约束的优化问题,引入拉格朗日乘子: $$\mathcal{L}(u, \lambda) = J(u) + \lambda^T (B u - g)$$ --- # 高级主题 ## 代码示例 以下是用 Python 实现的简单有限元求解器: ```python import numpy as np from scipy.sparse import csr_matrix from scipy.sparse.linalg import spsolve def assemble_stiffness(n): """组装一维刚度矩阵""" h = 1.0 / (n + 1) data = np.array([1/h] * (n-1) + [2/h] * n + [1/h] * (n-1)) rows = np.array(list(range(n-1)) + list(range(n)) + list(range(1, n))) cols = np.array(list(range(1, n)) + list(range(n)) + list(range(n-1))) return csr_matrix((data, (rows, cols)), shape=(n, n)) def solve_poisson_1d(f, n): """求解一维泊松方程""" K = assemble_stiffness(n) h = 1.0 / (n + 1) F = h * f(np.linspace(h, 1-h, n)) return spsolve(K, F) ``` ## 练习 #exercise(title: "3.1")[ 证明一维线性有限元方法的收敛阶为 $O(h^2)$,即: $$|u - u_h|_1 \leq C h |u|_2$$ 其中 $C$ 为与 $h$ 无关的常数。 ] #exercise(title: "3.2")[ 编写程序计算二维正方形区域上的泊松方程,并与解析解比较收敛阶。 ]