Files
mytoolkit/templates/md-to-pdf/textbook/demo.md
T
Zhengshou Lai 2791a785ff feat: add document conversion templates
Add md-to-pdf and md-to-docx templates for mytoolkit convert command.
Migrated from workspace/templates.
2026-05-06 00:11:37 +08:00

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}xH_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")[ 编写程序计算二维正方形区域上的泊松方程,并与解析解比较收敛阶。 ]