如何让Unitful在乘除运算时自动转换为偏好单位?
让Unitful.jl自动将乘除结果转为偏好单位
我刚开始用Unitful.jl做代码中的量纲分析和单位转换,加减运算完全符合我的需求——我从事原子领域工作,通常希望数据以原子单位呈现,但有时数据会带有埃(Å)、纳米或皮米等单位,Unitful能自动完成转换,还能避免科研里的经典错误之一:
ijb@LAPTOP-GUG8KQ9I:~$ julia -O3 _ _ _ _(_)_ | Documentation: https://docs.julialang.org (_) | (_) (_) | _ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help. | | | | | | |/ _` | | | | |_| | | | (_| | | Version 1.9.0 (2023-05-07) _/ |\__'_|_|_|\__'_| | Official https://julialang.org/ release |__/ | julia> using Revise, OhMyREPL, Debugger, Test, Pkg, Unitful, UnitfulAtomic julia> using Unitful.DefaultSymbols julia> Unitful.preferunits(u"bohr") julia> x=1.0u"bohr" 1.0 a₀ julia> y=1.0u"Å" 1.0 Å julia> x+y 2.88972612462577 a₀ julia> x-y -0.8897261246257702 a₀ julia> x+y*y ERROR: DimensionError: 1.0 a₀ and 1.0 Å^2 are not dimensionally compatible. Stacktrace: [1] +(x::Quantity{Float64, 𝐋, Unitful.FreeUnits{(a₀,), 𝐋, nothing}}, y::Quantity{Float64, 𝐋^2, Unitful.FreeUnits{(Å^2,), 𝐋^2, nothing}}) @ Unitful ~/.julia/packages/Unitful/eFar5/src/quantities.jl:137 [2] top-level scope @ REPL[39]:1
作为单位和量纲分析的爱好者,我觉得这功能非常好用……真希望我的主力编程语言Fortran也内置类似功能。
但乘除运算存在问题——Unitful本身没有错误,但返回结果的单位只是输入单位的乘积/商,而非对应量纲的偏好单位:
julia> x 1.0 a₀ julia> y 1.0 Å julia> upreferred(dimension(x*y)) a₀^2 julia> x*y 1.0 Å a₀
除法的情况类似:
julia> x 1.0 a₀ julia> y 1.0 Å julia> upreferred(dimension(x/y)) julia> x/y 1.0 a₀ Å^-1
目前我可以手动转换:
julia> x 1.0 a₀ julia> y 1.0 Å julia> upreferred(dimension(x*y)) a₀^2 julia> auconvert(x*y) 1.8897261246257702 a₀^2 julia> uconvert(upreferred(dimension(x)*dimension(y)),x*y) # 更灵活的写法 1.8897261246257702 a₀^2 julia> uconvert(upreferred(dimension(x)/dimension(y)),x/y) # 除法也适用 0.529177210903
不过有没有办法让Unitful自动完成这个转换?我当然可以给用到的类型写对应的乘除方法,但难免会遗漏某些情况,反而又会遇到我想避免的经典错误;如果Unitful能自动处理就最好了。
内容的提问来源于stack exchange,提问作者Ian Bush
相关产品推荐
相关产品推荐

