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.)