2026-09-03 计算物理:割圆术、数值稳定性与插值

计物

割圆术:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <math.h>

int main(void)
{
double h;
int i = 6;
double l = 1;
double r = 1;
int n;
scanf("%d", &n);

for (int k = 0; k < n; k++)
{
x = l * 0.5;
h = sqrt(r * r - x * x);
S = i * x * h;
l = sqrt((r - h) * (r - h) + x * x);
i *= 2;
}

return 0;
}

问题:(r−h)2 相差太小,两个数相减,有效数字丢失。

解决:

r−h=r2−h2r+h=x2r+h.

当 r=1 时,

(1−h)2+x2=(1−h)[(1−h)+(1+h)]=2(1−h)=2x21+h.

AI 代码校核

手写代码的主要问题:

  • x 和 S 未声明,代码无法通过编译;应声明为 double x, S;。
  • 计算出 S 后没有输出;若要观察圆周率近似值,应在循环中或循环后使用 printf。
  • 原更新式中的 r - h 会在 h≈r 时发生相消,正是板书指出的数值不稳定处。
  • 对本页的 r=1 ,可将边长更新改为 l = sqrt(2 * x * x / (1 + h));。若保留一般半径 r ,稳定的等价式是 l = sqrt(2 * r * x * x / (r + h));。
  • i 实际表示正多边形边数,改名为 sides 会更清楚;若迭代很多次,int 还可能溢出。

插值问题

Lagrange 插值法。

高次多项式插值

y=f(x),qquada<x0<⋯<xn<b,

共 n+1 个不同点。

若

Pn(x)=a0+a1x+⋯+anxn

使

Pn(xk)=yk,

则 Pn(x) 是 y=f(x) 的插值多项式。

存在性与唯一性:

{a0+a1x0+⋯+anx0n=y0,⋮a0+a1xn+⋯+anxnn=yn.

方程组有唯一解,因为 Vandermonde 行列式

|1x0x02⋯x0n1x1x12⋯x1n⋮⋮⋮⋮1xnxn2⋯xnn|=∏0≤j<i≤n(xi−xj)≠0.

[G: 补充展开式和证明]

G 补充

记该行列式为 Vn(x0,…,xn) 。把它看成关于 xn 的多项式:当 xn=xj (j<n )时,末行与第 j 行相同,所以行列式为零。因此它含有全部因子

∏j=0n−1(xn−xj).

关于 xn 的最高次项系数是前 n 行构成的 Vandermonde 行列式 Vn−1 ,故

Vn=Vn−1∏j=0n−1(xn−xj).

递推并使用 V0=1 ,得到

Vn=∏0≤j<i≤n(xi−xj).

各节点互异,所以每个因子都非零,线性方程组因而有唯一解。

{x0,x1,…,xn}={1,x,…,xn}

相互独立,构成一组完备基。

[G: 是正交基吗,证明?]

G 补充

它是多项式空间 Pn 的一组基,但没有指定内积时不能称为“正交基”。线性无关可这样证明:若

a0+a1x+⋯+anxn≡0,

零多项式的每个系数都必须为零,因此 a0=⋯=an=0 。同时任意次数不超过 n 的多项式都能由这些单项式线性表示,所以它们张成 Pn 。

插值示意图

线性插值

L(x)=y0+y1−y0x1−x0(x−x0).
l0(x)=x−x1x0−x1,l1(x)=x−x0x1−x0.
l0(x0)=1,l1(x0)=0,
l0(x1)=0,l1(x1)=1.

于是

y0l0(x)+y1l1(x)=x1−xx1−x0y0+x−x0x1−x0y1=y0+y1−y0x1−x0(x−x0)=L(x).

抛物线插值

三点不共线,总有一条抛物线经过。

L2(x)=∑ili(x)yi.

li(x) 是二次多项式,且

li(xj)=δij.

故可设

l0(x)=k0(x−x1)(x−x2).

由 l0(x0)=1 ,

k0=1(x0−x1)(x0−x2).

同理,

k1=1(x1−x2)(x1−x0),⋯

多项式插值

li(x)=∏j=0j≠inx−xjxi−xj.

缺点:无递推性;增加节点,需要全部重新计算。

Newton 插值法

差商:

f[x0,x1]=f(x1)−f(x0)x1−x0.
f[x0,x1,x2]=f[x1,x2]−f[x0,x1]x2−x0.
f[x0,x1,x2]=y1−y2x1−x2−y0−y1x0−x1x2−x0=(x0−x1)(y1−y2)−(x1−x2)(y0−y1)(x2−x0)(x1−x2)(x0−x1).
f[x0,…,xk]=∑i=0kyi(xi−x0)⋯(xi−xi−1)(xi−xi+1)⋯(xi−xk).

[G: 差商性质]

G 补充

差商具有以下常用性质:

  • 对节点对称,交换 x0,…,xk 的次序不改变 f[x0,…,xk] 。
  • 对函数具有线性:(af+bg)[x0,…,xk]=af[x0,…,xk]+bg[x0,…,xk] 。
  • 若 f 是次数低于 k 的多项式,则 k 阶差商为 0 ;若次数恰为 k ,则 k 阶差商等于最高次项系数。
  • 若 f∈Ck ,则存在节点区间内的 ξ ,使
f[x0,…,xk]=f(k)(ξ)k!.

Newton 插值。

线性:

N1(x)=f(x0)+(x−x0)f[x0,x1].

由于插值的唯一性,Nn(x) 与 Ln(x) 是同一个多项式,只是形式不同。

二次:

N2(x)=N1(x)+k(x−x0)(x−x1).

由 N2(x2)=y2 ,

k(x2−x0)(x2−x1)=y2−N1(x2),
k=f[x0,x2]−f[x0,x1]x2−x1=f[x0,x1,x2].
f[x0,x1,x2]=y0(x0−x1)(x0−x2)+y1(x1−x0)(x1−x2)+y2(x2−x0)(x2−x1).

例题:

f(x)=11+x.

L4(x) ,L8(x) 。


2026-09-03 计算物理:割圆术、数值稳定性与插值
https://sitson.pages.dev/2026/09/03/2026-09-03-computational-physics-interpolation-stable-polygon/
Author
Joe Lewis
Posted on
September 3, 2026
Licensed under