# 20.4 科研和专业计算工具

本节介绍 FreeBSD 系统上常用的科研与专业计算工具。这些工具涵盖文档管理、数学计算、绘图、编程、数据分析和模拟等多个领域，旨在支持学术研究和工程应用。

## Calibre 文档管理（EPUB、MOBI、AZW3 等格式）

本小节介绍 Calibre 文档管理软件的使用方法。Calibre 是一款功能强大的电子书管理工具，支持多种电子书格式的阅读、转换和组织。

Calibre 可以在多种文档格式之间进行转换，还支持自定义 CSS 样式。

### 安装 Calibre

使用 pkg 安装：

```sh
# pkg install calibre
```

使用 Ports 安装：

```sh
# cd /usr/ports/deskutils/calibre/
# make install clean
```

### 使用 Calibre

Calibre 的具体使用方法可参考以下图片。启动 Calibre 后，可以通过图形界面导入、转换和管理电子书。

![Calibre 界面](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-50596d99963316fe816a98a83df59a872cc4f668%2Fcalibre.png?alt=media)

## 代数学

本小节介绍 FreeBSD 基本系统内置的两个计算器工具。这两款工具可满足基本的数学计算需求，是命令行环境下进行数值运算的基础工具。bc 采用中缀表示法，dc 采用后缀表示法（逆波兰表示法）。

其源代码位于 FreeBSD 官方源代码存储库 <https://github.com/freebsd/freebsd-src/tree/main/contrib/bc>，可供研究与学习。用户可以通过 `man bc` 或 `man dc` 命令查看手册页以获取更多使用细节。

### bc（Basic Calculator）简单的计算器

bc 是一款采用中缀表示法的交互式计算器，支持基本算术运算和函数计算。

```sh
$ bc # 进入 bc 计算器
1+15 # 加法
16
sqrt(256) # 开方
16
5^3	 # 求立方
125
90/3 # 除法
30
10%4 # 求余数
2
quit # 退出程序
```

### dc（Desktop Calculator）桌面计算器

#### 后缀表示法（逆波兰表示法，Reverse Polish Notation，RPN）

本小节介绍后缀表示法的基本概念与应用。理解后缀表示法是使用 dc 计算器的基础。

我们从接触数学伊始，用的计算表达方式就是中缀表示法。例如，要计算 3 和 4 的和，写作 `3 + 4`，操作符处于操作数的中间，这是人类最习惯的数学表达式书写方式。

而在后缀表示法中，操作符置于操作数之后。如上式若改用后缀表示法，则写作 `3 4 +`。如果有多个操作符，操作符则置于第二个操作数的后面，所以常规中缀表示法的 `3 - 4 + 5` 在后缀表示法里写作 `3 4 - 5 +`。

后缀表示法更容易被计算机处理，并可利用堆栈结构减少内存访问，在编译器设计与计算器实现中被广泛采用。

有一例中缀表达式 `5 + ((1 + 2) * 4) - 3`，改为后缀表示法为 `5 1 2 + 4 * + 3 -`。

下表给出了从左至右求值的过程，堆栈栏给出了中间值，用于跟踪算法。

| 输入 | 操作   | 堆栈      | 注释                 |
| -- | ---- | ------- | ------------------ |
| 5  | 入栈   | 5       |                    |
| 1  | 入栈   | 5, 1    |                    |
| 2  | 入栈   | 5, 1, 2 |                    |
| +  | 加法运算 | 5, 3    | 1, 2 出栈，让结果 3 入栈   |
| 4  | 入栈   | 5, 3, 4 |                    |
| \* | 乘法运算 | 5, 12   | 3, 4 出栈，让结果 12 入栈  |
| +  | 加法运算 | 17      | 5, 12 出栈，让结果 17 入栈 |
| 3  | 入栈   | 17, 3   |                    |
| -  | 减法运算 | 14      | 17, 3 出栈，让结果 14 入栈 |

计算完成时，栈内只有一个操作数，这就是表达式的结果 `14`。

`dc` 是采用后缀表示法的开源计算器，传统上，采用中缀表示法的 `bc` 计算器程序是在 `dc` 之上实现的。

对于上述示例，我们可以使用 `dc` 进行计算，在终端中输入以下命令：

```sh
$ dc -e '5 1 2 + 4 * + 3 - p'
```

使用 dc 计算表达式 `5 + ((1 + 2) * 4) - 3`，并输出计算结果。

计算结果为 `14`。问题得解。

## 几何学

本小节介绍几何绘图软件的使用方法。

### 几何绘图软件 GeoGebra

GeoGebra 是一款动态几何软件，支持几何、代数和微积分的可视化与计算。

可使用 pkg 或 Ports 两种方式安装 GeoGebra。

使用 pkg 安装：

```sh
# pkg install geogebra
```

或者使用 Ports 安装：

```sh
# cd /usr/ports/math/geogebra/
# make install clean
```

![GeoGebra 界面](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-17d71c45183af97ec4de28068b69431c17e3ed26%2Fgeogebra.png?alt=media)

## 线性规划

本小节介绍线性规划软件 GLPK 的使用方法。线性规划是运筹学的重要分支，广泛应用于资源优化配置、生产计划制定与金融风险管理等领域。

### GLPK

GLPK（GNU Linear Programming Kit）是 GNU 项目开发的开源线性规划工具包，功能强大且免费。

使用 pkg 安装 GLPK：

```sh
# pkg install glpk
```

或者使用 Ports 安装 GLPK：

```sh
# cd /usr/ports/math/glpk/
# make install clean
```

在线性规划中，经常会使用单纯形法。在计算机应用层面，有多种软件可以辅助求解问题，例如可以在 Microsoft Excel 的“规划求解”功能中获得解答。

这里介绍免费的命令行线性规划软件包 GLPK 的使用方法。

下面给出一个示例，取自希利尔 F S, 希利尔 M S. 数据、模型与决策：基于电子表格的建模和案例研究方法\[M]. 李勇建, 徐芳超, 译. 第 6 版. 北京:机械工业出版社, 2021. ISBN 978-7-111-69627-8. 例题 2.4-1.

有一家银行计划放贷，预计最高投放 1200 万。下表显示了相关的数据。

| 贷款类型 | 利率    | 坏账率  |
| ---- | ----- | ---- |
| 个人   | 0.14  | 0.1  |
| 汽车   | 0.13  | 0.07 |
| 家用   | 0.12  | 0.03 |
| 农业   | 0.125 | 0.05 |
| 商业   | 0.1   | 0.02 |

坏账意味着不产生利润，本金也无法收回。为了同其他商业机构竞争，农业贷款和商业贷款之和不少于全部贷款的 40%；为了振兴房地产业，个人贷款、家用贷款和汽车贷款三项总计中，个人贷款占比不少于 50%；银行坏账率最高允许为全部贷款的 4%。

求解银行能获得最大利润的分配方式。

下面逐步进行分析，设个人、汽车、家用、农业及商业贷款的贷款量分别为 x1、x2、x3、x4 和 x5。

利润 = 0.14 · 0.9 x1 + 0.13 · 0.93 x2 + 0.12 · 0.97 x3 + 0.125 · 0.95 x4 + 0.1 · 0.98 x5

本金损失 = 0.1 x1 + 0.07 x2 + 0.03 x3 + 0.05 x4 + 0.02 x5

由此得到目标函数：max z = 利润 − 本金损失。

接下来，读者可根据题意找出约束条件。

由以上目标函数和约束条件，我们可以给出以下数学模型：

```
max z = 0.026 x1 + 0.0509 x2 + 0.0864 x3 + 0.06875 x4 + 0.078 x5

s.t. x1 + x2 + x3 + x4 + x5 <= 1200,
    x4 + x5 <= 0.4 (x1 + x2 + x3 + x4 + x5),
    x3 >= 0.5 (x1 + x2 + x3),
    0.1 x1 + 0.07 x2 + 0.03 x3 + 0.05 x4 + 0.02 x5 <= 0.04 (x1 + x2 + x3 + x4 + x5),
    xi >= 0 (i = 1, 2, 3, 4, 5)
```

新建一个文本文件（命名为 `example`），输入：

```
var x1 >= 0;
var x2 >= 0;
var x3 >= 0;
var x4 >= 0;
var x5 >= 0;

maximize z: 0.026*x1 + 0.0509*x2 + 0.0864*x3 + 0.06875*x4 + 0.078*x5;
s.t. C1: x1 + x2 + x3 + x4 + x5 <= 1200;
s.t. C2: x4 + x5 <= 0.4*(x1 + x2 + x3 + x4 + x5);
s.t. C3: x3 >= 0.5*(x1 + x2 + x3);
s.t. C4: 0.1*x1 + 0.07*x2 + 0.03*x3 + 0.05*x4 + 0.02*x5 <= 0.04*(x1 + x2 + x3 + x4 + x5);
end;
```

保存文件后，在终端中输入以下命令。

使用 GLPK 求解模型文件 `example`，并将结果输出到 `example.out`：

```sh
$ glpsol -m example -o example.out
```

查看 **example.out** 文件内容：

```sh
$ cat example.out
Problem:    example
Rows:       5
Columns:    5
Non-zeros:  23
Status:     OPTIMAL
Objective:  z = 436.608 (MAXimum)

   No.   Row name   St   Activity     Lower bound   Upper bound    Marginal
------ ------------ -- ------------- ------------- ------------- -------------
     1 z            B        436.608
     2 C1           NU          1200                        1200       0.36384
     3 C2           NU             0                          -0        0.6936
     4 C3           B            360            -0
     5 C4           B          -16.8                          -0

   No. Column name  St   Activity     Lower bound   Upper bound    Marginal
------ ------------ -- ------------- ------------- ------------- -------------
     1 x1           NL             0             0                     -0.0604
     2 x2           NL             0             0                     -0.0355
     3 x3           B            720             0
     4 x4           NL             0             0                    -0.71125
     5 x5           B            480             0

……省略一部分……
```

可查看解答值为：`x3 = 720`，`x5 = 480`，其余各项值为 `0`。

## 物理和化学

本小节介绍物理和化学领域的相关工具。这些工具可辅助学习和研究工作。

### 元素周期表 `GPeriodic`

GPeriodic 是一款元素周期表查看软件，提供元素的基本信息和物理化学性质。

可使用 pkg 或 Ports 两种方式安装 GPeriodic。

使用 pkg 安装：

```sh
# pkg install gperiodic
```

或者使用 Ports 安装：

```sh
# cd /usr/ports/biology/gperiodic/
# make install clean
```

![GPeriodic 元素周期表](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-4a985f0a6e78a6ed1eed427f09897801da164ca9%2Fgperiodic.png?alt=media)

## 天文地理

本小节介绍天文和地理领域的相关工具。天文软件可帮助观测星空，地理软件可查看地图信息。

### 星图软件 Stellarium

Stellarium 是一款开源的天文馆软件，可模拟真实的星空观测。

使用 pkg 安装：

```sh
# pkg install stellarium
```

或者使用 Ports 安装：

```sh
# cd /usr/ports/astro/stellarium/
# make install clean
```

![Stellarium 界面](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-ec92bd4ec3fa45171971e44efbf30c7298be2569%2Fstellarium1.png?alt=media)

![Stellarium 星图](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-de4eaee429947b3c0ccd2663abf76f2161f74517%2Fstellarium.png?alt=media)

> **技巧**
>
> 默认会进入全屏模式，按 **F11** 可退出全屏模式。

### GNOME 地图

GNOME 地图是一款地图查看软件，提供地图浏览和位置搜索功能。

使用 pkg 安装：

```sh
# pkg install gnome-maps
```

或者使用 Ports 安装：

```sh
# cd /usr/ports/deskutils/gnome-maps/
# make install clean
```

![GNOME 地图](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-2eafff2e2752631a41b54f0a904f2a342325c2f7%2Fgnome-maps.png?alt=media)

地图数据整体较新，但无法显示街道的详细信息。

## 艺术

本小节介绍艺术创作领域的相关工具。包括音乐创作、三维建模、数字绘画等工具。

### 音乐

#### MIDI 编曲软件 `LMMS`

LMMS（Linux MultiMedia Studio）是一款数字音频工作站软件，用于音乐创作和 MIDI 编曲。

使用 pkg 安装：

```sh
# pkg install lmms
```

或使用 Ports 安装：

```sh
# cd /usr/ports/audio/lmms/
# make install clean
```

软件支持中文，设置后需要重启才能使用中文。

![LMMS 界面](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-6812e691dd9cc09947a47d20bd0b4e0adf204aa6%2Flmms.png?alt=media)

#### 制谱软件 `MuseScore`

MuseScore 是一款开源的音乐制谱软件，支持乐谱创作、编辑和播放。

可使用 pkg 或 Ports 两种方式安装 MuseScore。

使用 pkg 安装：

```sh
# pkg install musescore
```

或者使用 Ports 安装：

```sh
# cd /usr/ports/audio/musescore/
# make install clean
```

![MuseScore 界面](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-5f6cf892b0be53e98a54f77051511676779ee5c8%2Fmusescore.png?alt=media)

### 三维图像

#### 3D 建模 `Blender`

Blender 是一款开源的 3D 建模和动画制作软件，支持建模、渲染、动画等功能。

使用 pkg 安装：

```sh
# pkg install blender
```

或者使用 Ports 安装：

```sh
# cd /usr/ports/graphics/blender/
# make install clean
```

软件支持简体中文。若无法直接显示简体中文，可先切换为繁体中文，再切换回简体中文。

![Blender 界面](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-0b4045256887b22f7f4ed6618a53487b3b137fc2%2Fblender.png?alt=media)

### 绘画

#### Krita

Krita 是一款开源的数字绘画软件，专为插画师和概念艺术家设计。

使用 pkg 安装：

```sh
# pkg install krita
```

或者使用 Ports 安装：

```sh
# cd /usr/ports/graphics/krita/
# make install clean
```

![Krita 界面](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-f51dce86761503e9b99a60a02c32babaea7ecd20%2Fkrita.png?alt=media)

## 工具与软件

本小节介绍其他相关工具与软件。科学计算软件可辅助数学和工程问题的求解。

### 科学计算软件 GNU Octave

GNU Octave 是一款开源的科学计算软件，兼容 MATLAB 语言，用于数值计算和数据可视化。

使用 pkg 安装：

```sh
# pkg install octave
```

或者使用 Ports 安装：

```sh
# cd /usr/ports/math/octave/
# make install clean
```

## 运筹学

本小节介绍运筹学相关工具。计算机代数系统可进行符号计算和数值分析，是数学研究与工程计算的重要辅助工具。

### 计算机代数系统 wxMaxima

wxMaxima 是 Maxima 计算机代数系统的图形用户界面，提供了直观的交互环境与强大的数学计算能力。

使用 pkg 安装：

```sh
# pkg install wxmaxima
```

或使用 Ports 安装：

```sh
# cd /usr/ports/math/wxmaxima/
# make install clean
```

上一节我们使用 GLPK 求解线性规划问题，本节我们使用性能更强大的 wxMaxima 来解决问题，该系统不仅可以进行数值计算，还支持符号运算与公式推导。以下代码仅供参考，如果想深入了解，可查看 [官方文档](https://maxima.sourceforge.io/documentation.html)，该文档涵盖 Maxima 计算机代数系统的符号计算、数值分析与公式推导功能，是研究与学习的权威参考资料。

```
load("simplex")$
maximize_lp(0.026 * x1 + 0.0509 * x2 + 0.0864 * x3 + 0.06875 * x4 + 0.078 * x5,
[x1 + x2 + x3 + x4 + x5 <= 1200,
x4 + x5 <= 0.4 * (x1 + x2 + x3 + x4 + x5),
x3 >= 0.5 * (x1 + x2 + x3),
0.1 * x1 + 0.07 * x2 + 0.03 * x3 + 0.05 * x4 + 0.02 * x5 <= 0.04 * (x1 + x2 + x3 + x4 + x5)]),
epsilon_lp = 0, nonnegative_lp = true;
```

![wxMaxima 界面](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-a51b188f1bb19d02491cbe17a02bd377f4213ff9%2Fwxmaxima.png?alt=media)

在界面中点击红框标识的位置即可执行指令，软件给出的解答为：`[436.608,[x5=480.0,x4=0,x3=720.0,x2=0,x1=0]]`，可见该结果与 GLPK 求得的解一致。

## 课后习题

1. 根据 FreeBSD 基本系统中 bc 或 dc 的源代码，构建其独立可执行版本。
2. 移植 MATLAB 到 FreeBSD Ports。
