(初版:2020年3月、更新:2023年2月21日)
ストナー-ウォルファース模型(Stoner–Wohlfarth model ) は、単磁区の強磁性体の磁化について広く用いられているモデルである。
このモデルによる系のエネルギーは以下の式で与えられる。
右辺第一項は異方性エネルギー項で、第二項はゼーマン項である。
各パラメータは前述のリンクを参照。
無次元化した磁場とエネルギーをそれぞれ
と定義し、$\displaystyle{\sin^2 x = \frac{1}{2}(1 - \cos 2x)}$ を用いると、
となる。
$\phi$ を変数としたエネルギー極値は
から求められ、エネルギーの最小値は
を満たす。
試料に対して外部磁場方向を固定($\theta = const.$)した状態での、磁場 $h$ と磁場と磁化 $M$ の角度($= \phi$)の関係はエネルギーミニマムから求められる。
using Plots
using Plots.PlotMeasures
using Roots
ene(h,θ,φ) = 0.25(1-cosd(2*(φ-θ))) - h*cosd(φ) # ストナー-ウォルファース模型のエネルギー
∂ene∂φ(h,θ,φ) = 0.5*sind(2*(φ-θ)) + h*sind(φ) # φで一回微分
∂ene∂φ2(h,θ,φ) = cosd(2*(φ-θ)) + h*cosd(φ) # φで二回微分
∂ene∂φ2 (generic function with 1 method)
function main1(θcal)
hvec1 = range(-2.0, 2.0, length=20) # 無次元化した磁場
φvec1 = range(0.0, 360, length=20) # 磁場と磁化の角度
A = [ene(hcal,θcal,φcal) for hcal in hvec1, φcal in φvec1]
println("θ = ", θcal, " degree")
p1 = contour(φvec1, hvec1, A, color=:lajolla, fill=true, line=false, levs=100,
xlabel="Angle between H and M: φ (degree)", ylabel="normalized H: h")
p2 = wireframe(φvec1, hvec1, A, camera=(20,70))
return plot(p1, p2, layout=(2,1), bottom_margin = 15px, left_margin = [50px 15px 15px])
end
main1 (generic function with 1 method)
θcal1 = 0 # 磁場と容易軸の角度
θcal2 = 45 # 磁場と容易軸の角度
θcal3 = 90 # 磁場と容易軸の角度
plot(main1(θcal1), main1(θcal2), main1(θcal3), layout=(1,3), size=(1200,400))
θ = 0 degree θ = 45 degree θ = 90 degree
function eneminsearch(θcal, hcal)
f(φ) = 0.5*sind(2*(φ-θcal)) + hcal*sind(φ)
extremalφ = find_zeros(f, 0, 360) # エネルギー極値のφ。複数点あることもある。
eneminofφ = extremalφ[ ∂ene∂φ2.(hcal, θcal, extremalφ) .> 0] # エネルギーミニマムのφ
enemin = ene.(hcal, θcal, eneminofφ) # エネルギーミニマム
return eneminofφ, enemin
end
function φ_dep_ene(θcal)
println("θ = ", θcal, " degree")
hvec1 = [range(-2.0, 2.0, length=18); range(2.0, -2.0, length=18)] # 無次元化した磁場
φvec1 = range(0.0, 360.0, length=50)# 磁場と磁化の角度
anim = Animation()
for iii in eachindex(hvec1)
eneminofφ, enemin = eneminsearch(θcal, hvec1[iii])
enevec = ene.(hvec1[iii], θcal, φvec1)
plt = plot(φvec1, enevec, ylims=[-2, 3], label = "h = "*"$(round(hvec1[iii]*100)/100)",
legend=:topright, xlabel="Angle between H and M: φ (degree)", ylabel="normalized E",
size=(400,300))
plt = plot!(eneminofφ, enemin, line=false, marker=:circle, label ="Eergy minimum")
frame(anim, plt)
end
return gif(anim, "ene.gif", fps = 10)
end
φ_dep_ene (generic function with 1 method)
θcal = 0 # 磁場と容易軸の角度
φ_dep_ene(θcal)
θ = 0 degree
θcal = 45 # 磁場と容易軸の角度
φ_dep_ene(θcal)
θ = 45 degree
θcal = 90 # 磁場と容易軸の角度
φ_dep_ene(θcal)
θ = 90 degree
function hysteresiscalc(θcal, hvec1, φvec1)
ans = Float64[]
for iii in eachindex(hvec1)
eneminofφ, enemin = eneminsearch(θcal, hvec1[iii])
if length(eneminofφ) == 1
if length(ans) == 0
ans = [hvec1[iii] eneminofφ[1] eneminofφ[1]]
else
ans = vcat(ans, [hvec1[iii] eneminofφ[1] eneminofφ[1]])
end
elseif length(eneminofφ) >= 2
if length(ans) == 0
ans = [hvec1[iii] eneminofφ[1] eneminofφ[2]]
else
ans = vcat(ans, [hvec1[iii] eneminofφ[1] eneminofφ[2]])
end
end
end
return ans
end
function hysplot(calcdata)
plot(calcdata[:,1], [cosd.(calcdata[:,2]), cosd.(calcdata[:,3])],
line=2, size=(400,300), xlims=[-2.5, 2.5], ylims=[-1.5,1.5],
legend=:topleft, label=["H dec." "H inc."], xlabel="h", ylabel="M/Ms")
end
hysplot (generic function with 1 method)
hvec = range(-2.0, 2.0, length=180) # 無次元化した磁場
φvec = range(0.0, 360.0, length=180) # 磁場と磁化の角度
θcal1 = 0.0
θcal2 = 45.0
θcal3 = 90.0
calc1 = hysteresiscalc(θcal1, hvec, φvec)
calc2 = hysteresiscalc(θcal2, hvec, φvec)
calc3 = hysteresiscalc(θcal3, hvec, φvec)
p1 = hysplot(calc1)
p2 = hysplot(calc2)
p3 = hysplot(calc3)
plot(p1,p2,p3, layout=(1,3), size=(900,300), bottom_margin = 15px, left_margin = [15px 15px 15px])