我终于得到了从曲线到运行点的距离的公式:
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范围内的某些内容。
答案 0 :(得分:0)
对于这类问题,了解Newton's method:
通常很有用当然,论坛是
当然,除了对某些功能这个相当不稳定的事实(我不认为你的情况),纯粹为你的情况实现,这意味着你需要计算另一个衍生物(你的衍生物) )!但是,我认为对于您的情况,您可能只能近似导数。
你没有提到你的实现最终会使用的语言,所以我只是为了方便而使用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 也只假设我们需要搜索的单个解决方案。