---
title: Liii STEM Julia 插件教程
description: Liii STEM Julia 插件完整教程，涵盖配置与加载、基础数值计算、符号计算、科学绘图、科学计算、数据表格等场景。
keywords: Liii STEM, Julia, 插件, 教程, 符号计算, 科学绘图, 科学计算, 数据分析
---

> ## Documentation Index
> Fetch the complete documentation index at: https://liiistem.cn/docs/llms.txt
> Use this file to discover all available pages before exploring further.


# Julia 会话插件

在 Liii STEM 中，您也可以通过插入 **Julia 会话** 的方式运行想要的 Julia 代码。

## 0 配置与加载

使用 Julia 会话前，需要确保在本地计算机安装了 Julia，并根据需要安装常用的科研与绘图工具包。

### 0.1 环境配置与包管理

**第一步：安装 Julia**

| 操作系统    | 推荐安装方式                                                              |
| :---------- | :------------------------------------------------------------------------ |
| **Windows** | 从 [Julia 官网](https://julialang.org/) 下载标准安装包并默认安装。        |
| **macOS**   | 推荐使用 Homebrew 命令行安装：`brew install julia`。                      |
| **Linux**   | 使用发行版内置包管理器（如 `apt/pacman`），或从官网下载预编译的二进制包。 |

安装完成后，在系统终端中运行以下命令验证：

```bash
julia --version
```

若终端返回类似 `julia version 1.12.6` 的版本号，说明 Julia 已安装成功且其可执行文件已加入系统环境变量 `PATH`。

**第二步：安装常用科研与绘图包**

Julia 提供了极为好用的内置包管理器 `Pkg`。你可以直接在系统终端运行 `julia` 进入 REPL（交互式环境）进行安装，或者稍后在 Liii STEM 的 Julia 会话代码块中执行以下安装命令：

```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 及多语言计算环境》](./guide-computing-environments)。

## 1 Julia 基础指南

### 1.1 基础数值计算

Julia 具备极高的数值计算性能，可以直接作为高精度科学计算器使用：

```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 中，向量与矩阵的声明与书写方式非常贴近直观的数学表达式：

```julia
v = [1, 2, 3, 4]
A = [1 2; 3 4]
```

$$
\left[ \begin{array}{c}
  3\\
  7
\end{array} \right]
$$

Julia 引入了优雅的**广播机制（Broadcasting）**，在运算符或函数名后添加点号 `.` 即可实现逐元素（Element-wise）运算。这在对数组中的每个元素应用函数时非常高效：

```julia
x = range(0, 0.1 * pi, length=5)
y = sin.(x)
```

$$
\left[ \begin{array}{c}
  0.0\\
  0.07845909572784494\\
  0.15643446504023087\\
  0.2334453638559054\\
  0.3090169943749474
\end{array} \right]
$$

在上述代码中，`sin.(x)` 会对向量 `x` 中的每一个元素分别计算正弦值。如果直接调用 `sin(x)`，Julia 会尝试将整个向量作为一个整体对象传入，这通常会导致类型错误或不符合预期的矩阵函数运算。因此，在处理数组时，请务必注意点号 `.` 的使用。

## 2 符号计算

Liii STEM 完美支持 Julia 的符号计算输出。借助 `Symbolics`、`Latexify` 与 `LaTeXStrings` 等强大的符号计算与排版工具包，您可以在会话中直接生成排版精美、适合学术论文和教学文档展示的 LaTeX 数学表达式。

### 2.1 基础符号表达式

在符号计算中，我们首先需要定义符号变量，并构建代数表达式：

```julia
using Symbolics, Latexify, LaTeXStrings

@variables x y a b c
expr = (a + b)^2 / c + sin(x)^2 + cos(x)^2
simplify(expr)
```

$$ \frac{c + (a + b)^2}{c} $$

### 2.2 展开、化简与替换

符号表达式的展开与化简是代数推导的常用操作。此外，我们还可以使用 `substitute` 进行变量数值替换：

```julia
@variables x y
expr = (x + y)^3
expand(expr)
```

$$x^3 + 3 ~ x^2 ~ y + 3 ~ y^2 ~ x + y^3$$

```julia
expr2 = (x^2 - y^2) / (x - y)
simplify(expr2)
```

$$x + y$$

进行变量数值替换：

```julia
substitute(x^2 + 2 * x + 1, Dict(x => 3))
```

$$16$$

### 2.3 微分与方程表达

在符号计算中，求导与微分方程的构建同样非常直观。我们可以定义微分算子并对表达式求导：

```julia
@variables x
D = Differential(x)
expr = sin(x) * x^2
expand_derivatives(D(expr))
```

$$2 ~ x ~ \sin (x) + x^2 ~ \cos (x)$$

计算二阶导数：

```julia
expand_derivatives(D(D(expr)))
```

$$2 ~ \sin (x) + 4 ~ x ~ \cos (x) - x^2 ~ \sin (x)$$

### 2.4 矩阵与 LaTeX 渲染

除了标量代数式，`Symbolics` 同样支持符号矩阵的运算与 LaTeX 格式化渲染：

```julia
@variables a b c d
M = [a b; c d]
latexify(M)
```

$$
\left[ \begin{array}{cc}
  a & b\\
  c & d
\end{array} \right]
$$

直接渲染原生 LaTeX 字符串：

```julia
L"\int_{0}^{\infty} e^{-x^2}\,dx = \frac{\sqrt{\pi}}{2}"
```

$$\int_0^{\infty} e^{- x^2}  \hspace{0.17em} d x = \frac{\sqrt{\pi}}{2}$$

这些功能非常适合在学术报告和正文中直观展示复杂的公式推导、矩阵形式、微分方程以及积分恒等式。

## 3 科学绘图

Julia 拥有极其丰富的可视化生态，其中 `Plots.jl` 是最常用的绘图框架。通过 `Plots.jl`，您可以在会话中直接生成二维曲线、散点图、误差棒、热图、等高线图以及三维曲面图等。所有绘图结果都会自动、无缝地嵌入到 Liii STEM 文档中，非常适合制作高质量的实验报告、学术论文和教学教程。

> **温馨提示**：如果首次加载绘图包时速度较慢，这是因为 Julia 正在后台进行预编译，后续调用将会非常迅速。

### 3.1 基础函数图像

绘制一条标准的一维正弦波曲线：

```julia
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)
```

![sine](../images/julia/julia-sine.png)

### 3.2 多曲线对比

在同一张图表中绘制多条曲线进行对比，是学术制图的常见需求：

```julia
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")
```

![dosc](../images/julia/julia-dosc.png)

核心绘图命令与修饰符说明：

| 命令       | 作用                                                                  |
| :--------- | :-------------------------------------------------------------------- |
| `plot`     | 创建并绘制一张新图表                                                  |
| `plot!`    | 在当前活动图表上追加绘制曲线或修改图表属性（带 `!` 的方法会修改原图） |
| `scatter`  | 创建并绘制一张新散点图                                                |
| `scatter!` | 在当前活动图表上追加绘制散点                                          |

### 3.3 散点图与误差棒

在实验数据可视化中，带误差棒的散点图是展示测量不确定度的标准方式：

```julia
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")
```

![meb](../images/julia/julia-meb.png)

### 3.4 热图与等高线图

热图（Heatmap）非常适合展示二维参数扫描结果，例如频率—功率分布、空间物理场分布或相图：

```julia
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")
```

![heatmp](../images/julia/julia-heatmp.png)

对应的等高线图（Contour Plot）绘制：

```julia
contour(x, y, z,
    xlabel="x",
    ylabel="y",
    title="Contour Plot",
    levels=20)
```

![ctp](../images/julia/julia-ctp.png)

### 3.5 三维曲面图

利用 `surface` 命令可以非常直观地展示三维空间中的函数曲面：

```julia
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")
```

![suf](../images/julia/julia-suf.png)

### 3.6 频谱图示例

结合快速傅里叶变换包 `FFTW` 与 `Plots`，可以快速对信号进行频域分析并绘制频谱图：

```julia
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))
```

![ssfs](../images/julia/julia-ssfs.png)

### 3.7 微分方程解的绘图

在科学计算中，我们经常需要将微分方程的数值解进行可视化。以下展示经典的 Lotka-Volterra（捕食者-猎物）模型的求解与绘图：

```julia
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")
```

![lvm](../images/julia/julia-lvm.png)

绘制对应的相空间轨迹图（Phase Portrait）：

```julia
U = hcat(sol.u...)
plot(U[1, :], U[2, :],
    xlabel="prey",
    ylabel="predator",
    label="phase trajectory",
    title="Phase Portrait")
```

![pp](../images/julia/julia-pp.png)

### 3.8 保存图片

在会话中，您可以直接将绘制的图表保存为本地文件，以便在其他地方使用：

```julia
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 内置的线性代数标准库：

```julia
using LinearAlgebra
```

求解经典的线性方程组 $Ax = b$：

```julia
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)
```

计算矩阵的特征值与特征向量：

```julia
E = eigen(A)
E.values
E.vectors
```

对矩阵进行奇异值分解（SVD）：

```julia
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 提供了强大的随机数生成器与统计分析工具，非常适合进行蒙特卡洛模拟和数据描述性统计：

```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])
```

$$
\left[ \begin{array}{c}
  - 0.1497406172348643\\
  0.5557904511697824\\
  1.200019184175632
\end{array} \right]
$$

计算带权重的加权平均数：

```julia
weights = rand(1000)
weighted_mean = mean(data, Weights(weights))
```

$$0.526465701364362$$

使用蒙特卡洛（Monte Carlo）方法估算圆周率 $\pi$ 的值：

```julia
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` 包进行高精度的一维数值积分（例如计算高斯积分）：

```julia
using QuadGK, ForwardDiff
f(x) = exp(-x^2)
val, err = quadgk(f, 0, Inf)
```

$$ (0.8862269254527579, 8.595134596701424e-9) $$

借助 `ForwardDiff` 包，无需手动推导公式即可实现极高精度的自动微分（AD）求导：

```julia
g(x) = x^2 * sin(x)
ForwardDiff.derivative(g, 1.0)
```

$$ 2.2232442754839328 $$

计算多元函数的梯度（Gradient）：

```julia
h(p) = (p[1] - 1)^2 + 2 * (p[2] + 1)^2
ForwardDiff.gradient(h, [0.0, 0.0])
```

$$
\left[ \begin{array}{c}
  - 2.0\\
  4.0
\end{array} \right]
$$

数值积分与自动微分常用函数推荐：

| 方法                     | 适合场景                   |
| ------------------------ | -------------------------- |
| `quadgk`                 | 一维定积分、半无穷区间积分 |
| `ForwardDiff.derivative` | 单变量函数导数             |
| `ForwardDiff.gradient`   | 多参数模型梯度             |
| `ForwardDiff.hessian`    | Hessian 矩阵、二阶优化分析 |

### 4.4 快速傅里叶变换与信号分析

快速傅里叶变换（FFT）是信号处理的核心算法。以下展示如何对包含多个频率成分的合成信号进行频谱分析：

```julia
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]
```

$$
\left[ \begin{array}{c}
  0.0\\
  1.0\\
  2.0\\
  3.0\\
  4.0\\
  5.0\\
  6.0\\
  7.0\\
  8.0\\
  9.0
\end{array} \right]
$$

$$
\left[ \begin{array}{c}
  2.1833537989234865 e - 17\\
  1.0461770327316574 e - 16\\
  1.2138234047567224 e - 16\\
  1.360481461853514 e - 16\\
  1.0850876450785432 e - 16\\
  4.812248861135404 e - 17\\
  6.827131084801217 e - 17\\
  6.503387086741498 e - 17\\
  3.1654616068460594 e - 17\\
  3.000384822421584 e - 17
\end{array} \right]
$$

由于实数信号的频谱具有对称性，我们通常只需提取并绘制单边频谱：

```julia
n = length(signal)
half = 1:div(n, 2)
freq1 = freq[half]
amp1 = 2 .* amplitude[half]
```

$$
\left[ \begin{array}{c}
  4.366707597846973 e - 17\\
  2.0923540654633147 e - 16\\
  2.427646809513445 e - 16\\
  \vdots\\
  4.056118904078539 e - 16
\end{array} \right]
$$

该方法在实际科研中应用极广，非常适合用于分析实验采样信号中的主频成分、识别周期性噪声、提取调制频率以及进行频谱图的可视化展示。

### 4.5 常微分方程求解

Julia 拥有世界上最顶级的微分方程求解生态（`DifferentialEquations.jl`）。以下示例展示如何求解一个经典的二阶阻尼谐振子动力学方程：

```julia
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 : \left[\begin{array}{c}
  0.0\\
  0.1\\
  0.2\\
  \vdots\\
  10.0
\end{array}\right], u : \left[\begin{array}{cc}
  1.0 & 0.0\\
  0.9980287000798999 & - 0.3939332777612858\\
  0.9921304462956577 & - 0.7851342053038274\\
  \ldots & \ldots\\
  0.22334683173865894 & 0.019358685410196863
\end{array}\right]
$$

核心求解参数与函数说明：

| 代码         | 含义             |
| ------------ | ---------------- |
| `u[1]`       | 位移             |
| `u[2]`       | 速度             |
| `p`          | 模型参数         |
| `tspan`      | 积分时间范围     |
| `ODEProblem` | 定义微分方程问题 |
| `solve`      | 数值求解         |

### 4.6 优化与参数估计

在科学研究和工程设计中，寻找函数极值与拟合实验参数是极常见的任务。以下展示如何使用 `Optim` 求解非线性最优化问题：

```julia
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` 包：

```julia
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.param
```

$$
\left[ \begin{array}{c}
  1.9917048700081732\\
  0.8517876365191105\\
  0.22140759353567088
\end{array} \right]
$$

### 4.7 插值与重采样

当实验采集的数据点分布不均匀或存在缺失时，可以通过插值（Interpolation）算法将其重采样到均匀网格上，以便进行后续的对比、滤波或平滑绘图：

```julia
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)
```

$$
\left[ \begin{array}{c}
  0.02346170505809505\\
  0.08111375874920228\\
  \vdots\\
  - 0.43760452921179077
\end{array} \right]
$$

## 5 数据表格与文件读写

在数据科学和实验分析中，高效地读取、处理和保存表格数据是必不可少的环节。Julia 提供了 `DataFrames.jl` 和 `CSV.jl` 来实现类似 Python Pandas 的高效数据流操作。

### 5.1 读取 CSV 数据

从本地读取 CSV 文件并将其转换为 DataFrame 格式：

```julia
using Pkg
Pkg.add(["CSV", "DataFrames"])

using CSV, DataFrames

df = CSV.read("data.csv", DataFrame)
first(df, 5)
```

### 5.2 数据筛选与新增列

对 DataFrame 进行列操作与条件筛选。例如，假设表格中包含 `time` 和 `signal` 两列，我们希望对信号进行去均值中心化，并筛选出特定时间段的数据：

```julia
df.signal_centered = df.signal .- mean(df.signal)
df2 = filter(row -> row.time >= 0.0 && row.time <= 1.0, df)
```

### 5.3 分组统计

对数据进行分组聚合统计。例如，假设表格中包含分类列 `group` 和数值列 `value`，我们希望计算各组的均值与标准差：

```julia
combine(groupby(df, :group), :value => mean, :value => std)
```

### 5.4 保存结果

将处理后的 DataFrame 重新保存为 CSV 文件：

```julia
CSV.write("result.csv", df)
```

DataFrame 常用操作速查表：

| 需求       | 推荐做法                  |
| ---------- | ------------------------- |
| 只看前几行 | `first(df, 5)`            |
| 查看列名   | `names(df)`               |
| 新增一列   | `df.newcol = ...`         |
| 条件筛选   | `filter(row -> 条件, df)` |
| 分组统计   | `groupby` + `combine`     |
| 保存表格   | `CSV.write`               |

## 6 综合案例：从模拟数据到拟合与绘图

为了帮助您融会贯通，本节提供了一个完整的科研实战案例：从零生成带有高斯噪声的指数衰减模拟实验数据，使用非线性最小二乘法拟合物理模型参数，并最终绘制出精美的实验测量点与拟合曲线对比图。

```julia
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")
```

![edf](../images/julia/julia-edf.png)

在会话中直接输出拟合得到的模型参数：

```julia
p_est
```

$$
\left[ \begin{array}{c}
  1.9736250935749153\\
  0.7796312213474346\\
  0.22283071386655806
\end{array} \right]
$$

这种一体化的编写方式非常适合撰写学术论文、实验报告或教学讲义：在同一个交互式会话中，数据生成、物理模型定义、非线性拟合、可视化展示以及定量结果输出一气呵成，极大地提升了科研工作的可复现性与排版效率。
