javascript - 一个简单的系列带来奇怪和意想不到的结果

标签 javascript math series

通过一个简单的 JS 代码,我计算了以下系列的总和:

Series

b 是一个常量,可以是任何值。 JS 代码尝试查找对于哪个最小值r(在本例中假设1000 次尝试),此不等式有效:

Series 2

如果r低于1.50000,结果就会变得愚蠢。

var pre = 0.0;
var r = 1.50010;
var b = 0.01;

for (var p = 0; p < 1000; p++) {
   var sum = 0;
   for (var i = 0; i <= 33; i++) {
      sum += Math.pow(r, i);
   }

   sum *= b;

   if ((2 * b * Math.pow(r, 34)) > sum) {
      pre = r;
      r -= 0.00001;
      r = parseFloat(r.toFixed(5));
   } else {
      console.log(pre);
      console.log(((2 * b * Math.pow(r + 0.00001, 34)) - sum).toFixed(8));
      break;
   }
}

代码在 pre == 1.5 处中断,如果我强制 r = 1.49999console.log(pre) 返回0。为什么?

最佳答案

当 r = 1.5 时,代码停止,因为这是您的不等式有效的最小值(无论如何,在您使用的精度范围内)。如果您以低于该值的值开始 r ,它将在第一次循环时中断,因为 if 语句永远不会为 true,因此您永远不会将 pre 设置为 r。

下面的图表显示了不等式两侧在 r = 1.5 附近发生的情况:Plot of 2 * r^34 and sum of r^i from i = 0 to 33

上图的代码:

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(1.4, 1.6, 100)
plt.plot(x , 2 * x ** 34, label = '$2r^{34}$')
plt.plot(x , sum([x ** i for i in xrange(34)]), label = '$\sum_{i = 0}^{33}\/ r^i$')
plt.yscale('log')
plt.legend()
plt.show()

此外,如果 b 为正数,则无需在代码中对 b 执行任何操作,因为您将不等式两边都乘以 b。如果 b 为负数,则需要反转不等式。

哦,还有一件事:对于这种类型的算法,您可能需要考虑更像 bisection method 的东西。 ,每次迭代都会将搜索空间减半。您可以使用 1 和 2 作为端点,因为 1 绝对太低,2 绝对太高。当不等式两边的差值低于某个阈值时,你就会停止。

关于javascript - 一个简单的系列带来奇怪和意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31614752/

相关文章:

Python Pandas 遍历行并访问列名

python - 查找多个数据框列之间的公共(public)元素

python - groupby 不适用于 Pandas.Series

javascript - 如何映射输入文件数组?

javascript - 在 JavaScript 中你怎么称呼这种东西?

javascript - React Native Listview 留下空间

math - 为什么参数为 `atan2` “backwards” ?

javascript - 如何将响应分配给 Angular 4中的变量?

c++ - 求最小值

css - 将 CSS transition-timing-function 转换为滑动