问题描述
我正在尝试实现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