Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用一个变量求大量函数的根_Python_Numpy_Scipy_Raytracing - Fatal编程技术网

Python 用一个变量求大量函数的根

Python 用一个变量求大量函数的根,python,numpy,scipy,raytracing,Python,Numpy,Scipy,Raytracing,我正在使用Python/numpy/scipy编写一个小型光线跟踪器。曲面建模为二维函数,给出高于法线平面的高度。我把求射线和曲面的交点的问题简化为求一个单变量函数的根。这些函数是连续的和连续可微的 有没有比使用scipy根查找器(可能使用多个进程)在所有函数上循环更有效的方法 编辑:这些函数是表示光线的线性函数和曲面函数之间的差异,约束在相交平面上。以下示例显示了使用对分法并行计算100万个函数x**(a+1)-b(所有函数都具有不同的a和b)的根。这里大约需要12秒 import numpy

我正在使用Python/numpy/scipy编写一个小型光线跟踪器。曲面建模为二维函数,给出高于法线平面的高度。我把求射线和曲面的交点的问题简化为求一个单变量函数的根。这些函数是连续的和连续可微的

有没有比使用scipy根查找器(可能使用多个进程)在所有函数上循环更有效的方法


编辑:这些函数是表示光线的线性函数和曲面函数之间的差异,约束在相交平面上。

以下示例显示了使用对分法并行计算100万个函数x**(a+1)-b(所有函数都具有不同的a和b)的根。这里大约需要12秒

import numpy

def F(x, a, b):
    return numpy.power(x, a+1.0) - b

N = 1000000

a = numpy.random.rand(N)
b = numpy.random.rand(N)

x0 = numpy.zeros(N)
x1 = numpy.ones(N) * 1000.0

max_step = 100
for step in range(max_step):
    x_mid = (x0 + x1)/2.0
    F0 = F(x0, a, b)
    F1 = F(x1, a, b)
    F_mid = F(x_mid, a, b)
    x0 = numpy.where( numpy.sign(F_mid) == numpy.sign(F0), x_mid, x0 )
    x1 = numpy.where( numpy.sign(F_mid) == numpy.sign(F1), x_mid, x1 )
    error_max = numpy.amax(numpy.abs(x1 - x0))
    print "step=%d error max=%f" % (step, error_max)
    if error_max < 1e-6: break
为了进行比较,使用scipy.bisect()一次查找一个根需要约94秒:

for i in range(N):
    x_root = scipy.optimize.bisect(lambda x: F(x, a[i], b[i]), x0[i], x1[i], xtol=1e-6)

功能是什么?它可能有解析解吗?曲面函数可以任意选择,我希望它是灵活的。对于特定函数(即切比雪夫多项式的叠加),存在解析解,但它可能涉及许多参数。对于特定的曲面,通过求解线性方程组来寻找交点应该是可能的。有标准的方法来寻找光线/平面、光线/球体、光线/三角形交点。可以将曲面建模为三角形网格吗?如果没有一个解析解或者曲面函数的几何近似,我不知道还有比通过函数更有效的方法。我想离散函数,但曲面正在不断优化和变化——我希望有一个三角形剖分,将整个区域平均分割为面。我已经在做2D中的等距分区时有些困难了。我现在正在使用一个scipy根查找器。。。我有点目瞪口呆。我从来没有想到,该算法的泰勒实现可以比库更快地完成这项工作。这是一个数量级。我已经用numpy广播做了所有的向量代数。。。下一次我使用文档化算法的库实现时,一定会想到这一点!
for i in range(N):
    x_root = scipy.optimize.bisect(lambda x: F(x, a[i], b[i]), x0[i], x1[i], xtol=1e-6)