PHP长公式计算会给出错误的答案吗?

9
所以我的问题是这样的。我有一个公式(见图片),根据这个公式,我应该计算一些坐标,输出在输出字段中。
我用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;

希望有人能够找出我公式中的错误,因为我已经折腾了几天了。


我使用浮点数进行了检查,得到了与你相同的答案,在as3中也是如此,但结果仍然是错误的。我为这个项目服务的人们从头到尾检查了我的代码和公式,一切都是正确的,但仍然返回错误的答案。 - Guram
我把它弄碎成非常小的部分,每个组件都是正确的,但由于某种该死的原因它没有执行最后一个方程。 - Guram
在前十行中,您传递了许多文字数字... 您确定每个数字都是正确的吗?没有颠倒顺序吗? - James Cronen
否则我就不知道了。你的矩阵乘法看起来没问题。我也找不到任何意外的运算顺序怪异。 - James Cronen
3
使用Excel软件,我得到了以下结果:$X84=3484477.6761,$Y84=3144325.6520,$Z84=4305107.8429。还没有人问过$X84=3484481.4163,$Y84=3144324.9149,$Z84=4305102.9848的预期值以及这些值是如何获得的。这些值的获取是否可能存在错误? - jing3142
显示剩余10条评论
1个回答

1

更新:
经过进一步考虑,我认为您输入的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
经过一夜的思考,更新了旧的解决方案! - Dave Cartwright
很高兴听到它有所帮助。 - Dave Cartwright

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接