这个名为 LAGRANGE2 的函数有什么作用?

计算科学 多项式
2021-12-03 04:33:55

在浏览来自苏联大型机 BESM-6 的磁盘映像时,我发现了一些用于 Algol-60 的计算数学库的点点滴滴,它们以明文形式存储(如果使用奇偶校验的苏联GOST 10859编码,就像在穿孔卡片上一样,可以认为是明文)。

由于以诙谐/熟悉的方式表达的错误消息,一个功能特别令人感兴趣。函数名的意思是LAGRANGE2,几个单字母Cyrillic变量名应该不会太混乱。

为了便于阅读,我添加了空格、缩进和重排文本:

_REAL _PRОCEDURE ЛАГРАНЖ2(A,Х,У,Х1,Х2,P,П,П1);
_REAL Х1, Х2; _INTEGER P, П, П1; _ARRAУ A, Х, У;
_BEGIN
_REAL S, Z, Z1;
_INTEGER I, J, J1, К;
_ARRAУ S1[0:20];
_INTEGER Я, Я1;
    _IF Х2 < A[1] _THEN _BEGIN
        Z := Х2;
        _GО _TО М3;
    _END ;
    _IF Х1 < Х[1] _THEN _BEGIN
        Z := Х1;
        _GО _TО М3;
    _END ;
    S := 0;
    _FOR J1 := 1 _STEP 1 _UNTIL П1 _DО
        _IF Х2 ≥ A[J1] ∧ Х2 ≤ A[J1+1] _THEN
            _GО _TО М1;
    Z := Х2;
    _GО _TО М2;
    М1: _FOR I := 1 _STEP 1 _UNTIL П _DО
    _IF Х1 ≥ Х[I] ∧ Х1 ≤ Х[I+1] _THEN
        _GО _TО М;
    Z := Х1;
    _IF Х1 ≤ Х[П] _THEN
        _GО _TО М;
    М2: _IF Х2 ≤ A[П1] _THEN
        _GО _TО М;
    М3: ОUTPUT(‘T’,‘ПРИ  ОБРАЩЕНИИ  К  ПРОЦЕДУРЕ  ЛАГРАНЖ2  АРГУМЕНТ=’,
        ‘E’,Z,‘T’,
        ‘ВЫШЕЛ  ЗА  ПРЕДЕЛЫ  ТАБЛИЦЫ. РАЗБЕРИСЬ  В  ЧЕМ  ДЕЛО, А  Я  ПРЕРЫВАЮ  СЧЕТ. ДО  ВСТРЕЧИ!’);
    ОUTPUT(‘×’);
    S := S / 0;
    М: _IF I ≤ П - P _THEN
        J := I
    _ELSE
        J := П - P;
    _IF J1 > П1 - P _THEN
        J1 := П1 - P;
    Я1 := J1;
    _FOR Я := 0 _STEP 1 _UNTIL P _DО _BEGIN
        S := 0;
        _FOR I := 0 _STEP 1 _UNTIL P _DО _BEGIN
            Z := Z1 := 1;
            _FOR К := 0 _STEP 1 _UNTIL P _DО _BEGIN
                _IF К ≠ I _THEN
                    Z := Z × (Х1 - Х[К+J]) / (Х[I+J] - Х[К+J]);
            _END ;
            S := S + У[I + J + (J1 - 1) × П] × Z;
        _END ;
        S1[Я] := S;
        J1 := J1 + 1;
    _END ;
    S := 0;
    _FOR I := 0 _STEP 1 _UNTIL P _DО _BEGIN
        Z := Z1 := 1;
        _FOR К := 0 _STEP 1 _UNTIL P _DО _BEGIN
            _IF К ≠ I _THEN
                Z := Z × (Х2 - A[К + Я1]) / (A[I + Я1] - A[К + Я1]);
        _END ;
        S := S + S1[I] × Z;
    _END ;
    ЛАГРАНЖ2 := S;
_END 

错误消息的意思是“调用 LAGRANGE2 过程时,参数在表之外。找出问题所在,我正在中断计算。再见!”。打印消息后,强制出现除零错误。

那个函数在计算什么?一个猜测是拉格朗日插值,但计算所有系数只产生一个结果是浪费的。此外,有 3 个输入数组,而不是预期的两个。

1个回答

从名称、错误消息和代码来看,该代码似乎正在为函数进行拉格朗日多项式插值f(x), 给定

x1<x2<<xn

和函数值

f(x1),f(x2),,f(xn)

您可以使用拉格朗日插值多项式来插值f(x)在任何时候x在哪里x1<x<xn. 对于以下值,该方法不可靠(并且代码拒绝接受)x范围之外x表中的值。