负数的三次根号怎么算啊,直接输^(1/3)会出错
julia> (-27)^(1/3)
ERROR: DomainError with -27.0:
Exponentiation yielding a complex result requires a complex argument.
Replace x^y with (x+0im)^y, Complex(x)^y, or similar.
Stacktrace:
[1] throw_exp_domainerror(::Float64) at .\math.jl:35
[2] ^ at .\math.jl:782 [inlined]
[3] ^(::Int64, ::Float64) at .\promotion.jl:345
[4] top-level scope at none:0
报错也说的很明白了,你得输入复数
想要实数,貌似只能楼上那样。
按照报错改成复数,返回了一个复数根:
julia> Complex(-27)^(1/3)
1.5 + 2.598076211353316im
julia> (-27+0im)^(1/3)
1.5 + 2.598076211353316im
julia> (-27-0im)^(1/3)
1.5 + 2.598076211353316im
julia> (1.5 + 2.598076211353316im)^3
-27.0 + 0.0im
julia> (1.5 - 2.598076211353316im)^3
-27.0 + 0.0im
julia> (-3)^3
-27
cbrt(-27)
可以用, 相当于 \sqrt[3]{} , 但是,换成 (-81)^{\frac15} 就不行了, 因为好像没有 \sqrt[5]{} 对应的命令, 尝试使用
julia> (-243+0im)^(1/5)
2.4270509831248424 + 1.7633557568774194im
julia> ans^5
-243.00000000000006 + 1.4210854715202004e-14im
julia> (-3)^5
-243
发现得到的结果与预期的 -3+0im
实部相差很大,感觉还是有问题, 于是自己用 Newton-Raphson 法写了一个 rootn
函数, 相当于 \sqrt[n]{} ,
rootn(A,n)
相当于 \sqrt[n]{A}
function rootn(A::Real,n::Integer=2,x0::Float64=1.0;eps::Float64=1e-10,maxiter::Integer=1000)
# x0: 初始点, eps: 精度要求; maxiter: 最大迭代次数
dist=1.0
rounds::Integer=1
g(x0)=x0-(x0^n-A)/(n*x0^(n-1))
x=g(x0)
while dist> eps
y=g(x)
x=g(y)
dist=abs(x-y)
rounds+=2
if rounds>maxiter
println("maxiter achieved.")
break
end
end
x
end
julia> rootn(-243,5,5.0)
-3.0
julia> rootn(-27,3)
-3.0
julia> abs(complex(-27)^(1/3))
3.0