自学内容网 自学内容网

【2024 Optimal Control 16-745】【Lecture 2】Ubuntu22.04 安装Julia

找不到Julia 内核

在这里插入图片描述

下载Julia

curl -fsSL https://install.julialang.org | sh

官网下载:Julia
在这里插入图片描述

安装 IJulia

打开 Julia REPL(在终端中输入 julia)并执行以下命令安装 IJulia:

using Pkg
Pkg.add("IJulia")

这将为 Jupyter Notebook 安装 Julia 内核。
关闭并重新启动 Jupyter Notebook,检查是否可以选择 Julia 内核。
在这里插入图片描述

提示 PyPlot 包、ForwardDiff包未安装

在这里插入图片描述
在这里插入图片描述

  1. 安装 PyPlot
    • 在 Julia 的 REPL 环境(在终端中输入 julia)中,运行以下命令:
      using Pkg
      Pkg.add("PyPlot")
      
    • 此命令会安装 PyPlot 包及其依赖项。

在这里插入图片描述
同理,安装ForwardDiff

     using Pkg
     Pkg.add("ForwardDiff")

θ和它的导数符号是通过 Julia 中的变量命名方式实现的

  1. 变量 θ 的输入

    • 在 Julia 中,θ 是一个合法的变量名,就像普通的字母 xy 一样。
    • 要输入 θ,可以使用以下方法:
      • 在 Jupyter Notebook 或 Julia REPL 中直接键入 \theta,然后按 Tab 键,Julia 会自动将其转化为 θ
      • 这是 Julia 支持的 Unicode 字符的一部分,可以直接作为变量名。
  2. 变量 θ̇ 的输入

    • θ̇ 是带点的变量(表示导数),它也是 Julia 的一个合法变量名。
    • 键入 \theta,后按 Tab 键,键入 \dot,后按 Tab
  3. 变量 θ̈ 的输入

    • θ̈ 是加速度(带两个点的变量名)。
    • 键入 \theta,后按 Tab 键,键入 \ddot,后按 Tab
  • θθ̇ 是 Julia 中的 Unicode 变量名,可以通过快捷输入实现。
  • 在代码中,这些符号只是普通变量名,它们的含义通过上下文和赋值来表达:
    • θ 是角度。
    • θ̇ 是角速度。
    • θ̈ 是角加速度,计算公式是 − ( g / l ) sin ⁡ ( θ ) -(g/l) \sin(θ) (g/l)sin(θ)
      在这里插入图片描述

. 使得操作符能够逐个元素地应用于整个数组或集合,而不需要显式地使用循环

在 Julia 中,等号前面的 . 是一个 广播(broadcasting) 操作符,它的作用是让一个操作应用于整个数组或容器,而不仅仅是单一的元素。这是 Julia 中非常常见和强大的特性。

x_hist[:,1] .= x0
  • x_hist[:,1]:这是对 x_hist 数组的访问,表示提取 x_hist 的第一列(所有行,第一列)。
  • .=:这是广播赋值操作符。它表示对 x_hist[:,1] 的每个元素执行赋值操作,等价于逐元素地把 x0 的每个值赋给 x_hist[:,1] 的每个元素。
  • x0:这是一个向量,通常是初始状态向量,比如 [0.1; 0],表示摆的初始角度和角速度。

示例

假设 x0[0.1, 0],而 x_hist[:,1] 是一个长度为 2 的列向量(例如 [0, 0]),那么:

  • 无广播(普通赋值)
    如果直接使用 =(没有点操作符),会发生维度不匹配的错误,因为你不能将一个列向量直接赋值给数组的某一列。

    x_hist[:,1] = x0  # 这会报错
    
  • 使用广播赋值
    使用 .= 后,x0 的每个元素都会依次赋值给 x_hist[:,1] 的每个元素:

    x_hist[:,1] .= x0  # 正确:x0 的每个元素逐个赋值给 x_hist[:,1]
    

总结

  • . 操作符使得赋值操作可以应用到整个数组或容器的每个元素,而不仅仅是简单的元素赋值。
  • .= 用于广播赋值,使得多个值可以逐元素地赋给目标数组或集合。

这种广播机制使得在 Julia 中处理数组和矩阵时更加简洁高效。


Julia 语言概述

Julia 是一种高性能的动态编程语言,特别适用于数值计算、科学计算、数据分析、机器学习和其他技术领域。它于2012年首次发布,具有简洁、易学的语法,并结合了与 C 语言、Fortran 和 Python 等语言相似的高效性。Julia 的设计理念是 高性能易用性 的平衡,旨在突破传统编程语言的限制。


Julia 语言的主要特点

1. 高性能
  • 编译型语言:Julia 是编译型语言,使用 LLVM 编译器生成高效的机器代码,能在运行时达到接近 C 语言的性能。这使得 Julia 在数值计算方面非常快速。
  • 即刻编译:Julia 使用 JIT(即时编译)机制,在执行时即时编译代码,这意味着开发者可以享受类似 Python 的动态特性,同时保持高效性能。
2. 简洁易用的语法
  • Julia 的语法简洁直观,类似于数学公式,非常适合用于科学计算。它支持多种编程范式,包括面向对象编程(OOP)、函数式编程和元编程。
  • 示例代码:
    function factorial(n)
        if n == 0
            return 1
        else
            return n * factorial(n-1)
        end
    end
    println(factorial(5))  # 输出 120
    
3. 动态类型
  • Julia 是动态类型语言,这意味着变量在定义时不需要指定类型,运行时可以根据实际值进行类型推断。尽管如此,Julia 也允许通过显式类型注释来增强代码可读性和优化性能。
4. 多重派发(Multiple Dispatch)
  • 多重派发是 Julia 最强大的特性之一。它允许函数根据不同的参数类型进行定义和选择。这使得 Julia 可以通过组合不同的函数来处理各种类型的计算。
  • 例如,+ 运算符可以被重载以处理不同类型的参数。
function add(a::Int, b::Int)
    return a + b
end

function add(a::Float64, b::Float64)
    return a + b
end

println(add(3, 4))         # 整数相加,输出 7
println(add(3.5, 4.5))     # 浮点数相加,输出 8.0
5. 并行和分布式计算
  • Julia 原生支持并行计算和分布式计算,提供了多线程、分布式计算以及 GPU 加速等功能,能够高效处理大规模计算任务。
  • 例如,通过 @distributed 宏可以轻松实现并行计算:
    @everywhere function f(x)
        return x^2
    end
    results = @distributed for i in 1:1000
        f(i)
    end
    
6. 易于集成
  • 与 C、Fortran、Python 等语言的集成:Julia 允许无缝地调用其他语言的库(如 C、Fortran、Python 等),使得现有的代码库可以轻松融入 Julia 中。通过 PyCallCxx 库,用户可以直接调用 Python 和 C++ 的函数。
  • C API:Julia 提供了与 C 语言交互的接口,使得开发者能够集成现有的 C 库。
7. 库和包管理
  • Julia 提供了非常强大的包管理系统,用户可以通过 Pkg 模块轻松安装、管理和使用各种第三方库。
  • Julia 拥有丰富的库生态系统,涵盖了科学计算、机器学习、数据分析、优化等多个领域。例如:
    • DataFrames.jl 用于数据分析。
    • Flux.jl 用于机器学习。
    • DifferentialEquations.jl 用于求解微分方程。
8. 元编程(Metaprogramming)
  • Julia 支持元编程,允许程序生成和修改其他程序。这使得编写自定义宏和灵活的代码变得非常方便。
  • 例如:
    macro say_hello()
        return :(println("Hello, world!"))
    end
    @say_hello  # 输出 "Hello, world!"
    
9. 支持 GPU 加速
  • Julia 提供了对 GPU 编程的支持,可以直接利用 GPU 加速进行并行计算。通过库如 CUDA.jl,用户可以在 Julia 中编写和运行 GPU 代码。

为什么选择 Julia?

1. 高性能要求

Julia 适合那些要求高性能计算的应用场景,尤其是在数值计算、数据科学、工程模拟等领域,能提供接近 C 语言的性能,同时保留 Python 和 Matlab 的易用性。

2. 科学计算和数值分析

Julia 具有强大的科学计算能力,广泛应用于机器学习、人工智能、金融建模、气候模拟等领域。

3. 数据分析和可视化

Julia 在数据分析领域也表现得非常强大,许多科学计算库(如 DataFrames.jlPlots.jl)使得数据分析和可视化变得非常方便。

4. 快速原型开发和生产部署

Julia 的高性能使得它非常适合用于快速开发原型并最终部署到生产环境。你可以在编写代码时享受 Python 和 Matlab 的灵活性,而在需要高效性能时仍能得到 C/C++ 的速度。


总结

Julia 作为一种现代化的编程语言,结合了高性能和易用性的特点,特别适用于科学计算和数值分析。它的 多重派发机制、即时编译、动态类型并行计算 特性,使其在处理大量数据和计算密集型任务时非常高效,同时其简洁的语法和强大的库生态系统,也使得开发者能够高效地进行原型设计和开发。

Julia 的社区正在不断发展,越来越多的应用和包支持使得它在科研和工程领域的使用越来越广泛。如果您的工作需要高效的数值计算和灵活的开发体验,Julia 可能是一个非常值得考虑的选择。


原文地址:https://blog.csdn.net/qq_45762996/article/details/143924479

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!