1. Основы языка программирования Julia#

Julia: come for the syntax, stay for the speed

Nature

Почему Julia?

Язык Julia создавался как решение two-languages problem в научной и вычислительной среде [BEKS17]. На одних языках просто писать программы, но они медленно исполняются (например, на Python), с другой стороны, в языках с быстрым исполнением программ сложный синтаксис (например, C/C++, Fortran).

Так, язык Julia созданный в 2012 году, развивается с фокусом на математические вычисления при сохранении удобного синтаксиса. В языке богатая стандартная библиотека, которая легко расширяется под пользовательские структуры данных.

Кто уже пользуется?

Julia продолжает набирать популярность. Этот язык уже используется в физике, машинном обучении, финансовых моделях, биологии, медицине, геофизике… А в список пользователей входят: MIT, Princeton, NASA, CISCO, IBM, Adobe…[1]

Как изучить?

В данном разделе излагаются основные инструменты языка Julia, которые понадобятся в практикуме. Дополнительные материалы по изучению языка находятся в Приложении Язык Julia.

Демонстрация 1.1 (Синтаксис Julia)

Ниже показано решение уравнения \(\exp{x} + \log{x} - 2 = 0\) методом деления пополам. Можете оценить синтаксис Julia по этому короткому примеру.

function bisection(f, xl, xr; xtol=eps(), ftol=eps())
    @assert xl < xr

    yl, yr = f.((xl, xr))
    @assert sign(yl) != sign(yr)

    abs(yl) < ftol && return xl
    abs(yl) < ftol && return xr
    
    maxiter = ceil(Int, log2((xr-xl)/xtol))
    
    for i in 1:maxiter
        xmid = (xr + xl) / 2
        ymid = f(xmid)
        
        if sign(yr) == sign(ymid)
            xr, yr = xmid, ymid
        elseif sign(yl) == sign(ymid)
            xl, yl = xmid, ymid
        else
            return xmid
        end
        abs(ymid) < ftol && return xmid
    end
    return (xr + xl)/2
end
f(x) = exp(x) + log(x) - 2
xsol = bisection(f, 0.1, 2)
0.7993101693660329
using Plots
using LaTeXStrings

plot(f; label=L"\exp\ x + \log\ x - 2", xlim=(0, 1.5), ylim=(-6, 6), xlabel=L"x", ylabel=L"f(x)")
scatter!([xsol], [f(xsol)]; label="метод бисекции, корень $(round(xsol; digits=5))")