负数的三次根号怎么算啊?


#1

负数的三次根号怎么算啊,直接输^(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


#2

刚发过就找到解决方法了,cbrt(-27)

julia> cbrt(-27)
-3.0


#3

报错也说的很明白了,你得输入复数

想要实数,貌似只能楼上那样。
按照报错改成复数,返回了一个复数根:

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

#4

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

#5
julia> abs(complex(-27)^(1/3))
3.0