gpt4 book ai didi

php - 如何克服当前跳过循环内某个实数的数值算法的离散性?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:43:40 29 4
gpt4 key购买 nike

我有一个相当复杂的算法来执行搜索,其中我使用某个范围 [0.25 到 1.75] 中的 $search 变量。

根据该算法,当 $search 恰好为 1 时,会发生一件“有趣”的事情,因为它命中了一个变量配置,有时(但不是总是)最有利的。一些代码依赖于 $search 恰好为 1 来产生最有利的结果。

更具体地说,搜索范围内通常有一些特定值,这会产生最有利的结果,但我的算法布局方式通常会跳过该特定值。在这里,我举例说明了特定值(基于其他输入和配置)恰好是 1..

问题

从数学上讲,如果 $search 是连续的而不是离散的,我就不会有这个问题。我的问题是尝试使用离散数学收敛于最有利的变量配置。这里的问题是算法。需要注意的次要问题是浮点运算,但我认为这还不是这里的问题。

基本循环:

$maxPowerOut = 0 ; 
for ($increment = 0; $increment <= 500; $increment ++)
{
//vars computed elsewhere, i.e:
//MIN = 0.24651533;
//STEP = 0.00196969
$search = MIN + STEP * $increment;

//compute several coefficients (returns an array)
$coeff = $this->coefficient($search);

//design is a complex library function
list($a, $b) = $this->design($coeff);

$powerOut = $a * $b;

//keep track of max power (and other params, not shown)
if ($powerOut > $maxPowerOut)
$maxPowerOut = $PowerOut;
}

//currently prints 899.993 instead of 900 as should be expected
print "Max Power is $maxPowerOut";

自然地,$search 几乎永远不会是 1。它是这样的:

  • 0.99569478115682
  • 0.99866447159913
  • 1.0016341620414
  • 1.0046038524837
  • 1.0075735429261
  • ...

请注意在上面的循环中如何跳过 1。为了争论起见,我们假设最有利的位置发生在 1.003000。该值 (1.003000) 也将被跳过。

问题

我该如何改进、重构、重新思考、重组、重写我的循环以避免此类问题?

最佳答案

一个简单的改进可能是使用迭代方法:

在您当前的循环中,您搜索区间 [0.25, 1.75] 中的 500 个值。假设您可以通过这种方式将最优值缩小到更小的区间 [0.995, 1.007]。然后再次将这个间隔分成 500 个值并重复你的循环。重复直到达到所需的精度。

从数学上讲,您想在函数 f:search -> power 的给定区间内找到最大值,该函数为给定的 search 计算一些 power 参数。请注意,您的函数 f 越平滑,这通常越容易。要了解 f 可能是什么样子,您可以根据您在循环中计算的值绘制函数。

如果您的函数表现良好并且是单峰的(只有一个“驼峰”),那么例如一个简单的 golden section search会很有效。

关于php - 如何克服当前跳过循环内某个实数的数值算法的离散性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32335604/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com