Вычисления длинных формул PHP дают неправильные ответы?


Итак, моя проблема заключается в следующем. У меня есть формула (см. Рисунок), в соответствии с которой я должен вычислить некоторые координаты, указанные в поле вывода.

enter image description here

Я создал свои формулы на php, но он возвращает неправильные результаты.

Формула:

    $inpx =(string)3484481.0943; //input X
    $inpy =(string)3144325.1033;//input Y
    $inpz =(string)4305103.1740;//input Z

    $dx=-2.0796; //delta X
    $dy=-0.3484; //delta Y
    $dz=1.7009;  //delta Z
    $rx=(string)(0.05465/3600)*(string)(M_PI/180);  
    $ry=(string)(-0.06718/3600)*(string)(M_PI/180);
    $rz=(string)(0.06143/3600)*(string)(M_PI/180);
    $k=(string)0.0181/(string)pow(10,6);
    $n=1+$k;

    $X84=$n*$inpx-$rz*$n*$inpy+$ry*$n*$inpz+$dx;
    $Y84=$rz*$n*$inpx+$n*$inpy-$rx*$n*$inpz+$dy;
    $Z84=-$ry*$n*$inpx+$rx*$n*$inpy+$n*$inpz+$dz;

    $X84 = round($X84,4);
    $Y84 = round($Y84,4);
    $Z84 = round($Z84,4);

Результаты, которые я должен получить

  $X84 = 3484481.4163;
  $Y84 = 3144324.9149;
  $Z84 = 4305102.9848;

Результаты, которые я получаю

  $X84 = 3484476.7392;
  $Y84 = 3144324.7089;
  $Z84 = 4305106.9208;

Был бы признателен, если бы кто-нибудь смог найти, что у меня не так в моей формуле, потому что я я возился с этим уже несколько дней.

Author: superphonic, 2014-04-11

1 answers

Обновлено:
После дальнейшего рассмотрения я полагаю, что у вас есть ошибка с положительным и отрицательным знаком на ваших введенных значениях rv.

$inpx =(float)3484481.0943; //input X
$inpy =(float)3144325.1033;//input Y
$inpz =(float)4305103.1740;//input Z

$dx=-2.0796; //delta X
$dy=-0.3484; //delta Y
$dz=1.7009;  //delta Z

Перед:

$rx=(float)(0.05465/3600)*(float)(M_PI/180);  
$ry=(float)(-0.06718/3600)*(float)(M_PI/180);
$rz=(float)(0.06143/3600)*(float)(M_PI/180);

После и в результате получены правильные результаты:

$rx=(float)(-0.05465/3600)*(float)(M_PI/180);  
$ry=(float)(0.06718/3600)*(float)(M_PI/180);
$rz=(float)(-0.06143/3600)*(float)(M_PI/180);

Просто изменив положительный и отрицательный знак на всех трех значениях rv, я получаю ожидаемые результаты.

$k=(float)0.0181/(float)pow(10,6);
$n=1+$k;

Для ясности я также добавил некоторые круглые скобки в следующую функцию.

$X84=($inpx*$n)+(-$rz*$inpy*$n)+($ry*$inpz*$n)+$dx;
$Y84=($rz*$n*$inpx)+($n*$inpy)+(-$rx*$n*$inpz)+$dy;
$Z84=(-$ry*$n*$inpx)+($rx*$n*$inpy)+($n*$inpz)+$dz;

$X84 = round($X84,4);
$Y84 = round($Y84,4);
$Z84 = round($Z84,4);

print_r($X84); //3484481.4164 
print_r($Y84); //3144324.9147
print_r($Z84); //4305102.9848

Надеюсь, это поможет решаем вашу проблему!

 1
Author: Dave Cartwright, 2014-04-13 21:00:24