【问题标题】:How to optimize a algorithm that uses loops to find a stable value for a variable如何优化使用循环为变量找到稳定值的算法
【发布时间】:2019-08-05 20:11:23
【问题描述】:

我有一种情况,即在每次循环迭代时计算一个变量(在这种情况下为a),并在两次迭代之间的值增量足够小的地方停止。

我想知道在这种情况下找到该变量值的一般方法,而不必使用循环进行“收敛”工作。

我想知道解决方案是否是将所有内容放入方程式中,或者是否存在一些工具来解决这个问题。

a = 10
b = 10

diff = 1

while diff > .1:
    old_a = a
    a += b
    diff = 1 - (old_a/a)
    print(diff)

当前代码产生:

0.5
0.33333333333333337
0.25
0.19999999999999996
0.16666666666666663
0.1428571428571429
0.125
0.11111111111111116
0.09999999999999998

因此,需要 9 次迭代才能找到两次迭代之间a 值的相对差异小于 10%。

【问题讨论】:

  • 你可以试试动量算法
  • 您是特别询问您的代码,还是您的意思是更笼统的问题?
  • 抱歉,不清楚:更笼统。

标签: python loops optimization convergence


【解决方案1】:

你有

a_n = a_0 + n * b

并尝试找到在哪里

1 - (a_(n-1) / a_n) 
= 1 - (a_0 + (n--1)*b) / ( a_0 + n * b) 
= 1 - (a_0 + n*b -b) / (a_0 + n*b) 
= 1 - 1 + b / (a_0 + n*b)
= b / (a_0 + n * b)
< 0.1

就是这样

(a_0 / b) + n * b / b
= (a_0 / b) + n
> 10

(因为 0.1 = 1 / 10 和 1/x > 1/y y > x 如果 x,y != 0)

由于您在 cmets 中提到您的实际问题更复杂:如果找到像上面这样的封闭形式解决方案不可行,请查看 this wikipedia page about fixed point iteration,这正是您尝试解决的问题。

【讨论】:

  • 我明白了。谢谢。我将尝试该选项并将其调整为我的实际代码(这比这要复杂一些,因为我有几个未知数和它们之间的多重关系)。
  • @RomainSacchi 如果您找不到像我为您的示例展示的那样简单的封闭式解决方案,您可能想查看en.wikipedia.org/wiki/Fixed-point_iteration 以获得更通用的方法。实际上已经做了很多工作来解决这些问题。
猜你喜欢
  • 2021-02-28
  • 1970-01-01
  • 2012-02-09
  • 2018-07-12
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 2021-03-16
相关资源
最近更新 更多