Julia 科学计算语言

FreeGuideOnline 最新 2026-07-13

julia>


尝试输入 `1 + 2` 并回车,确认安装成功。

### 选择代码编辑器
推荐使用 [Visual Studio Code](https://code.visualstudio.com/) 并安装 Julia 扩展,它提供语法高亮、自动补全、调试和绘图支持。你也可以使用 Pluto.jl 创建反应式笔记本(类似 Jupyter),适合教学和探索。

## Julia 基础语法速览

### 变量与基本数据类型
Julia 是动态类型语言,变量直接赋值即可:

```julia
x = 10          # 整型
y = 3.14        # 浮点型
name = "Julia"  # 字符串
flag = true     # 布尔型

常用数值类型包括 Int64Float64。Julia 内置高精度计算,例如 BigIntBigFloat

big_int = BigInt(2)^100

算术运算与数学函数

与大多数语言类似:

2 + 3 * 4       # 14
2^3             # 8(幂运算)
sqrt(9)         # 3.0
sin(pi/2)       # 1.0

Julia 支持分数表示的有理数,使用 //

1//2 + 1//3     # 5//6

字符串操作

用双引号包围字符串,单引号用于字符:

s = "Hello, " * "world!"   # 用 * 连接字符串
s[1:5]                      # 切片:"Hello"
"Value is $(2+3)"           # 字符串插值:Value is 5

控制流

if-elseif-else 结构:

if x > 0
    println("正数")
elseif x < 0
    println("负数")
else
    println("零")
end

for 循环和 while 循环:

for i in 1:5
    println(i)
end

n = 0
while n < 3
    n += 1
    println(n)
end

注意:Julia 的索引从 1 开始,而不是 0。

数组(Array)与矩阵操作

科学计算的核心是数组。Julia 的数组内置高效的多维支持,语法简洁。

创建数组

v = [1, 2, 3, 4]            # 向量(一维数组)
M = [1 2; 3 4]              # 矩阵(; 分隔行)
zeros(2, 3)                 # 2×3 零矩阵
ones(3)                     # 3×3 全1矩阵
rand(2, 2)                  # 随机矩阵(均匀分布)
randn(3, 1)                 # 正态分布随机数
collect(1:2:10)             # 通过范围生成 [1,3,5,7,9]

访问与修改

v[1]            # 第一个元素
v[2:3]          # 切片 [2,3]
M[2,1]          # 第二行第一列
M[1, :]         # 第一整行
v[2] = 99      # 修改元素

基本运算

算术运算符自动进行逐元素运算(需加点 . 操作符用于广播):

v + v           # 逐元素相加
v .* 2          # 每个元素乘2,点表示广播
M * M           # 矩阵乘法
v' * v          # v的转置乘v,得到内积(1×1矩阵)

线性代数

Julia 的线性代数函数丰富,内置在 LinearAlgebra 标准库中:

using LinearAlgebra

A = [1 2; 3 4]
det(A)          # 行列式
inv(A)          # 逆矩阵
eigen(A)        # 特征值与特征向量
I = [1 0; 0 1]  # 单位矩阵
A \ [5, 11]     # 解线性方程组 Ax = b,结果 x ≈ [1.0, 2.0]

数组推导式(Comprehensions)

类似 Python 列表推导式,生成数组的简洁方法:

[i^2 for i in 1:5]                     # [1,4,9,16,25]
[(i,j) for i in 1:3, j in 1:2]         # 3×2 元组矩阵

函数定义与使用

基本函数定义

function add(a, b)
    return a + b
end
add(3, 5)   # 8

# 简洁写法
add_short(a, b) = a + b

函数支持多返回值:

function divide(a, b)
    q = a ÷ b    # 整数除法
    r = a % b    # 余数
    return q, r
end
quotient, remainder = divide(14, 4)

泛型函数与多重分派

Julia 的强大之处在于多重分派(Multiple Dispatch)。你可以为同一函数名定义多个方法,根据参数类型自动调用:

say_hello(name::String) = println("Hello, $name!")
say_hello(age::Int) = println("I am $age years old.")

say_hello("world")   # "Hello, world!"
say_hello(25)        # "I am 25 years old."

这种机制让代码更清晰,也是科学计算中设计抽象算法的基石。

匿名函数与高阶函数

map(x -> x^2, 1:5)          # [1,4,9,16,25]
filter(x -> x > 2, 1:5)     # [3,4,5]
reduce(+, 1:5)              # 求和,等价于 sum(1:5)

包管理与科学计算生态

包管理器

在 REPL 中按 ] 进入包管理模式。常用命令:

] add DataFrames       # 安装包
] add Plots CSV        # 一次性安装多个
] update               # 更新所有包
] st                   # 查看已安装包
] rm PackageName       # 删除包

推荐科学计算包

  • DataFrames:类似 pandas 的数据框操作。
  • CSV:读写 CSV 文件。
  • Plots:统一的绘图接口,支持多种后端。
  • DifferentialEquations:求解微分方程。
  • Flux / Lux:深度学习框架。
  • Optim:优化算法库。
  • Statistics:标准统计函数。

数据处理入门:DataFrames 与 CSV

加载数据并进行分析:

using DataFrames, CSV

# 从 CSV 文件读取(假设有 data.csv)
df = CSV.read("data.csv", DataFrame)

# 查看基本信息
first(df, 5)            # 前5行
describe(df)            # 描述统计

# 数据筛选与变换
filter(row -> row.age > 30, df)
select(df, :name, :age)
transform(df, :salary => ByRow(x -> x * 1.1) => :new_salary)

# 分组聚合
gdf = groupby(df, :city)
combine(gdf, :salary => mean)

若没有示例文件,可手动创建 DataFrames:

df = DataFrame(name=["Alice", "Bob", "Cathy"],
               age=[25, 30, 28],
               salary=[5000, 6000, 5500])

数据可视化:Plots 快速上手

安装并导入

] add Plots
using Plots

基本折线图与散点图

x = 1:10
y = x.^2              # 广播平方
plot(x, y, label="y = x^2", linewidth=2)
scatter!(x, y, label="points")  # 叠加散点
xlabel!("x")
ylabel!("y")
title!("抛物线")

组合图形

p1 = plot(x, y)
p2 = histogram(randn(1000), bins=30)
plot(p1, p2, layout=(1,2))

Plots 支持多种输出格式,如 PNG、SVG,使用 savefig("plot.png") 保存。

常见科学计算示例

数值积分

使用 QuadGK 包进行一维积分:

using QuadGK
f(x) = sin(x^2)
result, error = quadgk(f, 0, π)
println("积分结果 ≈ ", result)

求解常微分方程

经典洛伦兹系统:

using DifferentialEquations

function lorenz!(du, u, p, t)
    σ, ρ, β = p
    du[1] = σ * (u[2] - u[1])
    du[2] = u[1] *- u[3]) - u[2]
    du[3] = u[1] * u[2] - β * u[3]
end

u0 = [1.0, 0.0, 0.0]
tspan = (0.0, 100.0)
p = (10.0, 28.0, 8/3)
prob = ODEProblem(lorenz!, u0, tspan, p)
sol = solve(prob)
plot(sol, vars=(1,2,3))  # 3D 轨迹图(如果后端支持)