同时找到多个函数值的 x

Simultaneously find x for multiple function values

问题

给定一个函数 f 和一个感兴趣的值列表 [y1, y2, ..., yn],你如何找到列表 [x1, x2, ..., xn] 使得每个 [=16] f(xi)=yi =].

我知道有很多求根算法,我们可以使用其中任何一种来求 f-yi 的根,从而找到 xi。但是,至少对于 bisect 方法,如果我可以重用计算值,那么总时间应该会减少,尤其是如果计算 f 很耗时,对吧?


例子

例如,使用平分法,我​​想找到 [x1, x2] 使得 f([x1, x2])=[1, 5]。当找到 y1=1 时,这些值被评估

+------+-----+----+
| iter | x   | y  |
+------+-----+----+
| 1    | 8   | 14 |
+------+-----+----+
| 2    | 4   | 6  |
+------+-----+----+
| 3    | 2   | 2  |
+------+-----+----+
| 4    | 1   | 0  |
+------+-----+----+
| 5    | 1.5 | 1  |
+------+-----+----+

因此 x1=1.5。在求y2=5的时候,如果可以利用求值,求

+------+-----+---+
| iter | x   | y |
+------+-----+---+
| 1    | 3   | 4 |  <- because 2, 4 are evaluated
+------+-----+---+
| 2    | 3.5 | 5 |
+------+-----+---+

与不使用相比,迭代次数更少。


问题

你知道有什么算法可以利用这个,任何语言都可以吗?或者你能解释一下为什么没有吗?

您可以在给定范围内创建函数 table,xs=arange(xa,xb,h) 具有间隔和样本密度的一些合理值,通过 ys = f(xs) 计算函数 table 和然后使用反向插值得到求根方法的起点,xi0 = interp(yi,ys,xs)。对于二分法或任何其他括号法,可以从区间 [xi0-h, xi0+h].

开始

这是您可以对函数值的全局信息进行的最系统的使用。在根查找器中获得的值过于局部,无法对上述函数做出实质性改进 table.

但请继续尝试。从一个大的 h 开始并将计算值合并到 table 中需要更多的编码工作,但可能会有一些交叉,它确实会产生更适合的采样。