Что здесь делается? (Используется математическое распознавание) - PullRequest
4 голосов
/ 27 июня 2010

Я знаю, что это не в точности программирование как таковое, но программисты являются наиболее вероятными из всех людей, которые могут это понять.

У меня есть следующее (X и Yявляются массивами, оба с 3 элементами), и я не могу распознать (хотя это напоминает мне о некоторых вещах, но ни о чем совсем!), что делается здесь.Звонит ли кто-нибудь в колокола для кого-то еще?

Я так понимаю, вы можете не обращать внимания на нижнюю часть;верхняя часть, вероятно, должна отдать его ... но я все еще не вижу его.

Сначала он напомнил мне о линейной интерполяции в трехмерном пространстве ...

  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

">" - знак продолжения.

Ответы [ 5 ]

9 голосов
/ 27 июня 2010

Код работает следующим образом

Подпрограмма 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]]

enter image description here

8 голосов
/ 27 июня 2010

D является определителем матрицы:

        | x(1) x(1)² 1 |
D = det | x(2) x(2)² 1 |
        | x(3) x(3)² 1 |

В D1 крайний правый столбец заменен на Y:

         | x(1) x(1)² Y(1) |
D1 = det | x(2) x(2)² Y(2) |
         | x(3) x(3)² Y(3) |

В D2 и D3 это первый и второй столбцы соответственно. Теперь легче узнать? Очень похоже на использование правила Крамера для решения линейного уравнения для меня.

Редактировать: Чтобы быть более точным: (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)

YR - квадрат решения квадратного уравнения (nb, различный x!):

C*x² + B*x + A = 0

Я чувствую, что это должно быть очевидно сейчас, но я не могу понять это ...

4 голосов
/ 27 июня 2010

Этот код представляет собой своего рода интерполяцию / подгонку квадратичной кривой по трем двумерным точкам вместе со способом вычисления минимального или максимального значения такой подобранной квадратики в самом интервале.Я предполагаю, что TRII обозначает тройную (точечная) -интерполяция, а TRIM обозначает тройной (точечный) минимум или максимум.

Чтобы быть более точным, TRII решает задачу: - найти квадратичную кривую, которая проходит через точки (x1, y1), (x2, y2) и (x3, y3) в форме Y = A + B X + C X ^ 2 и вычислите значение Y квадратичного в точке XR и вернитесь как YR.Это в основном способ плавной интерполяции между тремя 2d точками.Он часто используется для нахождения лучшего приближения для максимального или минимального значения набора дискретных точек данных.

Все, что нужно для D, D1, D2, D3 - это решить матричное уравнение:

(1 X1 X1 ^ 2) * (A) = (Y1)

(1 X2 X2 ^ 2) * (B) = (Y2)

(1 X3 X3 ^ 2) * (C) = (Y3)

с использованием правила Крамерса, как упомянуто в одном из других комментариев, D - определитель матрицы, а D1, D2, D3 - кофакторы.

TRIMснова вычисляет квадратичный Y = A + B X + C X ^ 2 и затем находит max / min этого квадратичного (XM, YM).Это делается путем первоначального нахождения точки, в которой квадратик имеет поворотный момент: если F (X) = A + B X + C X ^ 2, F '(XR) = B + 2 * C *XR = 0 или XR = -B / 2 * C, YR = A + B XR + C XR ^ 2.Тогда существует некоторая логика, чтобы заставить возвращаемые значения XM, YM min или max лежать в определенных пределах.

Код:

XM = XR.,,IF (YM.LT.Y (1)) YM = Y (1)

Немного странно, поскольку, если мы предположим, что GT и LT означают больше и меньше соответственно, тогда мы должны предположить, что X3 '<'X1 в противном случае условие (XR.GT.X (1) .OR.XR.LT.X (3)) является тривиальным, а XM, YM установлены на X1, Y1. </p>

Так что X3' <'X1 и условие говорит о том, что если квадратичное значение max / min находится за пределами интервала (X1, X3), тогда установите (XM, YM) на (X1, Y1), как и раньше.Если нет, то если Y1 выше минимального / максимального значения в Y, тогда снова установите (XM, YM) на (X1, Y1). </p>

Трудно понять, что это значит, и я подозреваю, что код может бытьнеправильно!Есть мысли?

Иван

4 голосов
/ 27 июня 2010

Я не уверен, что это за язык, но ясно, что это своего рода решатель для квадратных уравнений.Выражения XR и YR - бесполезная раздача:

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

Однако, не зная, что такое выражения X(1..3) и Y(1..3), невозможно сделать слишком много выводово том, что коэффициенты A / B / C представляют , однако.Многие вещи используют квадратные уравнения - площадь круга с учетом радиуса, интенсивность света на заданном расстоянии и так далее.Требуется больше контекстных данных.

Обновление: ОП указал, что он не может быть слишком конкретным по причинам секретности.Вот несколько подсказок:

  • Что возвращает подпрограмма?Как эти результаты используются позже?Это может привести к лучшему пониманию.

  • Похоже, что Y (1) является своего рода магической нижней границей для результата этого вычисления.Обратите внимание, что если YM меньше Y(1), то для XM и YM установлены значения X(1) и Y(1) соответственно.

  • "D"«выражения выглядят так, в более естественном синтаксисе:

d = x1 * [x2^2 - x3^2] + x2 * [x3^2 - x1^2] + x3 * [x1^1 - x2^2]
  d1 = y1 * [x2*x3^2 - x3*x2^2] + y2 * [x3*x1^2 - x1*x3^2] + y3 * [x1*x2^2 - x1*x2^2]
  d2 = y1 * [x2^2 - x3^2] + y2 * [x3^2 - x1^2] + y3 * [x1^2 - x2^2]
  d3 = x2 * [y3 - y1] + x1 * [y2 - y3] * x3 * [y1 - y2]
  • Это очень похоже на какую-то матричную операцию;D почти наверняка для "определителя".Но есть и другие вещи, которые имеют такие же математические отношения.
1 голос
/ 27 июня 2010

Это способ решения систем линейных уравнений, в частности правило Крамера . Также взгляните на правило сарруса . После этого вы, кажется, строите из него квадратное уравнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...