Appearance
Julia 会话插件
在 Liii STEM 中,您也可以通过插入 Julia 会话 的方式运行想要的 Julia 代码。
0 配置与加载
使用 Julia 会话前,需要确保在本地计算机安装了 Julia,并根据需要安装常用的科研与绘图工具包。
0.1 环境配置与包管理
第一步:安装 Julia
| 操作系统 | 推荐安装方式 |
|---|---|
| Windows | 从 Julia 官网 下载标准安装包并默认安装。 |
| macOS | 推荐使用 Homebrew 命令行安装:brew install julia。 |
| Linux | 使用发行版内置包管理器(如 apt/pacman),或从官网下载预编译的二进制包。 |
安装完成后,在系统终端中运行以下命令验证:
julia --version若终端返回类似 julia version 1.12.6 的版本号,说明 Julia 已安装成功且其可执行文件已加入系统环境变量 PATH。
第二步:安装常用科研与绘图包
Julia 提供了极为好用的内置包管理器 Pkg。你可以直接在系统终端运行 julia 进入 REPL(交互式环境)进行安装,或者稍后在 Liii STEM 的 Julia 会话代码块中执行以下安装命令:
using Pkg
Pkg.add([
"Plots", "LaTeXStrings", "Symbolics", "Latexify",
"DataFrames", "CSV", "StatsBase",
"FFTW", "QuadGK", "ForwardDiff",
"DifferentialEquations", "Optim", "LsqFit", "Interpolations"
])温馨提示:首次导入(
using)某个包时,Julia 会自动进行后台预编译,因此第一次运行可能会稍有延迟;预编译完成后,后续加载速度将得到成倍提升。
常用科学计算包一览:
| 领域分类 | 推荐核心包 | 核心功能简介 |
|---|---|---|
| 基础代数 | LinearAlgebra(标准库) | 高阶矩阵运算、奇异值分解(SVD)及解线性方程组 |
| 数据科学 | DataFrames、CSV | 表格数据的高效处理、筛选、分组统计以及 CSV 读写 |
| 数理统计 | Statistics(标准库)、StatsBase | 均值、方差等基础指标计算与各种随机抽样方法 |
| 科学绘图 | Plots、LaTeXStrings | 二维与三维学术制图、图形导出以及 LaTeX 公式标注支持 |
| 微积分与信号 | QuadGK、ForwardDiff、FFTW | 高精度数值积分、自动微分(AD)以及快速傅里叶变换 |
| 方程与优化 | DifferentialEquations、Optim、LsqFit | 常微分/偏微分方程求解、非线性最优化与最小二乘拟合 |
0.2 会话创建与交互操作指南
进入会话
在 Liii STEM 模式工具栏中,点击 插入会话 → Julia 即可在文档正文中创建一个交互式的 Julia 代码块。
高效操作快捷键
Liii STEM 针对会话计算提供了高度优化的交互支持,以下是日常编写 Julia 代码的核心操作:
| 交互需求 | 触发方式与快捷键 | 功能说明 |
|---|---|---|
| 执行并渲染 | Enter | 运行当前会话内的代码并立即生成排版输出 |
| 换行不执行 | Shift + Enter | 在当前会话中插入新行以编写多行长程序 |
| 多行输入模式 | 焦点 → 输入选项 → 多行输入 | 切换多行编辑状态,此时按回车只会换行,便于输入函数和循环 |
| 命令自动补全 | Tab | 快速补全变量名、函数名以及加载的包名称 |
| 行内帮助检索 | 前缀 ? (如 ?cos) | 实时检索函数的使用手册、参数定义与用法示例 |
会话状态与增量复用
Liii STEM 的会话系统支持变量和状态的增量式传递:
- 在前文会话中定义过的变量、自定义函数或引入的第三方库,在后续任意会话中都可以无缝复用,无需重复声明或导入。
- 重要提示:如果重新打开文档,或者调整了前文的代码,请保证后续依赖相关变量的会话按照从上往下的顺序重新执行,以确保执行状态一致。
相关阅读:关于会话系统的完整机制(字段编辑、折叠、全部求值、执行状态等),请参阅 《Liii STEM 作为统一接口:支持 Python,AI 及多语言计算环境》。
1 Julia 基础指南
1.1 基础数值计算
Julia 具备极高的数值计算性能,可以直接作为高精度科学计算器使用:
1 + 2 * 3
sqrt(2)
sin(pi / 3)
z = 1 + 2im
abs(z)
r = 3 // 7
float(r)
setprecision(80) do
BigFloat(pi)
end核心语法与函数说明:
| 代码 | 含义 |
|---|---|
im | 虚数单位 |
// | 构造有理数 |
BigFloat | 高精度浮点数 |
setprecision | 临时设置浮点精度 |
1.2 向量、矩阵与广播运算
在 Julia 中,向量与矩阵的声明与书写方式非常贴近直观的数学表达式:
v = [1, 2, 3, 4]
A = [1 2; 3 4][37]
Julia 引入了优雅的广播机制(Broadcasting),在运算符或函数名后添加点号 . 即可实现逐元素(Element-wise)运算。这在对数组中的每个元素应用函数时非常高效:
x = range(0, 0.1 * pi, length=5)
y = sin.(x)0.00.078459095727844940.156434465040230870.23344536385590540.3090169943749474
在上述代码中,sin.(x) 会对向量 x 中的每一个元素分别计算正弦值。如果直接调用 sin(x),Julia 会尝试将整个向量作为一个整体对象传入,这通常会导致类型错误或不符合预期的矩阵函数运算。因此,在处理数组时,请务必注意点号 . 的使用。
2 符号计算
Liii STEM 完美支持 Julia 的符号计算输出。借助 Symbolics、Latexify 与 LaTeXStrings 等强大的符号计算与排版工具包,您可以在会话中直接生成排版精美、适合学术论文和教学文档展示的 LaTeX 数学表达式。
2.1 基础符号表达式
在符号计算中,我们首先需要定义符号变量,并构建代数表达式:
using Symbolics, Latexify, LaTeXStrings
@variables x y a b c
expr = (a + b)^2 / c + sin(x)^2 + cos(x)^2
simplify(expr)cc+(a+b)2
2.2 展开、化简与替换
符号表达式的展开与化简是代数推导的常用操作。此外,我们还可以使用 substitute 进行变量数值替换:
@variables x y
expr = (x + y)^3
expand(expr)x3+3 x2 y+3 y2 x+y3
expr2 = (x^2 - y^2) / (x - y)
simplify(expr2)x+y
进行变量数值替换:
substitute(x^2 + 2 * x + 1, Dict(x => 3))16
2.3 微分与方程表达
在符号计算中,求导与微分方程的构建同样非常直观。我们可以定义微分算子并对表达式求导:
@variables x
D = Differential(x)
expr = sin(x) * x^2
expand_derivatives(D(expr))2 x sin(x)+x2 cos(x)
计算二阶导数:
expand_derivatives(D(D(expr)))2 sin(x)+4 x cos(x)−x2 sin(x)
2.4 矩阵与 LaTeX 渲染
除了标量代数式,Symbolics 同样支持符号矩阵的运算与 LaTeX 格式化渲染:
@variables a b c d
M = [a b; c d]
latexify(M)[acbd]
直接渲染原生 LaTeX 字符串:
L"\int_{0}^{\infty} e^{-x^2}\,dx = \frac{\sqrt{\pi}}{2}"∫0∞e−x2dx=2π
这些功能非常适合在学术报告和正文中直观展示复杂的公式推导、矩阵形式、微分方程以及积分恒等式。
3 科学绘图
Julia 拥有极其丰富的可视化生态,其中 Plots.jl 是最常用的绘图框架。通过 Plots.jl,您可以在会话中直接生成二维曲线、散点图、误差棒、热图、等高线图以及三维曲面图等。所有绘图结果都会自动、无缝地嵌入到 Liii STEM 文档中,非常适合制作高质量的实验报告、学术论文和教学教程。
温馨提示:如果首次加载绘图包时速度较慢,这是因为 Julia 正在后台进行预编译,后续调用将会非常迅速。
3.1 基础函数图像
绘制一条标准的一维正弦波曲线:
using Plots
x = range(-2 * pi, 2 * pi, length=400)
y = sin.(x)
plot(x, y,
label="sin(x)",
xlabel="x",
ylabel="y",
title="Sine Wave",
linewidth=2)
3.2 多曲线对比
在同一张图表中绘制多条曲线进行对比,是学术制图的常见需求:
x = range(0, 10, length=500)
plot(x, exp.(-0.2 .* x) .* cos.(2 * pi .* x), label="γ = 0.2")
plot!(x, exp.(-0.5 .* x) .* cos.(2 * pi .* x), label="γ = 0.5")
plot!(xlabel="time", ylabel="amplitude", title="Damped Oscillation")
核心绘图命令与修饰符说明:
| 命令 | 作用 |
|---|---|
plot | 创建并绘制一张新图表 |
plot! | 在当前活动图表上追加绘制曲线或修改图表属性(带 ! 的方法会修改原图) |
scatter | 创建并绘制一张新散点图 |
scatter! | 在当前活动图表上追加绘制散点 |
3.3 散点图与误差棒
在实验数据可视化中,带误差棒的散点图是展示测量不确定度的标准方式:
using Random, Statistics, Plots
Random.seed!(1)
x = 1:8
y = [1.0, 1.4, 1.9, 2.5, 3.0, 3.3, 3.8, 4.1]
yerr = 0.15 .+ 0.05 .* rand(length(x))
scatter(x, y,
yerror=yerr,
label="measurement",
xlabel="sample index",
ylabel="response",
title="Measurement with Error Bars")
3.4 热图与等高线图
热图(Heatmap)非常适合展示二维参数扫描结果,例如频率—功率分布、空间物理场分布或相图:
using Plots
x = range(-3, 3, length=150)
y = range(-3, 3, length=150)
z = [sin(xi^2 + yi^2) / (1 + xi^2 + yi^2) for yi in y, xi in x]
heatmap(x, y, z,
xlabel="x",
ylabel="y",
title="2D Heatmap",
colorbar_title="intensity")
对应的等高线图(Contour Plot)绘制:
contour(x, y, z,
xlabel="x",
ylabel="y",
title="Contour Plot",
levels=20)
3.5 三维曲面图
利用 surface 命令可以非常直观地展示三维空间中的函数曲面:
using Plots
x = range(-2, 2, length=80)
y = range(-2, 2, length=80)
z = [exp(-(xi^2 + yi^2)) * cos(4 * xi) * sin(4 * yi) for yi in y, xi in x]
surface(x, y, z,
xlabel="x",
ylabel="y",
zlabel="z",
title="3D Surface")
3.6 频谱图示例
结合快速傅里叶变换包 FFTW 与 Plots,可以快速对信号进行频域分析并绘制频谱图:
using FFTW, Statistics, Plots
fs = 2000.0
t = 0:1/fs:1-1/fs
signal = sin.(2 * pi * 80 .* t) .+ 0.5 .* sin.(2 * pi * 240 .* t)
Y = fft(signal .- mean(signal))
n = length(signal)
freq = (0:n-1) .* fs / n
amp = abs.(Y) ./ n
idx = 1:div(n, 2)
plot(freq[idx], 2 .* amp[idx],
xlabel="Frequency (Hz)",
ylabel="Amplitude",
label="spectrum",
title="Single-sided FFT Spectrum",
xlim=(0, 500))
3.7 微分方程解的绘图
在科学计算中,我们经常需要将微分方程的数值解进行可视化。以下展示经典的 Lotka-Volterra(捕食者-猎物)模型的求解与绘图:
using DifferentialEquations, Plots
function lotka!(du, u, p, t)
α, β, δ, γ = p
du[1] = α*u[1] - β*u[1]*u[2]
du[2] = δ*u[1]*u[2] - γ*u[2]
end
u0 = [1.0, 1.0]
p = (1.5, 1.0, 1.0, 3.0)
prob = ODEProblem(lotka!, u0, (0.0, 10.0), p)
sol = solve(prob, saveat=0.02)
plot(sol.t, hcat(sol.u...)',
label=["prey" "predator"],
xlabel="time",
ylabel="population",
title="Lotka-Volterra Model")
绘制对应的相空间轨迹图(Phase Portrait):
U = hcat(sol.u...)
plot(U[1, :], U[2, :],
xlabel="prey",
ylabel="predator",
label="phase trajectory",
title="Phase Portrait")
3.8 保存图片
在会话中,您可以直接将绘制的图表保存为本地文件,以便在其他地方使用:
p = plot(1:10, rand(10), label="random")
savefig(p, "julia_plot.pdf")
savefig(p, "julia_plot.png")在学术出版和正式报告中,强烈推荐将图表保存为 pdf 或 svg 等无损矢量格式,以确保任意放大下的清晰度;若用于网页展示或快速分享,则推荐保存为 png 格式。
4 科学计算示例
本节将深入展示 Julia 在科研与工程计算中最核心的数值计算能力。以下所有示例均可直接复制到 Liii STEM 的 Julia 会话中运行并即时查看结果。
4.1 线性代数:方程组、特征值与奇异值分解
首先引入 Julia 内置的线性代数标准库:
using LinearAlgebra求解经典的线性方程组 Ax=b:
A = [3.0 1.0 -1.0;
2.0 4.0 1.0;
-1.0 2.0 5.0]
b = [4.0, 1.0, 1.0]
x = A \ b
residual = norm(A * x - b)计算矩阵的特征值与特征向量:
E = eigen(A)
E.values
E.vectors对矩阵进行奇异值分解(SVD):
U, S, V = svd(A)
S常用线性代数核心命令一览:
| 命令 | 作用 |
|---|---|
A \ b | 求解线性方程组 Ax=b |
det(A) | 行列式 |
inv(A) | 逆矩阵;数值计算中通常优先用 A \ b |
eigvals(A) | 特征值 |
eigen(A) | 特征值与特征向量 |
svd(A) | 奇异值分解 |
norm(v) | 向量或矩阵范数 |
4.2 统计计算与随机数模拟
Julia 提供了强大的随机数生成器与统计分析工具,非常适合进行蒙特卡洛模拟和数据描述性统计:
using Random, Statistics, StatsBase
Random.seed!(2026)
data = randn(1000) .+ 0.5
mean(data)
std(data)
median(data)
quantile(data, [0.25, 0.5, 0.75])−0.14974061723486430.55579045116978241.200019184175632
计算带权重的加权平均数:
weights = rand(1000)
weighted_mean = mean(data, Weights(weights))0.526465701364362
使用蒙特卡洛(Monte Carlo)方法估算圆周率 π 的值:
using Random, Statistics
Random.seed!(1)
N = 100_000
x = rand(N)
y = rand(N)
inside = (x .^ 2 .+ y .^ 2) .<= 1
π_est = 4 * mean(inside)3.14056
原理解析:在此示例中,
mean(inside)会自动将布尔数组中的true和false隐式转换为1和0进行均值计算,从而高效地得到了落入四分之一圆内的样本比例。
4.3 数值积分与自动微分
使用 QuadGK 包进行高精度的一维数值积分(例如计算高斯积分):
using QuadGK, ForwardDiff
f(x) = exp(-x^2)
val, err = quadgk(f, 0, Inf)(0.8862269254527579,8.595134596701424e−9)
借助 ForwardDiff 包,无需手动推导公式即可实现极高精度的自动微分(AD)求导:
g(x) = x^2 * sin(x)
ForwardDiff.derivative(g, 1.0)2.2232442754839328
计算多元函数的梯度(Gradient):
h(p) = (p[1] - 1)^2 + 2 * (p[2] + 1)^2
ForwardDiff.gradient(h, [0.0, 0.0])[−2.04.0]
数值积分与自动微分常用函数推荐:
| 方法 | 适合场景 |
|---|---|
quadgk | 一维定积分、半无穷区间积分 |
ForwardDiff.derivative | 单变量函数导数 |
ForwardDiff.gradient | 多参数模型梯度 |
ForwardDiff.hessian | Hessian 矩阵、二阶优化分析 |
4.4 快速傅里叶变换与信号分析
快速傅里叶变换(FFT)是信号处理的核心算法。以下展示如何对包含多个频率成分的合成信号进行频谱分析:
using FFTW, Statistics
fs = 1000.0 # 采样率 Hz
t = 0:1/fs:1-1/fs
signal = sin.(2 * pi * 50 .* t) .+ 0.4 .* sin.(2 * pi * 120 .* t)
Y = fft(signal .- mean(signal))
freq = (0:length(Y)-1) .* fs / length(Y)
amplitude = abs.(Y) ./ length(Y)
freq[1:10]
amplitude[1:10]0.01.02.03.04.05.06.07.08.09.0
2.1833537989234865e−171.0461770327316574e−161.2138234047567224e−161.360481461853514e−161.0850876450785432e−164.812248861135404e−176.827131084801217e−176.503387086741498e−173.1654616068460594e−173.000384822421584e−17
由于实数信号的频谱具有对称性,我们通常只需提取并绘制单边频谱:
n = length(signal)
half = 1:div(n, 2)
freq1 = freq[half]
amp1 = 2 .* amplitude[half]4.366707597846973e−172.0923540654633147e−162.427646809513445e−16⋮4.056118904078539e−16
该方法在实际科研中应用极广,非常适合用于分析实验采样信号中的主频成分、识别周期性噪声、提取调制频率以及进行频谱图的可视化展示。
4.5 常微分方程求解
Julia 拥有世界上最顶级的微分方程求解生态(DifferentialEquations.jl)。以下示例展示如何求解一个经典的二阶阻尼谐振子动力学方程:
using DifferentialEquations
function oscillator!(du, u, p, t)
γ, ω0 = p
du[1] = u[2]
du[2] = -2γ * u[2] - ω0^2 * u[1]
end
u0 = [1.0, 0.0]
tspan = (0.0, 10.0)
p = (0.15, 2 * pi)
prob = ODEProblem(oscillator!, u0, tspan, p)
sol = solve(prob, Tsit5(), saveat=0.01)t:0.00.10.2⋮10.0,u:1.00.99802870007989990.9921304462956577…0.223346831738658940.0−0.3939332777612858−0.7851342053038274…0.019358685410196863
核心求解参数与函数说明:
| 代码 | 含义 |
|---|---|
u[1] | 位移 |
u[2] | 速度 |
p | 模型参数 |
tspan | 积分时间范围 |
ODEProblem | 定义微分方程问题 |
solve | 数值求解 |
4.6 优化与参数估计
在科学研究和工程设计中,寻找函数极值与拟合实验参数是极常见的任务。以下展示如何使用 Optim 求解非线性最优化问题:
using Optim
rosenbrock(x) = (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2
result = optimize(rosenbrock, [-1.0, 2.0])
Optim.minimizer(result)
Optim.minimum(result)4.263526919513479e−10
在实验数据处理中,如果需要对非线性模型进行最小二乘曲线拟合,可以使用 LsqFit 包:
using LsqFit, Random
Random.seed!(1)
model(x, p) = p[1] .* exp.(-p[2] .* x) .+ p[3]
xdata = range(0, 5, length=50)
ydata = model(xdata, [2.0, 0.8, 0.2]) .+ 0.05 .* randn(length(xdata))
fit = curve_fit(model, xdata, ydata, [1.0, 1.0, 0.0])
fit.param1.99170487000817320.85178763651911050.22140759353567088
4.7 插值与重采样
当实验采集的数据点分布不均匀或存在缺失时,可以通过插值(Interpolation)算法将其重采样到均匀网格上,以便进行后续的对比、滤波或平滑绘图:
using Interpolations
x = 0:0.5:10
y = sin.(x) .+ 0.1 .* randn(length(x))
itp = linear_interpolation(x, y)
xnew = 0:0.05:10
ynew = itp.(xnew)0.023461705058095050.08111375874920228⋮−0.43760452921179077
5 数据表格与文件读写
在数据科学和实验分析中,高效地读取、处理和保存表格数据是必不可少的环节。Julia 提供了 DataFrames.jl 和 CSV.jl 来实现类似 Python Pandas 的高效数据流操作。
5.1 读取 CSV 数据
从本地读取 CSV 文件并将其转换为 DataFrame 格式:
using Pkg
Pkg.add(["CSV", "DataFrames"])
using CSV, DataFrames
df = CSV.read("data.csv", DataFrame)
first(df, 5)5.2 数据筛选与新增列
对 DataFrame 进行列操作与条件筛选。例如,假设表格中包含 time 和 signal 两列,我们希望对信号进行去均值中心化,并筛选出特定时间段的数据:
df.signal_centered = df.signal .- mean(df.signal)
df2 = filter(row -> row.time >= 0.0 && row.time <= 1.0, df)5.3 分组统计
对数据进行分组聚合统计。例如,假设表格中包含分类列 group 和数值列 value,我们希望计算各组的均值与标准差:
combine(groupby(df, :group), :value => mean, :value => std)5.4 保存结果
将处理后的 DataFrame 重新保存为 CSV 文件:
CSV.write("result.csv", df)DataFrame 常用操作速查表:
| 需求 | 推荐做法 |
|---|---|
| 只看前几行 | first(df, 5) |
| 查看列名 | names(df) |
| 新增一列 | df.newcol = ... |
| 条件筛选 | filter(row -> 条件, df) |
| 分组统计 | groupby + combine |
| 保存表格 | CSV.write |
6 综合案例:从模拟数据到拟合与绘图
为了帮助您融会贯通,本节提供了一个完整的科研实战案例:从零生成带有高斯噪声的指数衰减模拟实验数据,使用非线性最小二乘法拟合物理模型参数,并最终绘制出精美的实验测量点与拟合曲线对比图。
using Pkg
Pkg.add(["Plots", "LsqFit", "Random", "Statistics"])
using Plots, LsqFit, Random, Statistics
Random.seed!(2026)
# 1. 生成模拟数据
model(x, p) = p[1] .* exp.(-p[2] .* x) .+ p[3]
xdata = range(0, 5, length=60)
true_p = [2.0, 0.75, 0.2]
y_clean = model(xdata, true_p)
ydata = y_clean .+ 0.08 .* randn(length(xdata))
# 2. 非线性最小二乘拟合
p0 = [1.0, 1.0, 0.0]
fit = curve_fit(model, xdata, ydata, p0)
p_est = fit.param
# 3. 计算拟合曲线
xfit = range(0, 5, length=300)
yfit = model(xfit, p_est)
# 4. 绘图
scatter(xdata, ydata,
label="data",
xlabel="time",
ylabel="signal",
title="Exponential Decay Fitting")
plot!(xfit, yfit,
linewidth=2,
label="fit")
在会话中直接输出拟合得到的模型参数:
p_est1.97362509357491530.77963122134743460.22283071386655806
这种一体化的编写方式非常适合撰写学术论文、实验报告或教学讲义:在同一个交互式会话中,数据生成、物理模型定义、非线性拟合、可视化展示以及定量结果输出一气呵成,极大地提升了科研工作的可复现性与排版效率。