Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从根获取相反的偏移点_Javascript_Math_Numerical Methods - Fatal编程技术网

Javascript 从根获取相反的偏移点

Javascript 从根获取相反的偏移点,javascript,math,numerical-methods,Javascript,Math,Numerical Methods,对于根查找算法,通常只给出根位置的x值。我想得到根两边最近的两个点,这两个点有相反的符号,考虑到根的存在(y值从+到-或相反) 给定一个x值,它是一个区间内根的近似结果,找到离根最近的两个y值相反的点的最有效方法是什么 目前,我的方法是不断加宽两侧根部位置的偏移,直到这两个点的y值相反 此外,使用用于查找根的精度(如1e-6)可能有助于确定需要多少偏移量才能通过符号变化的实际根 这张照片正是我想要的。蓝色是我想要的两个点,它们位于近似根(紫色)的两侧。当然,它们越接近越好(不需要使用更多的迭代

对于根查找算法,通常只给出根位置的x值。我想得到根两边最近的两个点,这两个点有相反的符号,考虑到根的存在(y值从+到-或相反)

给定一个x值,它是一个区间内根的近似结果,找到离根最近的两个y值相反的点的最有效方法是什么

目前,我的方法是不断加宽两侧根部位置的偏移,直到这两个点的y值相反

此外,使用用于查找根的精度(如1e-6)可能有助于确定需要多少偏移量才能通过符号变化的实际根

这张照片正是我想要的。蓝色是我想要的两个点,它们位于近似根(紫色)的两侧。当然,它们越接近越好(不需要使用更多的迭代来获得更精确的根,而是只使用给定的根-我们可以假设它足够接近)

我知道一些算法,比如二分法,给出了最后一个最近的括号,可以用作这些点,除非第一次迭代在中点找到根,并且括号仍然相距很远。当我使用ridders(regula-falsi)方法时,它有一个偏差,所以一个括号通常不会移动

代码

let x = 3.135, y = fn(x); /* x = approximate result of root, actual root is pi */
let xmin = 3.1, xmax = 3.2;
let offset = (xmax - xmin) * .0000000002;

function getOffsetPoints(x, y, offset, fn) {

        /* if root exactly 0 */
        /* offset either side by 1e-15 = .000000000000001! */
        if (y === 0) {
            return [
                [x - 1e-15, fn(x - 1e-15)],
                [x + 1e-15, fn(x + 1e-15)]
            ]
        }

        let dxLeft = x - offset,
            dyLeft = fn(dxLeft),
            dxRight = x + offset,
            dyRight = fn(dxRight);

        /* maybe 3 attempts is enough - don't want to over do it with computations */
        let i = 0;
        while (i <= 3 && Math.sign(dyLeft) * Math.sign(dyRight) !== -1) {
            offset *= 100;
            dxLeft = x - offset;
            dyLeft = fn(dxLeft);
            dxRight = x + offset;
            dyRight = fn(dxRight)
            i++;
        }

        /* return two points at either side of root */
        return [
            [dxLeft, dyLeft],
            [dxRight, dyRight]
        ]
}

function fn(x) {
    return Math.tan(x);
}
设x=3.135,y=fn(x);/*x=根的近似结果,实际根为pi*/
设xmin=3.1,xmax=3.2;
设偏移量=(xmax-xmin)*.0000000002;
函数getOffsetPoints(x、y、offset、fn){
/*如果根正好为0*/
/*将任意一侧偏移1e-15=.00000000000000 1*/
如果(y==0){
返回[
[x-1e-15,fn(x-1e-15)],
[x+1e-15,fn(x+1e-15)]
]
}
设dxleet=x-偏移,
dyLeft=fn(dxLeft),
dxRight=x+偏移量,
dyRight=fn(dxRight);
/*也许三次尝试就足够了-不要在计算上做得太多*/
设i=0;

而(i我假定您指的是数字的浮点表示(因为对于连续函数,“最近的”点不存在)

请注意,非常接近根的函数求值会失去任何可靠性,甚至可能不是单调的,并且附近可能有几个符号的变化,使得“根”不是唯一的。除了二分法之外,任何常用方法都不能保证接近符号的变化

无论如何,如果您想要不同符号的最近点(精确零的概率非常低),您可以通过增加/减少浮点尾数的低阶位在任意一侧进行探索,并对函数求值。最好是在FP表示上映射一个整数


导致指数变化的值需要特殊处理(尽管对于第一次实验,您可能会忽略它们)。

我假定您指的是数字的浮点表示(因为对于连续函数,“最近的”点不存在)

请注意,非常接近根的函数求值会失去任何可靠性,甚至可能不是单调的,并且附近可能有几个符号的变化,使得“根”不是唯一的。除了二分法之外,任何常用方法都不能保证接近符号的变化

无论如何,如果您想要不同符号的最近点(精确零的概率非常低),您可以通过增加/减少浮点尾数的低阶位在任意一侧进行探索,并对函数求值。最好是在FP表示上映射一个整数


导致指数变化的值需要特殊处理(尽管对于第一次实验,您可能会忽略它们).

这实际上是一个非常微妙的问题。在不深入讨论浮点数的更多细节的情况下,我认为一个简单有效的方法是使用任何你想要得到近似根的方法,然后在这个方法周围做一个小的间隔并应用二分法。请注意,不能保证初始近似根是在最后一小段时间内!祝你好运,玩得开心。@RobertDodier谢谢你的建议。我想这种方法对这类问题最有意义!这实际上是一个非常微妙的问题。在不详细介绍浮点数的情况下,我认为一种简单有效的方法是使用你想要的任何方法若要获得近似根,请围绕该根做一个小间隔并应用二分法。请注意,不能保证初始近似根在最后一个小间隔内!祝您好运,玩得开心。@RobertDodier感谢您的建议。我想这种方法对于此类问题最有意义!