如何使用Julia查找根(在一维情况下)
假设我有以下问题 让它更简单:如何使用Julia查找根(在一维情况下),julia,Julia,假设我有以下问题 让它更简单: n=3 z1=1;z2=2;z3=3 \tau=1 u是1D中的变量 目标:求解f(u)=0 注:假设我必须在函数中写入上述内容 以下是我的工作: 我的问题是: 看起来对吗 $u$是根,如果我不知道我的根的先验知识,我怎么能做“max()” 因为我使用fzero(),所以我必须首先估计根的位置;否则,我必须给出一个范围并使用fzero(f,a,b)。对吗 fzero要求一个单变量1D函数作为第一个参数,初始猜测作为第二个参数。定义f(u)并将其传递给fzero
以下是我的工作: 我的问题是:
fzero
要求一个单变量1D函数作为第一个参数,初始猜测作为第二个参数。定义f(u)
并将其传递给fzero
的方式不正确:定义常量函数f(u)=0
,然后用新的(递归)定义覆盖该定义。然后将值f(u)
而不是函数f
传递到fzero
您可能想要的是以下内容:
using Roots
function findroot(z, tau)
function f(u)
res = 0
for i = 1:3
res += max(abs(z[i]) - u, 0)
end
res -= tau
return res
end
fzero(f, 3)
end
首先,上面的代码定义了一个函数f
(闭包),它依赖于封闭环境中的z
和tau
(外部函数findroot
)。然后,函数f
和初始猜测被传递到fzero
我更喜欢在全局范围内定义函数,并将参数作为参数显式传递。较短的功能实现是:
f(u, z, tau) = sum(max(abs(zi) - u, 0) for zi in z) - tau
通过这种方式,可以调查其行为,例如,通过绘制不同参数的曲线图:
using Plots
plot(u->f(u, [0,1,2], 1), 0, 4)
语法args->body
定义了一个匿名函数。然后可以使用相同的语法定义findroot
:
findroot(z, tau) = fzero(u->f(u, z, tau), 0)