迭代查找数字(来自指数函数)

时间:2013-01-27 00:28:41

标签: iteration

我终于得到了从曲线到运行点的距离的公式: approx = 2 * (b * (Math.Log(a) * (Math.Log(k) * Math.Pow(k, (b * cycleX))) * Math.Pow(a, (Math.Pow(k, (b * cycleX)))) * (Math.Pow(a, (Math.Pow(k, (b * cycleX))))) - points[i].Y) + cycleX - points[i].X);

因此,当approx接近0时,cycleX为我提供了正确的坐标,从中可以计算到该点的距离。

这里唯一的问题是定义修改cycleX的方法。我尝试使用一系列if,但有时approx最终跳到正数(来自底片)。我该怎么做才能正确修改cycleX的值?

注意:通常需要降至0.0001以获得-1到1范围内的某些内容。

1 个答案:

答案 0 :(得分:0)

对于这类问题,了解Newton's method

通常很有用

当然,论坛是

x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}. \,!

当然,除了对某些功能这个相当不稳定的事实(我不认为你的情况),纯粹为你的情况实现,这意味着你需要计算另一个衍生物(你的衍生物) )!但是,我认为对于您的情况,您可能只能近似导数。

你没有提到你的实现最终会使用的语言,所以我只是为了方便而使用javascript。

要估算您的衍生物,只需选择一个方便的deltaX。

所以,如果你有一个功能

var df = function (cycleX) {
  return 2 * (b * (Math.log(a) * (Math.log(k) * Math.pow(k, (b * cycleX))) * Math.pow(a, (Math.pow(k, (b * cycleX)))) * (Math.pow(a, (Math.pow(k, (b * cycleX))))) - Y) + cycleX - X);
};

您可以通过

估算它的衍生物
  y = df(cycleX);
  y1 = (df(cycleX + deltaX) - y) / deltaX;

然后继续进行。

  cycleXnew = cycleX - y / y1;

然后这只是一个循环问题,直到它收敛(或不收敛)。

参见示例jsFiddle:http://jsfiddle.net/jfcox/3wRtj/

编辑:我不保证它可以收敛的速度,甚至估计衍生物在牛顿方法方面的效果如何。对于我尝试给你的函数f(x) = a^(k^(bx))的参数,它看起来效果很好,但我没有尝试过多少。

编辑II。当然,上面的jsFiddle 只假设我们需要搜索的单个解决方案。