这里做了什么?(使用数学识别)

Roo*_*ook 4 math fortran

我知道这本身并不完全与编程相关,但程序员是最有可能认识到这一点的人.

我有以下(X和Y是数组,都有3个元素),我无法识别(虽然它让我想起了一些事情,但没有完全!)这里做了什么.它会为其他人敲响任何铃声吗?

我认为你可以忽视下半部分; 鞋帮应该放弃......但我仍然看不到它.

起初它让我想起了3d空间中的线性插值......

  SUBROUTINE TRII(X,Y,XR,YR)
DIMENSION X(3),Y(3)

D=X(1)*(X(2)**2-X(3)**2)+
 >    X(2)*(X(3)**2-X(1)**2)+
 >    X(3)*(X(1)**2-X(2)**2)

D1=Y(1)*(X(2)*X(3)**2-X(3)*X(2)**2)+
 >     Y(2)*(X(3)*X(1)**2-X(1)*X(3)**2)+
 >     Y(3)*(X(1)*X(2)**2-X(2)*X(1)**2)

D2=Y(1)*(X(2)**2-X(3)**2)+
 >     Y(2)*(X(3)**2-X(1)**2)+
 >     Y(3)*(X(1)**2-X(2)**2)

D3=X(2)*(Y(3)-Y(1))+
 >     X(1)*(Y(2)-Y(3))+
 >     X(3)*(Y(1)-Y(2))

A=D1/D
B=D2/D
C=D3/D

YR=A+B*XR+C*XR**2

RETURN
END

  SUBROUTINE TRIM(X,Y,XR,YR,XM,YM)
DIMENSION X(3),Y(3)

D=X(1)*(X(2)**2-X(3)**2)+
 >    X(2)*(X(3)**2-X(1)**2)+
 >    X(3)*(X(1)**2-X(2)**2)

D1=Y(1)*(X(2)*X(3)**2-X(3)*X(2)**2)+
 >     Y(2)*(X(3)*X(1)**2-X(1)*X(3)**2)+
 >     Y(3)*(X(1)*X(2)**2-X(2)*X(1)**2)

D2=Y(1)*(X(2)**2-X(3)**2)+
 >     Y(2)*(X(3)**2-X(1)**2)+
 >     Y(3)*(X(1)**2-X(2)**2)

D3=X(2)*(Y(3)-Y(1))+
 >     X(1)*(Y(2)-Y(3))+
 >     X(3)*(Y(1)-Y(2))

A=D1/D
B=D2/D
C=D3/D

XR=-B/(2.*C)
YR=A+B*XR+C*XR**2

XM=XR
IF(XR.GT.X(1).OR.XR.LT.X(3))XM=X(1)
YM=A+B*XM+C*XM**2
IF(YM.LT.Y(1))XM=X(1)
IF(YM.LT.Y(1))YM=Y(1)

RETURN
END
Run Code Online (Sandbox Code Playgroud)

">"是一个延续的标志.

Dr.*_*ius 9

代码运行如下

例程TRII将三个点(x,y)的坐标作为输入,并使用拉格朗日插值对抛物线进行插值.也将坐标XR作为输入.在YR中返回内插抛物线的XR值. 我想这个例程的名称来自"TRI"(克罗地亚语为"三"(分))和"I"代表插值.

例程TRIM也计算相同的抛物线,并在区间{X(1),X(3)}中返回函数的最小值.名称来自"TRI"和"M"(最小)

(我"真的"执行了程序)>)

请注意,这是FORTRAN代码,参数通过引用传递,因此结果返回相同的参数(非常奇怪!)

编辑

只是为了好玩,让我们运行TRII

TRII[X_, Y_, XR_] := 
  Module[{D0, D1, D2, D3, A, B, C}, 
     D0 = X[[1]]*(X[[2]]^2 - X[[3]]^2) + 
          X[[2]]*(X[[3]]^2 - X[[1]]^2) + 
          X[[3]]*(X[[1]]^2 - X[[2]]^2);
     D1 = Y[[1]]*(X[[2]]*X[[3]]^2 - X[[3]]*X[[2]]^2) + 
          Y[[2]]*(X[[3]]*X[[1]]^2 - X[[1]]*X[[3]]^2) + 
          Y[[3]]*(X[[1]]*X[[2]]^2 - X[[2]]*X[[1]]^2);
     D2 = Y[[1]]*(X[[2]]^2 - X[[3]]^2) + 
          Y[[2]]*(X[[3]]^2 - X[[1]]^2) + 
          Y[[3]]*(X[[1]]^2 - X[[2]]^2);
     D3 = X[[2]]*(Y[[3]] - Y[[1]]) + 
          X[[1]]*(Y[[2]] - Y[[3]]) + 
          X[[3]]*(Y[[1]] - Y[[2]]);
   A = D1/D0;
   B = D2/D0;
   C = D3/D0;
   Return[A + B*XR + C*XR^2];];

X = RandomReal[1, 3];
Y = RandomReal[1, 3];
Show[Plot[TRII[X, Y, x], {x, 0, 1}], 
 ListPlot[Transpose[{X, Y}], PlotMarkers -> Automatic]]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


wax*_*ing 8

D是矩阵的决定因素:

        | x(1) x(1)² 1 |
D = det | x(2) x(2)² 1 |
        | x(3) x(3)² 1 |
Run Code Online (Sandbox Code Playgroud)

在D1中,最右边的列已替换为Y:

         | x(1) x(1)² Y(1) |
D1 = det | x(2) x(2)² Y(2) |
         | x(3) x(3)² Y(3) |
Run Code Online (Sandbox Code Playgroud)

在D2和D3中,它们分别是第一列和第二列.现在更容易识别吗?看起来很像使用Cramer的规则来解决线性方程式.

编辑:更确切地说:(A,B,C)是系统的解决方案:

A + x(1)*B + x(1)²*C = Y(1)
A + x(2)*B + x(2)²*C = Y(2)
A + x(3)*B + x(3)²*C = Y(3)
Run Code Online (Sandbox Code Playgroud)

YR是二次方程解的平方(nb,不同的x!):

C*x² + B*x + A = 0
Run Code Online (Sandbox Code Playgroud)

我觉得现在这应该是显而易见的,但我无法理解它......