Add md-to-pdf and md-to-docx templates for mytoolkit convert command. Migrated from workspace/templates.
2.9 KiB
title, author, lang, date
| title | author | lang | date |
|---|---|---|---|
| 计算力学导论 | 赖正首 | zh | 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 实现的简单有限元求解器:
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")[ 编写程序计算二维正方形区域上的泊松方程,并与解析解比较收敛阶。 ]