Skip to content

Latest commit

 

History

History
83 lines (65 loc) · 4.67 KB

File metadata and controls

83 lines (65 loc) · 4.67 KB

MaxMath 规格

产品目标

MaxMath 是一款以 GNU Maxima 为符号计算内核、面向 Android 的离线高等代数计算 与函数绘图应用。设计目标是在不依赖服务器的前提下,提供结构化表单、自然数学输入、 可取消的复杂计算和适合移动端的结果展示。

用户能力

  • 矩阵:行列式、逆、转置、秩、迹、特征值与特征向量
  • 线性方程组:自然写法与高级原始 Maxima 输入
  • 多项式:因式分解、最大公因式、求根、展开与化简
  • 向量空间:内积、范数、Gram-Schmidt 正交化
  • 二次型:展开、特征值与符号差
  • 微积分:极限、任意阶导数、定积分与不定积分
  • 绘图:2D 多函数、3D 曲面、等高线,带坐标轴刻度与数值标签的触控交互
  • 结果:离线 LaTeX 渲染、纯文本/LaTeX 复制、PNG 保存与分享
  • 语言:中文、English、跟随系统

输入模型

parser 模块提供纯 Kotlin 的词法分析、递归下降解析和 AST。自然输入支持隐式乘法、 根号、分数、π/e、常用初等函数和分号分隔方程组。AST 可以:

  • 转换为 Maxima 表达式,供符号计算使用;
  • 转换为受限 NumPy 表达式,供 Matplotlib 使用;
  • 直接进行 Double 求值,供本地曲线与 OpenGL 网格采样使用。

高级用户可以在支持的表单中启用原始 Maxima 输入。原始模式会跳过部分自然输入验证, 但计算仍受引擎进程隔离、取消和超时控制。

执行架构

  • 轻量操作在 UI 进程执行:化简、展开、代值、单变量求导,以及部分不超过四阶的 矩阵操作。
  • 重量操作通过 Android Messenger 转发到 :engine 独立进程。该进程维护一个常驻的 Maxima 子进程:完成信号是 init.lisp 中 maxmath_done() 打印并 finish-output 刷新的哨兵,请求之间用 kill(all) 复位用户绑定,从而免去每个请求重新载入 ECL 映像的开销。取消或超时会终止该子进程,下一次请求重新拉起——只有哨兵 完整到达的子进程才会被复用,避免 Maxima 停在交互提问上时污染后续请求。
  • :engine 进程在最后一次请求后保留 60 秒空闲期再退出,否则每次请求都要重付 进程创建与 Python/Matplotlib 启动的代价。
  • 2D 绘图使用同一 AST 生成 NumPy 表达式,由 Maxima 探测零点/极值,再由 Chaquopy 内嵌的 Matplotlib Agg 后端输出 PNG。
  • 3D 曲面和等高线不经过 Maxima/Matplotlib:应用把 AST 编译成定长槽位的表达式树 (CompiledExpr),在本地逐点求值、构建网格并使用 OpenGL ES 渲染, 从而让拖动、缩放和旋转保持实时。
  • 手势进行中只更新矩阵,松手才决定是否重建网格:等高线把平移/缩放折算回数据范围 并按新范围重新采样,曲面则保持范围不变、按缩放提高网格密度(放大得到的是更多 细节,而不是被拉大的多边形)。两者都不惊动引擎,纯本地计算。
  • 曲面与等高线都画出数据边界的包围盒、刻度短线和数值标签。刻度算法与 2D 画布 共用同一份实现,因此同一个函数在两种模式下的刻度对得上;标签走 GL 字形图集 而不是 Compose 覆盖层,这样「保存 PNG」抓帧缓冲时数字也在图里。

计算请求使用 MathTask 密封类型建模,并通过 JSON 在进程间传递。每类操作拥有独立 数据结构,避免字符串操作名与自由格式 payload 发生漂移。

平台与构建约束

  • minSdk 26,targetSdk 36,compileSdk 36
  • JDK 17,Android Gradle Plugin 8.13.2,Kotlin 2.2.20
  • JNI 桥使用 C++17、CMake 3.22 和 NDK 27.2.12479018
  • 原生 Maxima/ECL 运行时当前只支持 arm64-v8a
  • 原生交叉编译脚本当前以 Linux x86_64 主机工具链为目标

Maxima/ECL 下载文件、构建目录和生成后的 app 运行时资产不纳入 Git;它们由 native/ 中的脚本在本地生成。普通源码检出可以执行解析器和 Android 单元测试,但完整设备计算 需要先打包原生引擎。

隐私与安全边界

  • Manifest 不声明 INTERNET 权限,应用不包含遥测或账号系统。
  • EngineService 不导出,并运行于应用私有的 :engine 进程。
  • 文件分享通过不可导出的 FileProvider 和临时 URI 权限完成。
  • 签名密钥、密码、SDK 路径和生成资产不得进入版本控制。

非目标与已知限制

  • 不提供云计算、账号同步或在线依赖回退。
  • 不保证任意 Maxima 原始输入都能在移动设备资源限制内完成。
  • 计算机代数和数值绘图结果不构成形式化证明。
  • x86_64 原生引擎流程尚未作为正式支持目标。