我知道这本身并不完全与编程相关,但程序员是最有可能认识到这一点的人.
我有以下(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)
">"是一个延续的标志.
代码运行如下
例程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)

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)
我觉得现在这应该是显而易见的,但我无法理解它......