考完就不看の数值分析笔记!

#1 误差

  • 问题背景:真实值为\(x\),近似值为\(x'\)
  • 误差分类:
    • 模型误差:将实际问题抽象为数学问题(建模)过程中的误差。
    • 观测误差:字面意思,测量误差
    • 截断误差:出现和无穷项有关的地方(比如求级数、求极限),实际中不可能真的取极限
    • 舍入误差:四舍五入。
  • 误差:\(e = x' - x\)(注意是近似值减去真实值,别搞混鸭)
  • 绝对误差:\(\varepsilon(x) = |e|\)
  • 绝对误差限:绝对误差的一个上界\(\eta\),越小越好(越精确)。
  • 相对误差:\(\varepsilon(x) = \frac{x' - x}{x'}\)。之所欲是除以\(x'\)是因为精确值\(x\)往往不知道。
  • 相对误差限:\(\varepsilon_r = \frac\eta{|x'|}\),即绝对误差限相对于\(x'\)的值。
  • 有效数字:
    • 约定以下都把近似值转化为\(0.xxx\times 10^m\)的形式。
    • 如果该近似值是四舍五入得来的,则从第一位非0数字到末尾数字都是有效数字。
    • 若不是四舍五入得到,则看使得绝对误差满足式子\(|e|\leqslant 0.5 \times 10^{m-l} = \eta\)的l,那么该近似值的有效数字位数即为\(l\)
    • 有效数字\(\rightarrow\)相对误差限:若近似值有n位有效数字,则其相对误差限为\(\frac1{2a_1}\times 10^{-n+1}\)
    • 相对误差限\(\rightarrow\)有效数字:已知相对误差限为\(\frac1{2(a_1+1)}\times 10^{-n+1}\),则该近似值有n位有效数字。
  • 各种算术操作的误差限:
    • \(\eta(x' \pm y') = \eta(x') + \eta(y')\)
    • \(\eta(x'y') = |y'|\eta(x') + |x'|\eta(y')\)
    • \(\eta(x' / y') = \frac{|y'|\eta(x') + |x'|\eta(y')}{y'^2}\)

#2 插值方法

问题背景: 给定函数\(f(x)\)上的一组点\((x_0, y_0) ...(x_n, y_n)\)(这些已知点称为插值节点),构造插值函数\(g(x)\)逼近\(f(x)\)

拉格朗日插值

  • 线性插值:使用直线拟合函数;抛物插值:使用抛物线拟合函数
  • 拉格朗日插值公式及余项:

\[ \left\{ \begin{aligned} p_n(x) = \sum_{i=0}^n [y_i I_i(x)] = \sum_{i=0}^n \left(y_i \prod_{j=0, j\neq i}^n \frac{x-x_j}{x_i-x_j} \right) \\ R(x) = f(x) - p_n(x) = \frac{f^{n+1}(\xi)}{(n+1)!}\prod_{i=0}^n(x-x_i), \xi \in (a, b) \end{aligned} \right. \]

其中,\(I_i(x)\)称为基函数,可以看到,拉格朗日插值公式就是将函数变为了基函数的线性组合,并且根据基函数的表达式可知,\(I_i(x_i)\)非零,但在其他所有插值节点上基函数的函数值都为0.

缺点非常明显,基函数和全部插值节点相关,因此每当增加一个插值节点,全部\(I(x)\)都要重算。

牛顿插值

  • 试图构造插值函数\(N_n(x)\),使得\(f(x) = \sum_i c_i \varphi_i\),其中\(\varphi_i(x)=(x-x_0)(x-x_1)...(x-x_{i-1})\)为插值基函数。
  • 即基函数为:用\(x\)依次与第\(i\)个以前的插值节点的\(x_j\)作差,并将这些差连乘得到的结果。由此可见\(\varphi_i\)具有继承性:\(\varphi_i = (x-x_{i-1})\varphi_{i-1},\varphi_0=1\)
  • 这里先暂停一下,引入一个概念 差商,我们令记号\(f[x_0, x_1, ...x_k]\)叫做\(f(x)\)\(x_0, ...x_k\)\(k+1\)个点的\(k\)阶差商。其中:

\[ \begin{cases} f[x0, x1] = \frac{f(x_0)-f(x_1)}{x_0-x_1} \\ f[x_0, x_1, ...x_k] = \frac{f[x_0,...x_{k-1}]-f[x_1, ...x_k]}{x_0-x_k} \end{cases} \]

  • 差商有两个性质:\(f[x_0, x_1, ...x_k]\)是这n+1个点的函数值的线性组合:

\[f[x_0 , x_1... x_n ] = ∑_{k=0} \frac{f(x_k)}{(x_k - x_0 )(x_k - x_1 )...(x_k - x_n )}\]

  • 差商与节点顺序无关。即\(f[ x _0 , x _1 , x _2 ] = f[ x _1 , x _0 , x _2 ]\)

  • 回到牛顿插值公式,我们要求的\(c_i\),就是\(f[x_0, ...x_i]\)

分段线性插值

  • 划分为多段小区间,每段区间上用直线拟合。
  • 在区间\([x_i, x_{i+1}]\)上,\(f(x)\approx S_1(x)=y_i\frac{x-x_{i+1}}{x_i-x_{i+1}}+y_{i+1}\frac{x-x_{i}}{x_{i+1}-x_{i}}\)

Hermite插值

  • 优点:插值上不仅函数值相等,导数值也相等。
  • 公式:已知\(2n+2\)个量,其中既有\(f(x_i)\)也有\(f'(x_i)\),则\(H_{2n+1} = \alpha_0f(x_0)+\alpha_1f(x_1)+...\alpha_nf(x_n) +\beta_0f(x_0)+\beta_1f(x_1)+...\beta_nf(x_n)\)\(\alpha, \beta\)是基函数。

#3.1 数值积分

问题背景: 求未知函数的积分。

机械求积方法

  • 思想:转化为函数值的加权平均,即:

\[\int_a^bf(x) = \sum_{i=1}^n A_if(x_i)dx \tag{1}\]

  • 梯形公式: \(\int_a^b f(x)dx= \frac{b-a}{2}(f(a)+f(b))\)

  • 中矩形公式: \(\int_a^b f(x)dx=(b-a)f(\frac{a+b}{2})\)

  • \(simpson\)公式: \(\int_a^b f(x)dx=\frac{b-a}6 [f(a) + 4f(\frac{a+b}2)+f(b)]\)

  • 代数精度:我们称余项\(R=\int_a^b f(x) - \sum_{i=1}^n A_if(x_i)\),若机械求积公式对\(m\)次(或更低次)多项式函数精确成立(\(R=0\)),但对\(m+1\)次多项式近似成立,则机械求积的代数精度为\(m\)

    例如梯形公式在当\(f(x)=1, f(x)=x\)时,都精确成立,但对\(f(x)=x^2\)就不成立,因此它的代数精度为\(1\)

构造机械求积公式

对机械求积公式而言,重点在于怎么确式\((1)\)中各个\(A\)的值。这里使用两种方法:

  • 解方程组。有几个未知量,就列几个方程,假设求积公式对前\(n\)次多项式都精确成立。但缺点是方程组过大时难以求解。
  • 插值。使用插值法找到\(f(x)\)的近似函数\(p_n(x)\)(这个近似函数是一个多项式函数),对\(p_n(x)\)求积作为近似值。推导可得\(A_i = \int_a^bI_i(x)dx,I_i(x)\)是插值基函数。
  • 注意到,由于插值得到的函数\(p_n(x)\)就是一个多项式,而代数精度也是通过令\(f(x)\)为多项式函数来进行计算,因此插值法得到的积分精确度至少为\(n\)
  • 因此我们规定,一个机械求积公式\(\sum_{i=1}^n A_if(x_i)dx\)是插值型公式\(\Leftrightarrow\)其代数精度为\(n\)(这里注意n是机械求积公式的项数)

Newton-cotes求积

  • 将区间\([a, b]\)等分为n份,在等分点做拉格朗日插值得到的公式就是Newton-cotes求积公式:

\[ \left\{ \begin{aligned} \int_a^bf(x) = (b-a)\sum_{k=1}^nC_kf(x_k) \\ C_k = {(-1)^{n-k}\over n k!(n-k)!}\int_0^n \prod_{j=0,j\ne k}^n(t-j)dt \end{aligned} \right. \]

  • 由于是插值型公式,所以Newton-cotes公式至少有\(n\)次代数精度。\(n\)为偶数时,代数精度为\(n+1\)
  • \(n=1\)时即为梯形公式,\(n=2\)时为simpson公式。
  • 缺点:即使n取很大,余项也不一定收敛到0.

稳定性分析

  • 假设计算\(f(x_k)\)有一定舍入误差\(\varepsilon_k\),且假设\(C_k\)的计算没有误差。那么\(\varepsilon_k\)会导致积分产生的最终误差为\(\varepsilon \leqslant max|\varepsilon_k|(b-a)\sum C_k\),是无界的,因此高阶Newton-cotes公式是不稳定的。

复化求积

将区间\([a, b]\)分成\(n\)个小区间,在每个区间上构造低阶求积公式,并累加得到结果。其中令小区间宽度为\(h = \frac{a-b}{n}\)

  • 复化梯形公式: \(T_n = \int_a^b f(x)dx= \frac h2[f(a) + f(b) + 2\sum_{k=1}^{n-1}f(x_k)]\)

  • 复化\(simpson\)公式:要求\(n\)为偶数,令\(n=2m\),则: \(S_n = \int_a^b f(x)dx= \frac h3[f(a) + f(b) + 4\sum_{k=1}^{m}f(x_{2k-1}) + 2\sum_{k=1}^{m-1}f(x_{2k})]\)

  • 复化\(cotes\)公式:要求\(n=4m, m\in Z^+\)\(C_n = \int_a^b f(x)dx= \frac {4h}{90}[7f(a) + 7f(b) + 32\sum_{k=1}^{m}f(x_{4k-3}) + 12\sum_{k=1}^{m}f(x_{4k-2}) + 32\sum_{k=1}^{m}f(x_{4k-1}) + 14\sum_{k=1}^{m-1}f(x_{4k})]\)

  • 它们的余项(截断误差)分别为:

\[ \begin{cases} R_T = -\frac{b-a}{12}h^2f''(\eta), \eta \in [a, b] \\ R_S = -\frac{b-a}{180}(\frac h2)^4f^{(4)}(\eta), \eta \in [a, b] \\ R_C = -\frac{2(b-a)}{945}(\frac h4)^6f^{(6)}(\eta), \eta \in [a, b] \end{cases} \]

要注意,使用上述余项公式分别要满足\(f(x)\)\([a, b]\)上分别有连续的\(2,3,6\)阶导函数。这三个复化公式中,\(cotes\)的效率最高。

Romberg求积

使用渐进的方式,先取\(n=1\),使用复化求积计算积分,如果精度不达要求,再取\(n=2, 4, 8...\),直到精度达到要求。

这就要求找到从\(n=n_1\)\(n=2n_1\)的递推关系,以便可以利用上一步的计算结果进行计算。推导可得,梯形复化积分的递推公式分别为:

\[ T_{2n} = \frac12T_n + \frac h2\sum_{k=0}^{n-1}f(x_{k+\frac 12}) \]

为了加速收敛,我们在此基础上,利用梯形公式的余项推导得出\(T_{2n}\)的误差,并用这个误差修正\(T_{2n}\),得到修正后的公式:

\[\bar{T} = \frac{4}{3} T_{2n} - \frac{1}{3} T_{n}\]

这里经过验证发现\((p75)\),这个修正后的梯形公式,竟然和\(Simpson\)公式,也就是\(S_n\)的结果完全相等,即\(\bar{T}=S_n\)。类似地,\(S_{2n}\)用同样的方法得到的修正公式与\(C_{n}\)又恰好相等。而这个过程中,精度越来越高。

因此,我们把精度最高的\(C_n\)变步长(渐进)求积,并用误差修正后的公式作为\(romberg\)公式的最终值,也就是:

\[R_n = \frac{64}{63}C_{2n}-\frac{1}{63}C_n\]

可以看到,\(romberg\)公式将之前所讲的方法都集于一身。在计算\(romberg\)公式时,一般就按照\(T\rightarrow S \rightarrow C\rightarrow R\)的过程一步一步求积,直到精度满足要求。

#3.1 数值微分

  • 差商微分:\(f'(x) \approx \frac{f(x+h)-f(x-h)}{2h}\),截断误差约为\(O(h^2)\)
  • 插值微分:拉格朗日插值拟合\(f(x)\),再对插值后的多项式求导。

#4 解常微分方程数值解法

背景:给定常微分方程,求\(y(x)\)。数值解法中,不直接求\(y(x)\),而是求区间\([a, b]\)内一系列点\(x_0, x_1, ...x_n\)上函数的近似值\(y(k)\approx y_k\)

  • 欧拉法:使用差商\(f(x_n, y_n) = \frac{y_{n+1}-y_n}{h}\)来代替\(f'(x_n)\),并使用该公式,结合\(y_0\)的初值,递推得到\([y_0, y_1...y_n]\)的近似解。即\(y_{k+1} = y_k + hf(x_k, y_k)\)

  • 隐式欧拉法:使用前向的差商\(f(x_{n+1}, y_{n+1}) = \frac{y({n+1})-y(n)}{h}\)来代替\(y'(n+1)\)。即:

    \[y_{k+1} = y_k + hf(x_{k+1}, y_{k+1}) \tag{1}\]

  • 二步欧拉法:对公式\((1)\)右边的\(y_{k+1}\),使用显式的欧拉法进行估计的估计值\(\bar{y}_{k+1}=y_k + hf(x_k, y_k)\)进行代替。推导可得,这样得到的公式相当于使用中心差商\(\frac{y(x_{n+1})-y(x_{n-1})}{2h}\)来代替导数。即:\(y_{n+1} = y_{n-1} + 2hf(x_n, y_n)\)。在实际计算时,需要同时知道\(y_0, y_1\),其中\(y_1\)可以使用欧拉法求得。

  • 精度:若在进行递推时,直到\(y_{n+1}\)的表达式,其表达式中的量都是精确的(注意,不是\(y_{n+1}\)本身没有误差,而是其表达式中的\(y_n,x_n\)之类的量没有误差),并且其局截断误差为\(O(h^{p+1})\),则称该公式的精度为\(p\)阶。

  • 可以证明,欧拉法、隐式欧拉法、二步欧拉法的精度分别为\(1, 1, 2\)阶。

改进欧拉法

  • 梯形公式+欧拉法:不直接使用差商来进行递推,而使用定积分来递推。即为:\(y(x_{n+1}) = y(x_n) + \int_{x_n}^{x_{n+1}}y' dx\)。这里的积分公式我们使用梯形公式。 即:

    \[y_{n+1} = y_n + \frac{h}{2}[f(x_n, y_n) + f(x_{n+1}, y_{n+1})] \tag{2}\]

  • 可以证明,这样得到的公式精度为2阶,且恰好等于欧拉法和隐式欧拉法的算术平均。

  • 改进的欧拉法:仍然使用预报+校正的思想:仍然使用\(\bar{y}_{k+1}=y_k + hf(x_k, y_k)\)代替公式\((2)\)中右侧的\(y_{n+1}\)得到改进的公式。精度为2阶。代入\(\bar y_{k+1}\)后,可以等价于:

\[ \begin{cases} y_p = y_n + hf(x_n+y_n) \\ y_c = y_n + hf(x_{n+1}, y_p) \\ y_{n+1} = \frac{y_p+y_c}{2} \end{cases} \]

龙格-库塔法:更高阶精度的公式

  • 公式为\(y(x+{n+1}) = y(x_n) + hy'(\xi)\),其中\(y'(\xi)\)在实际计算中无法直接确定,而是使用多个点上\(y'\)近似值的适当组合来得到。

  • 二阶龙格-库塔法:在\([x_n, x_{n+1}]\)范围中取两个点,且设这两点上导数\(y'(x)\)近似值为\(k_1, k_2\),则二阶公式为: \[ \begin{cases} k_1 = f(x_n, y_n) \\ k_2 = f(x_n+ph, y_n+phk_1) \\ y_{n+1} = y_n + h[(1-\lambda k_1 + \lambda k_2)], where\; \lambda p = \frac{1}{2} \end{cases} \] 其中 \(\lambda, p\)可以在满足条件的情况下任取,这样可以得到无穷多的公式,他们的精度都是二阶。

  • 改进欧拉法:当\(\lambda = \frac{1}{2}, p=1\)时,龙格-库塔法退化为之前的改进的欧拉法。

  • 变型的欧拉法:当\(\lambda = 1, p=\frac12\)时,龙格-库塔法退化为变型的欧拉法。

  • \(n\)阶龙格-库塔法:使用\(n\)个点上导数近似值的线性组合来代替\(y'(\xi)\)

  • \(n=3\),可以得到库塔公式: \[ \left\{\begin{array}{l}{y_{n+1}=y_{n}+\frac{1}{6}\left(k_{1}+2 k_{2}+2 k_{3}+k_{4}\right)} \\ {k_{1}=h f\left(x_{n}, y_{n}\right)} \\ {k_{2}=h f\left(x_{n}+\frac{h}{2}, y_{n}+\frac{k_{1}}{2}\right)} \\ {k_{3}=h f\left(x_{n}+\frac{h}{2}, y_{n}+\frac{k_{2}}{2}\right)} \\ {k_{4}=h f\left(x_{n}+h, y_{n}+k_{3}\right)}\end{array}\right. \]

  • 最常用的是四阶龙格-库塔公式。其中,标准四阶公式为: \[ \left\{\begin{array}{l}{y_{n+1}=y_{n}+\frac{1}{6}\left(k_{1}+2 k_{2}+2 k_{3}+k_{4}\right)} \\ {k_{1}=h f\left(x_{n}, y_{n}\right)} \\ {k_{2}=h f\left(x_{n}+\frac{h}{2}, y_{n}+\frac{k_{1}}{2}\right)} \\ {k_{3}=h f\left(x_{n}+\frac{h}{2}, y_{n}+\frac{k_{2}}{2}\right)} \\ {k_{4}=h f\left(x_{n}+h, y_{n}+k_{3}\right)}\end{array}\right. \]

  • 另一个四阶公式(也叫吉尔公式)为: \[ \left\{\begin{array}{l}{y_{n+1}=y_{n}+\frac{1}{6}\left[k_{1}+(2-\sqrt{2}) k_{2}+(2+\sqrt{2}) k_{3}+k_{4}\right]} \\ {k_{1}=h f\left(x_{n}, y_{n}\right)} \\ {k_{2}=h f\left(x_{n}+\frac{h}{2}, y_{n}+\frac{k_{1}}{2}\right)} \\ {k_{3}=h f\left(x_{n}+\frac{h}{2}, y_{n}+\frac{\sqrt{2}-1}{2} k_{1}+\frac{2-\sqrt{2}}{2} k_{2}\right)} \\ {k_{4}=h f\left(x_{n}+h, y_{n}-\frac{\sqrt{2}}{2} k_{2}+\frac{2+\sqrt{2}}{2} k_{3}\right)}\end{array}\right. \]

  • 变步长龙格-库塔法:假设使用\(p\)阶公式,则从\(x_n\)开始,首先以步长\(h\)求出一个近似值\(y_{n+1}^{(h)}\),然后步长折半,跨两步从\(x_n\rightarrow x_{n+1}\),得到\(y_{n+1}^{(h/2)}\)…不断折半,直到精度满足要求。其中,步长折半前后两次,计算结果的偏差为:$= 1{2^P-1} |y_{n+1}^{(h/2)}- y_{n+1}^{(h)}| $ ,用于检验精度是否满足要求。

收敛性与稳定性

  • 单步法:公式满足\(y_{n+1} = y_n + h\varphi(x_n, y_n, h)\)的方法(前面所讲的方法都是单步法)。
  • 收敛性:当\(n \rightarrow \infty\)\(y_n \rightarrow y(x_n)\)。对单步法,收敛等价于\(n \rightarrow \infty\)时,满足截断误差为0,也等价于函数\(\varphi\)满足李普希兹条件:$|(x, y, h) - (x, {y}, h)| L_|y - {y}| $
  • 稳定性:先空着叭复习再写

边值问题

问题背景:解二阶方程\(y’' + p(x)y' + q(x)y = r(x), a<x<b\),且已知条件为边值条件(而非初值条件)。可能有以下三类:

  • $y(a) = , y(b) = $
  • $y’(a) = , y’(b) = $
  • \(y'(a) - \alpha_0y(a) = \alpha_1, y'(b) - \beta_0y(b) = \beta_1\) ,其中 $ _0,_00, _0+_0>0 $

解法:

  • 仍然划分\([a, b]\)\(N\)等分,在每个划分节点\(x_i = x_0 + ih\)\(h\)为步长\(\frac{b-a}{N}\))上代入得到\(N+1\)个方程,并使用一阶、二阶差商代替一阶、二阶导数:$y’, y’’ $,得到一个方程组,然后再求解。

方程求根

问题背景:求方程\(f(x) = 0\)的根。

  • 根的隔离:在\(f(x)\)的定义域上寻找\([a, b]\)使得在该区间内只有一个根(零点)。

  • 找根:二分法(不能求偶数重根)

  • 迭代法:先找出一个精度较低的根的近似值,然后逐渐迭代。以求\(x^3 - x - 1 = 0\)的根为例,具体方法是根据方程写出\(x\)的一个表达式:

    \[x=\sqrt[3]{x+1} \tag{1}\]

  • 式子右边可以含\(x\)。假设要求\(x_0=1.5\)附近的根,那么将\(x_0\)带入式\((1)\),求得\(x_1\),再将\(x_1\)带入求得\(x_2\)…以此类推,不断迭代,精度不断提高。直到\(|x_{k+1} - x_k| < \varepsilon\)时停止迭代。

  • 不动点迭代:从另一个视角看,上述过程就是把\(f(x)=0 \rightarrow x =g(x)\),然后求\(g(x)\)的不动点。

  • 收敛性:啊我生病了这部分没上课(

  • 加速收敛(艾特肯方法):这部分也没了复习再说吧

  • 牛顿法:使用一阶泰勒展开来拟合\(f(x)\)。选定一个初值\(x=x_0\),使用公式\(x_{k+1} = x_k - \frac{f(x_k)}{f'(x_k)}\)进行迭代。

  • 牛顿法の收敛性:收敛速度是二阶。

  • 牛顿下山法由于牛顿法初值选取时如果距离根过远,很可能导致发散。因此在牛顿法的迭代过程中,修改迭代公式为\(x_{k+1} = x_k - \lambda\frac{f(x_k)}{f'(x_k)}\)(加入了一个权重\(\lambda\))。这个\(\lambda\)的作用是,控制使得迭代过程中始终满足\(|f(x_{k+1})| < |f(x_k)|\)(称为下山条件)。每一步迭代时,\(\lambda\)\(1\)开始取,如果不满足下山条件,则\(\lambda\)减半,直到满足为止。

  • 近似牛顿法:不求到,改为一个固定常数\(c\)\(x_{k+1} = x_k - \frac{f(x_k)}{c}\)

  • 弦截法:使用\(x_0, x_k\)两点的一阶差商代替导数:\(x_{k+1} = x_k - \frac{f(x_k)}{f(x_k) - f(x_0)}(x-x_0)\)

  • 快速弦截法:使用\(x_{k-1}, x_k\)两点的一阶差商代替导数:\(x_{k+1} = x_k - \frac{f(x_k)}{f(x_k) - f(x_{k-1})}(x-x_{k-1})\)

  • 抛物线法:这个不考,好.jpg

解线性方程组

  • 向量的范数:\(||x||\)满足正定,齐次,三角不等式(\(| ||x|| - ||y|| | \leqslant ||x-y||\))。
    • \(||x||_1 = \sum|x_i|\)
    • \(||x||_2 = \sqrt{\sum{|x_i|^2}}\)
    • \(||x||_p = (\sum|x_i|^p)^{\frac{1}{p}}\)
  • 向量的收敛:若有向量序列\(X={x_k}\),其中每个\(x_k\),都存在\(x'\),有\(\lim_{k\rightarrow \infty}|| x_k - x' ||=0\),则称向量序列\(X\)收敛。
  • 矩阵范数:
    • f范数:对\(A\in R^{n\times n}, |A|_f =(\sum_i \sum_j |a_{ij}|^{2})^{\frac12}\)
    • 诱导范数:对\(A\in R^{n\times n}, x\in R^n,||x||=1\),有:\(||A|| = \sup ||Ax||\)。也即\(|| Ax || \leqslant ||A|| \cdot ||x||\)
    • 列和范数:\(||A||_1 = \max_j \sum_i |a_{ij}|\)(各列和的最大值)
    • 谱范数:\(||A||_2 = \sqrt{\lambda_1},\lambda_1\)\(AA^T\)的最大特征值。
    • 无穷范数(行和范数):各行和的最大值。
  • 迭代法:从初始近似解向量开始迭代,使其逼近真实解。
  • 高斯消元法: