同时找到多个函数值的 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 中需要更多的编码工作,但可能会有一些交叉,它确实会产生更适合的采样。
问题
给定一个函数 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 中需要更多的编码工作,但可能会有一些交叉,它确实会产生更适合的采样。