提问人:Ian Bush 提问时间:8/15/2023 最后编辑:Ian Bush 更新时间:8/15/2023 访问量:59
Unitful - 在乘法和除法下自动转换为首选单位
Unitful - Automatic conversion to preferred units under multiplication and division
问:
我刚刚开始使用 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> auconvert(x*y)^C
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) # More flexible
1.8897261246257702 a₀^2
julia> uconvert(upreferred(dimension(x)/dimension(y)),x/y) # Division works as well
0.529177210903
但是,有什么办法可以通过 Unitful 实现自动化吗?我当然可以为我所使用的类型的乘法和除法提供适当的方法,但毫无疑问,我会错过一个,所以重新审视我试图避免的“经典错误”;让 Unitful 自动完成它会好得多。
答: 暂无答案
上一个:F# 按位运算符和度量单位
下一个:如何将单位的价值转换为其他单位?
评论