多根查找的放气方法

问题描述

我正在尝试实现deflation method来查找Julia上多项式的多个根。在放气方法中,根据实际函数除以x - x_roots[i]生成函数,并且必须找到新生成函数的根。但是g(x) = g(x) / (x - x_root)给了我一个堆栈溢出错误,因为它可能生成了无限的递归关系。如何在每个步骤中生成功能

function deflation(f::Function,order)
    roots=[]
    n=1
    g(x)=f(x)
    x_root=Muller_method(f,-5,5,1e-5,50)
    while n<=order
        x_root=Muller_method(a,50)
        g(x)=g(x)/(x-x_root)
        append!(roots,x_root)
        n=n+1
    end
return (roots)

解决方法

这样的事情会导致无限递归:

def softmax(x: np.ndarray) -> np.ndarray:
    e_x = np.exp(x - np.max(x,axis=-1)[...,None])
    e_y = e_x.sum(axis=-1)[...,None]
    return e_x / e_y

这是因为函数(或方法)定义不能像变量分配那样工作:julia> g(x) = x g (generic function with 1 method) julia> g(1) 1 julia> g(x) = g(x) / 2 g (generic function with 1 method) julia> g(1) ERROR: StackOverflowError: Stacktrace: [1] g(::Int64) at ./REPL[3]:1 (repeats 79984 times) 的每次重新定义都会覆盖前一个(请注意,上面的g(x)永远只有一个方法)。当方法定义引用自身时,即为递归,即在调用函数时引用其自己的版本。


对于放气方法,也许您可​​以定义一个新函数,该函数关闭当前找到的根的向量。请考虑以下示例,以了解其工作原理:

g