如@OmG 所示,您的方程类似于 n 球体的方程。因此,试图找到所有可能的解决方案是很困难的,因为它们的数量是无限的。可以使用一个简单的参数方程找到所有解的参数化版本:
2D: x1=cos(t1) t1 in [0,2pi[
x2=sin(t1)
3D: x1=cos(t1) t1 in [0,pi]
x2=sin(t1) cos(t2) t2 in [0,2pi[
x3=sin(t1) sin(t2)
4D: x1=cos(t1) t1 in [0,pi]
x2=sin(t1) cos(t2) t2 in [0,pi]
x3=sin(t1) sin(t2) cos(t3) t3 in [0,2pi[
x4=sin(t1) sin(t2) sin(t3)
...
见https://en.m.wikipedia.org/wiki/N-sphere
如果您只对达到给定小数精度的解决方案感兴趣,那么您不应该使用浮点数,而是整数。例如,如果您对方程x 1 2 + x 2 2 + x 3 2 = 1的所有解x 1、x 2、x 3感兴趣。其中x 1,2,3 = ±ab,a = 0 或 1,b 为 0,1,2,3,4,5,6,7,8 或 9。那么使用整数更容易避免使用数字由于浮点近似而导致的错误(请参阅浮点数学是否损坏?)。您需要做的就是将您的数字乘以 10 (y 1 = 10 · x 1 ) 并从整数角度求解方程y 1 2 + y 2 2 + y 3 2 = 100 。
在这种情况下,一个简单的蛮力算法就是:
do i=0,10
do j=0,i
if (i*i + j*j > 100) jump out of j-loop
do k=0,j
if (i*i+j*j+k*k == 100) print i,j,k
end do
end do
end do
上面将打印 i,j,k。但是,所有可能的排列和符号更改也是有效的解决方案。所以解决方案 (8,6,0) 也意味着 (-8,6,0), (-6,0,8), (0,8,6), ... 是解决方案。
所以最后,我们将浮点问题简化为一个更容易在数值上检查的整数问题。
现在与这个问题相关的是:
如果您想加快速度,您可能还对以下内容感兴趣: