Julia에서 부담없이 상미분 방정식을 풀었습니다.
1. 배경
이전에 Euler법을 이용하여 1층 상미분 방정식을 풀었다. (기사는 여기)
Julia는 모든 종류의 미분 방정식을 풀 수 있습니다. (공식 doc.는 여기)
이 기사에서는 1층 상미분 방정식을 ODEProblem
를 사용하여 간단히 풀어 보자.
2. 준비
다음 절차를 따르십시오.
2.1 패키지 도입
ODEProblem
를 사용하려면 DifferentialEquations
패키지를 추가해야합니다.
다음과 같이 Terminal에서 실행하자.
Terminal$ julia
_
_ _ _(_)_ | Documentation: https://docs.julialang.org
(_) | (_) (_) |
_ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 1.2.0 (2019-08-20)
_/ |\__'_|_|_|\__'_| | Official https://julialang.org/ release
|__/ |
julia> import Pkg
julia> Pkg.add("DifferentialEquations")
Updating registry at `~/.julia/registries/General`
Updating git-repo `https://github.com/JuliaRegistries/General.git`
Resolving package versions...
Installed Parameters ─────── v0.11.0
Installed Sundials ───────── v3.7.0
Installed StochasticDiffEq ─ v6.9.1
Installed OrdinaryDiffEq ─── v5.15.1
Updating `~/.julia/environments/v1.2/Project.toml`
[0c46a032] + DifferentialEquations v6.6.0
Updating `~/.julia/environments/v1.2/Manifest.toml`
[79e6a3ab] + Adapt v1.0.0
[ec485272] + ArnoldiMethod v0.0.4
[4fba245c] + ArrayInterface v1.2.1
[aae01518] + BandedMatrices v0.10.1
[9e28174c] + BinDeps v0.8.10
[8e7c35d0] + BlockArrays v0.9.1
[ffab5731] + BlockBandedMatrices v0.4.6
[764a87c0] + BoundaryValueDiffEq v2.3.0
[49dc2e85] + Calculus v0.5.0
[bbf7d656] + CommonSubexpressions v0.2.0
[bcd4f6db] + DelayDiffEq v5.14.0
[2b5f629d] + DiffEqBase v5.20.1
[459566f4] + DiffEqCallbacks v2.8.0
[01453d9d] + DiffEqDiffTools v1.3.0
[5a0ffddc] + DiffEqFinancial v2.1.0
[c894b116] + DiffEqJump v6.2.1
[77a26b50] + DiffEqNoiseProcess v3.3.1
[055956cb] + DiffEqPhysics v3.2.0
[163ba53b] + DiffResults v0.0.4
[b552c78f] + DiffRules v0.0.10
[0c46a032] + DifferentialEquations v6.6.0
[c619ae07] + DimensionalPlotRecipes v0.2.0
[ffbed154] + DocStringExtensions v0.8.0
[d4d017d3] + ExponentialUtilities v1.5.1
[1a297f60] + FillArrays v0.6.4
[f6369f11] + ForwardDiff v0.10.3
[069b7b12] + FunctionWrappers v1.0.0
[01680d73] + GenericSVD v0.2.1
[d25df0c9] + Inflate v0.1.1
[42fd0dbc] + IterativeSolvers v0.8.1
[82899510] + IteratorInterfaceExtensions v1.0.0
[5078a376] + LazyArrays v0.10.0
[093fc24a] + LightGraphs v1.3.0
[d3d80556] + LineSearches v7.0.1
[a3b82374] + MatrixFactorizations v0.1.0
[46d2c3a1] + MuladdMacro v0.2.1
[f9640e96] + MultiScaleArrays v1.5.0
[d41bc354] + NLSolversBase v7.4.1
[2774e3e8] + NLsolve v4.1.0
[1dea7af3] + OrdinaryDiffEq v5.15.1
[d96e819e] + Parameters v0.11.0
[e409e4f3] + PoissonRandom v0.4.0
[e6cf234a] + RandomNumbers v1.3.0
[731186ca] + RecursiveArrayTools v1.0.2
[f2c3362d] + RecursiveFactorization v0.1.0
[ae5879a3] + ResettableStacks v0.6.0
[f2b01f46] + Roots v0.8.3
[699a6c99] + SimpleTraits v0.9.0
[47a9eef4] + SparseDiffTools v0.9.0
[276daf66] + SpecialFunctions v0.7.2
[9672c7b4] + SteadyStateDiffEq v1.5.0
[789caeaf] + StochasticDiffEq v6.9.1
[c3572dad] + Sundials v3.7.0
[3783bdb8] + TableTraits v1.0.0
[19fa3120] + VertexSafeGraphs v0.1.0
[4607b0f0] + SuiteSparse
Building Sundials → `~/.julia/packages/Sundials/CRi5j/deps/build.log`
특히 문제 없으면 무사히 패키지를 추가할 수 있었던 것이다.
3. 코드 작성
이 예에서는
$$
y' = 3y + 2
$$
를 풀어 간다. 이하에 코드를 써 가지만, 공식 doc. 을 모방한 것이다.
흐름으로서는 수치해를 풀고 나서 엄밀해를 맞추어 plot한다.
ODE.jlusing DifferentialEquations
using Plots;gr()
#微分方程式を定義
f(y , t) = 3.0*y + 2
#初期値を設定
y0 = 1.0
#時間間隔を設定
tspan = (0.0 , 1.0)
#ODEProblemで解く
prob = ODEProblem(f , y0 , tspan)
sol = solve(prob)
#plotする
plot(sol,linewidth=5,title="Solution to the linear ODE with a thick line",
xaxis="Time (t)",yaxis="y(t) (in micro.m)",label="My Thick Line!")
#厳密解を用意する
g(t) = 5//3 * exp.(3*t) - 2//3
#加えてplotする
plot!(g , lw=3 , ls=:dash , label="True Solution!")
실행하면 오차 없이 멋진 그래프가 묘사되는 것을 알 수 있다.
4. 마지막으로
Euler법 등으로 기술하는 것보다 간단하게 미분 방정식을 풀 수 있었습니다.
Reference
이 문제에 관하여(Julia에서 부담없이 상미분 방정식을 풀었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/MizutoKadowaki0312/items/0a1f67441568424ccb64
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
다음 절차를 따르십시오.
2.1 패키지 도입
ODEProblem
를 사용하려면 DifferentialEquations
패키지를 추가해야합니다.다음과 같이 Terminal에서 실행하자.
Terminal
$ julia
_
_ _ _(_)_ | Documentation: https://docs.julialang.org
(_) | (_) (_) |
_ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 1.2.0 (2019-08-20)
_/ |\__'_|_|_|\__'_| | Official https://julialang.org/ release
|__/ |
julia> import Pkg
julia> Pkg.add("DifferentialEquations")
Updating registry at `~/.julia/registries/General`
Updating git-repo `https://github.com/JuliaRegistries/General.git`
Resolving package versions...
Installed Parameters ─────── v0.11.0
Installed Sundials ───────── v3.7.0
Installed StochasticDiffEq ─ v6.9.1
Installed OrdinaryDiffEq ─── v5.15.1
Updating `~/.julia/environments/v1.2/Project.toml`
[0c46a032] + DifferentialEquations v6.6.0
Updating `~/.julia/environments/v1.2/Manifest.toml`
[79e6a3ab] + Adapt v1.0.0
[ec485272] + ArnoldiMethod v0.0.4
[4fba245c] + ArrayInterface v1.2.1
[aae01518] + BandedMatrices v0.10.1
[9e28174c] + BinDeps v0.8.10
[8e7c35d0] + BlockArrays v0.9.1
[ffab5731] + BlockBandedMatrices v0.4.6
[764a87c0] + BoundaryValueDiffEq v2.3.0
[49dc2e85] + Calculus v0.5.0
[bbf7d656] + CommonSubexpressions v0.2.0
[bcd4f6db] + DelayDiffEq v5.14.0
[2b5f629d] + DiffEqBase v5.20.1
[459566f4] + DiffEqCallbacks v2.8.0
[01453d9d] + DiffEqDiffTools v1.3.0
[5a0ffddc] + DiffEqFinancial v2.1.0
[c894b116] + DiffEqJump v6.2.1
[77a26b50] + DiffEqNoiseProcess v3.3.1
[055956cb] + DiffEqPhysics v3.2.0
[163ba53b] + DiffResults v0.0.4
[b552c78f] + DiffRules v0.0.10
[0c46a032] + DifferentialEquations v6.6.0
[c619ae07] + DimensionalPlotRecipes v0.2.0
[ffbed154] + DocStringExtensions v0.8.0
[d4d017d3] + ExponentialUtilities v1.5.1
[1a297f60] + FillArrays v0.6.4
[f6369f11] + ForwardDiff v0.10.3
[069b7b12] + FunctionWrappers v1.0.0
[01680d73] + GenericSVD v0.2.1
[d25df0c9] + Inflate v0.1.1
[42fd0dbc] + IterativeSolvers v0.8.1
[82899510] + IteratorInterfaceExtensions v1.0.0
[5078a376] + LazyArrays v0.10.0
[093fc24a] + LightGraphs v1.3.0
[d3d80556] + LineSearches v7.0.1
[a3b82374] + MatrixFactorizations v0.1.0
[46d2c3a1] + MuladdMacro v0.2.1
[f9640e96] + MultiScaleArrays v1.5.0
[d41bc354] + NLSolversBase v7.4.1
[2774e3e8] + NLsolve v4.1.0
[1dea7af3] + OrdinaryDiffEq v5.15.1
[d96e819e] + Parameters v0.11.0
[e409e4f3] + PoissonRandom v0.4.0
[e6cf234a] + RandomNumbers v1.3.0
[731186ca] + RecursiveArrayTools v1.0.2
[f2c3362d] + RecursiveFactorization v0.1.0
[ae5879a3] + ResettableStacks v0.6.0
[f2b01f46] + Roots v0.8.3
[699a6c99] + SimpleTraits v0.9.0
[47a9eef4] + SparseDiffTools v0.9.0
[276daf66] + SpecialFunctions v0.7.2
[9672c7b4] + SteadyStateDiffEq v1.5.0
[789caeaf] + StochasticDiffEq v6.9.1
[c3572dad] + Sundials v3.7.0
[3783bdb8] + TableTraits v1.0.0
[19fa3120] + VertexSafeGraphs v0.1.0
[4607b0f0] + SuiteSparse
Building Sundials → `~/.julia/packages/Sundials/CRi5j/deps/build.log`
특히 문제 없으면 무사히 패키지를 추가할 수 있었던 것이다.
3. 코드 작성
이 예에서는
$$
y' = 3y + 2
$$
를 풀어 간다. 이하에 코드를 써 가지만, 공식 doc. 을 모방한 것이다.
흐름으로서는 수치해를 풀고 나서 엄밀해를 맞추어 plot한다.
ODE.jlusing DifferentialEquations
using Plots;gr()
#微分方程式を定義
f(y , t) = 3.0*y + 2
#初期値を設定
y0 = 1.0
#時間間隔を設定
tspan = (0.0 , 1.0)
#ODEProblemで解く
prob = ODEProblem(f , y0 , tspan)
sol = solve(prob)
#plotする
plot(sol,linewidth=5,title="Solution to the linear ODE with a thick line",
xaxis="Time (t)",yaxis="y(t) (in micro.m)",label="My Thick Line!")
#厳密解を用意する
g(t) = 5//3 * exp.(3*t) - 2//3
#加えてplotする
plot!(g , lw=3 , ls=:dash , label="True Solution!")
실행하면 오차 없이 멋진 그래프가 묘사되는 것을 알 수 있다.
4. 마지막으로
Euler법 등으로 기술하는 것보다 간단하게 미분 방정식을 풀 수 있었습니다.
Reference
이 문제에 관하여(Julia에서 부담없이 상미분 방정식을 풀었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/MizutoKadowaki0312/items/0a1f67441568424ccb64
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
using DifferentialEquations
using Plots;gr()
#微分方程式を定義
f(y , t) = 3.0*y + 2
#初期値を設定
y0 = 1.0
#時間間隔を設定
tspan = (0.0 , 1.0)
#ODEProblemで解く
prob = ODEProblem(f , y0 , tspan)
sol = solve(prob)
#plotする
plot(sol,linewidth=5,title="Solution to the linear ODE with a thick line",
xaxis="Time (t)",yaxis="y(t) (in micro.m)",label="My Thick Line!")
#厳密解を用意する
g(t) = 5//3 * exp.(3*t) - 2//3
#加えてplotする
plot!(g , lw=3 , ls=:dash , label="True Solution!")
Euler법 등으로 기술하는 것보다 간단하게 미분 방정식을 풀 수 있었습니다.
Reference
이 문제에 관하여(Julia에서 부담없이 상미분 방정식을 풀었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/MizutoKadowaki0312/items/0a1f67441568424ccb64텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)